MicroPython Skill Builders — #6 Датчики температуры и влажности
Добро пожаловать в очередной урок серии MicroPython Skill Builders от Тони Гудью, цель которой — улучшить ваши навыки программирования на MicroPython, знакомя вас с новыми компонентами и техниками кодирования — с использованием Raspberry Pi Pico!
В этом уроке будет показано применение датчиков температуры и влажности вместе с MicroPython на Raspberry Pi Pico, чтобы получать удобные показания для отображения в ваших проектах.
Не успели прочитать предыдущие уроки? Загляните в раздел с предыдущими эпизодами серии.
Что вам понадобится
Предполагается, что Thonny уже установлен на вашем компьютере, а Raspberry Pi Pico настроен с актуальной прошивкой MicroPython (UF2). Если нет — ознакомьтесь с руководством по началу работы с Raspberry Pi Pico, где это подробно описано.
Также предполагается, что вы прочли или прошли предыдущие уроки серии (ссылка выше, если нет).
Вам понадобится:
Raspberry Pi Pico с контактными штырьками (header pins)
Беспаечная макетная плата (полного размера)
Кабель Micro-USB (для питания и программирования Pico)
Перемычки (jumper wires) (папа-папа и папа-мама)
Опционально — резистор (при использовании немонтированных датчиков; подробнее — ниже)
Варианты датчиков
Набор сенсоров Waveshare содержит датчик DHT11 на удобной плате с коннекторами, но его также можно приобрести как отдельный компонент.
DHT22 очень похож, но немного точнее; он доступен в монтированном и немонтированном вариантах. Монтированные версии имеют удобный индикаторный светодиод питания.
Монтированные версии проще в использовании, так как уже включают необходимый дополнительный резистор на плате.
Распиновка DHT11/DHT22
Монтированные датчики
Монтированные платы имеют три контакта:
DOUT — подключается к любому выводу GPIO. Мы будем использовать GP0
GND — подключается к шине GND
VCC — подключается к шине 3,3 В
Немонтированные датчики
Немонтированные датчики имеют четыре вывода и требуют резистор 4,7 кОм — 10 кОм между двумя контактами. Распиновка одинакова для DHT11.
Сверху вниз:
GND — подключается к шине GND
NC — не подключается
DATA — любой цифровой вывод, мы будем использовать GP0
VCC — подключается к шине 3,3 В
Резистор используется для соединения VCC и DATA на макетной плате, как показано ниже:
Программное обеспечение MicroPython для DHT11/DHT22
Очень удобно, что MicroPython уже включает код для работы с этими датчиками в прошивке UF2 для Raspberry Pi Pico. Просмотреть все встроенные процедуры можно с помощью быстрой команды.
Подключите Pico к компьютеру, запустите Thonny и введите в окне Shell в строке приглашения >>> команду help („modules“).
Вы должны увидеть вывод, похожий на следующий:
MicroPython v1.19.1 on 2022-06-18; Raspberry Pi Pico with RP2040
Type "help()" for more information.
>>> help('modules')
__main__ framebuf uasyncio/funcs ujson
_boot gc uasyncio/lock umachine
_boot_fat math uasyncio/stream uos
_onewire micropython ubinascii urandom
_rp2 neopixel ucollections ure
_thread onewire ucryptolib uselect
_uasyncio rp2 uctypes ustruct
builtins uarray uerrno usys
cmath uasyncio/__init__ uhashlib utime
dht uasyncio/core uheapq uzlib
ds18x20 uasyncio/event uio
Plus any modules on the filesystem
>>>
Эти датчики используют библиотеку dht из первого столбца.
Вот код для DHT22:
# Test DHT22 Temperature and Humidity Sensor
# dht library is built into MicroPython
# Needs 4.7K to 10K resistor between 3.3V and signal pin
# Pins VCC, Sig, NC, GND - View from front
from machine import Pin
from time import sleep
import dht
sensor = dht.DHT22(Pin(0))
while True:
try:
sleep(1)
# The DHT22 returns at most one measurement every 1s
sensor.measure()
# Retrieves measurements from the sensor
print(f"Temperature : {sensor.temperature():.1f}")
print(f"Humidity : {sensor.humidity():.1f}\n")
# Transmits the temperature to the terminal
except OSError as e:
print('Failed reception')
# If the pico does not receive the measurements from the sensor
Вот код для DHT11 — изменение только в названии устройства!
# Test DHT11 Temperature and Humidity Sensor
# dht library is built into MicroPython
from machine import Pin
from time import sleep
import dht
sensor = dht.DHT11(Pin(0))
while True:
try:
sleep(1)
# The DHT11 returns at most one measurement every 1s
sensor.measure()
# Retrieves measurements from the sensor
print(f"Temperature : {sensor.temperature():.1f}")
print(f"Humidity : {sensor.humidity():.1f}\n")
# Transmits the temperature to the terminal
except OSError as e:
print('Failed reception')
# If the pico does not receive the measurements from the sensor
Какой бы датчик вы ни выбрали, оба дают похожий вывод — простые и понятные показания:
>>> %Run -c $EDITOR_CONTENT
Temperature : 20.6
Humidity : 59.3
Temperature : 20.7
Humidity : 58.2
Temperature : 20.7
Humidity : 58.2
Temperature : 20.7
Humidity : 58.2
Temperature : 20.7
Humidity : 58.2
Это всё весьма просто и понятно — для начала мониторинга окружающей среды нужен минимальный объём кода.
Обратите внимание на задержку в одну секунду в цикле. Этим датчикам требуется не менее секунды между измерениями — чего более чем достаточно, поскольку в большинстве случаев ни температура, ни влажность не меняются очень быстро. Вы также можете сравнить получаемые показания температуры с надёжным альтернативным источником, чтобы понять, нужно ли применять поправочный коэффициент.
Стоит отметить, что эти датчики не предназначены для использования на открытом воздухе или в условиях очень высокой влажности.
Дополнительные ресурсы
Страницы вики Waveshare содержат технические описания датчиков, которые могут быть полезны:
DHT22 — техническое описание (PDF) (используется название AM2302)