ESP32-C3 и MicroPython измерване на температура с DS18B20

ESP32-C3 и MicroPython измерване на температура с DS18B20

В тази статия ще разгледаме как да измерим температурата с помощта на ESP32-C3 и температурния сензор DS18B20. Ще използваме програмния език MicroPython и ще разгледаме стъпка по стъпка кода, който прави възможно измерването и извеждането на температурни данни.

Необходими материали:

  • ESP32-C3 super mini.
  • DS18B20 температурен сензор
  • Pull-up резистор 4.7kΩ (между VCC и DQ пиновете на DS18B20)
  • Кабели за свързване

Свързване на хардуера

ESP32-C3 и MicroPython измерване на температура с  DS18B20 Схема

Свържете VCC на сензора DS18B20 към 3.3V на ESP32-C3, GND на сензора към GND на ESP32, а сигналният пин DQ на сензора към GPIO1 (или друг подходящ пин). Важно е да се постави pull-up резистор от 4.7kΩ между VCC и DQ пиновете, за да се гарантира стабилна комуникация по 1-Wire протокола.

Пълна спецификация на DS18B20. В нея може да видите пин-диаграмата на сензора.

DS18B20-datasheet

Код за ESP32 и MicroPython за изчитане на DS18B20

import onewire, ds18x20
from machine import Pin
from time import sleep, sleep_ms

ds18b20_pin = Pin(1)
ds18b20_sensor = ds18x20.DS18X20(onewire.OneWire(ds18b20_pin))

roms = ds18b20_sensor.scan()
print('Found DS devices: ', roms)

if len(roms) == 0:
    print("No DS18B20 devices found.")
else:
    while True:
        ds18b20_sensor.convert_temp()
        sleep_ms(750)  # Изчакване за конвертиране на температурата

        for rom in roms:
            # print('Device ROM:', rom)
            temp = round(ds18b20_sensor.read_temp(rom), 2)
            print('Temperature = ', temp, "*C")
        
        sleep(1)  # Интервал за четене на температурата

Стъпка по стъпка анализ на кода

1. Импортиране на нужните библиотеки
import onewire, ds18x20
from machine import Pin
from time import sleep, sleep_ms

Първите два реда зареждат библиотеките за управление на 1-Wire протокола и работа с DS18B20 сензора. Библиотеката onewire е нужна за комуникация по 1-Wire протокола, а ds18x20 предоставя методи за работа със сензора. machine.Pin се използва за управление на GPIO пиновете на ESP32, а time.sleep и sleep_ms служат за временно изчакване в милисекунди и секунди.

2. Дефиниране на пина и инициализация на сензора
ds18b20_pin = Pin(1)
ds18b20_sensor = ds18x20.DS18X20(onewire.OneWire(ds18b20_pin))

Тук се създава обект Pin, който задава GPIO пина (в случая GPIO1), към който е свързан сензорът DS18B20. След това сензорът се инициализира чрез ds18x20.DS18X20(), като комуникацията с него се осъществява по 1-Wire протокола, който е зададен чрез onewire.OneWire().

3. Откриване на свързаните DS18B20 устройства
roms = ds18b20_sensor.scan()
print('Found DS devices: ', roms)

Функцията scan() търси всички DS18B20 сензори, свързани към избрания пин. Всеки сензор се идентифицира чрез уникалния си ROM код, който се съхранява в списъка roms. Ако има свързани сензори, те ще бъдат отпечатани в конзолата.

4. Проверка за открити сензори
if len(roms) == 0:
    print("No DS18B20 devices found.")

Тази проверка гарантира, че има открит поне един сензор. Ако списъкът roms е празен, програмата отпечатва съобщение, че не са намерени устройства, и няма да продължи към измерване на температурата.

5. Основен цикъл за измерване на температурата
else:
    while True:
        ds18b20_sensor.convert_temp()
        sleep_ms(750)  # Изчакване за конвертиране на температурата

Ако са намерени сензори, програмата преминава към безкраен цикъл while True, в който се извършват измервания. Първата стъпка е да се стартира конвертиране на температурата чрез convert_temp(), след което се изчакват 750 милисекунди, за да може сензорът да завърши измерването.

6. Извеждане на температурата
        for rom in roms:
            # print('Device ROM:', rom)
            temp = round(ds18b20_sensor.read_temp(rom), 2)
            print('Temperature = ', temp, "*C")

В този цикъл за всеки сензор, идентифициран с ROM код, се чете текущата температура чрез read_temp(rom). Стойността на температурата се закръглява до два знака след десетичната запетая с round() за по-удобно показване. Накрая, температурата се отпечатва на екрана с текст “Temperature =”, следван от стойността в градуси Целзий (*C).

7. Изчакване между измерванията
        sleep(1)  # Интервал за четене на температурата

За да не се претоварва системата с непрекъснати измервания, добавяме пауза от 1 секунда между всяко четене на температурата. Това също позволява стабилно извеждане на данните в реално време.

Видео демонстрация на изчитане на DS18B20 с ESP32-C3 и MicroPython

Заключение

С този код може лесно да измерите температурата с помощта на ESP32-C3 и сензор DS18B20. Кодът сканира наличните сензори, чете техните уникални ROM кодове и извежда измерените температури. Ако имате повече от един DS18B20, системата автоматично ще обработи и покаже температурите на всички свързани устройства. Този проект е отлична основа за IoT приложения, свързани с мониторинг на температурата в реално време.

Това решение може да бъде разширено с функции за съхранение на данни, връзка към интернет за облачни услуги или интеграция с други сензори и устройства.