MicroPython Skill Builders — #5 Простые датчики

MicroPython Skill Builders — Простые датчики

Мы продолжаем серию MicroPython Skill Builders, цель которой — улучшить навыки программирования на MicroPython, знакомя вас с новыми компонентами и приёмами написания кода на базе Raspberry Pi Pico!

Здесь мы демонстрируем использование недорогих и простых в применении датчиков для проектов на MicroPython: сначала рассмотрим серию датчиков Waveshare, а затем — классический температурный датчик TMP36!

Пропустили предыдущие выпуски? Загляните в раздел руководств, чтобы наверстать упущенное.

Что вам потребуется

Предполагается, что у вас уже установлен Thonny на компьютере и настроен Raspberry Pi Pico с самой свежей прошивкой MicroPython (UF2). Если нет — обратитесь к руководству по началу работы с Raspberry Pi Pico, где всё описано подробно.

Также предполагается, что вы прочитали и/или выполнили предыдущие руководства серии (ссылка выше, если нет).

Вам потребуются:

  • Raspberry Pi Pico с контактными выводами (пинами)

  • Макетная плата полного размера

  • Кабель Micro-USB (для питания и программирования Pico)

  • Набор соединительных проводов «папа-мама» (можно взять смешанный набор)

  • Датчики — в этой статье рассматриваются все перечисленные ниже, так что выбирайте те, которые хотите попробовать. Многие из них также входят в набор датчиков Waveshare:

    • Датчик влажности почвы

    • Датчик уровня жидкости

    • Датчик наклона

    • Датчик звука

    • Инфракрасный датчик отражения

    • Датчик пламени

    • Датчик ультрафиолетового (УФ) излучения

    • Датчик Холла

    • Датчик газа

    • Лазерный датчик

  • Опционально:

    • Аналоговый датчик температуры TMP36

    • Датчик температуры DS18B20

Набор датчиков Waveshare

Использование датчиков Waveshare с Raspberry Pi Pico

Аналоговые и цифровые датчики

Список датчиков выше включает смесь аналоговых и цифровых датчиков. В чём разница?

  • Аналоговые датчики дают показания в широком диапазоне значений

  • Цифровые датчики, как правило, выдают HIGH или LOW (включено или выключено)

Рассмотрим, какие датчики из нашего списка являются аналоговыми, а какие — цифровыми:

Только цифровые датчики:

  • Лазерный

  • Наклона

Только аналоговые датчики:

  • Датчик влажности почвы

  • Датчик уровня жидкости

  • Датчик УФ-излучения

Цифровые и аналоговые датчики одновременно:

  • Пламени

  • Холла

  • Звука

  • Газа

  • Инфракрасный отражательный

Подключение датчиков Waveshare к Pico

Подключить эти датчики к Raspberry Pi Pico очень просто. Соедините контакты с помощью проводов-перемычек следующим образом:

  • VCC: пин 3.3V

  • GND: любой из пинов GND

  • DOUT: любой пин GPIO — мы используем GP22

  • AOUT: любой пин АЦП — мы используем ADC0 на GP26

Программа для датчиков Waveshare на Pico

Одна простая программа подходит для всех этих датчиков.

Подключите один из датчиков согласно описанию выше, скопируйте приведённый ниже код в Thonny и запустите программу.

На каждой плате датчика есть светодиод питания, сигнализирующий о подаче питания. Второй светодиод, обозначенный DAT, отражает цифровой выходной сигнал. Он загорается, когда цифровой выход уходит в низкий уровень, то есть в 0 вольт.

Программа работает 20 секунд — этого достаточно, чтобы вывести несколько показаний. Инструкция print выполняется достаточно медленно, поэтому строк может быть напечатано меньше, чем вы ожидали.

Далее вы найдёте советы по работе с различными датчиками.

# Works with the following Waveshare Sensors
# https://www.waveshare.com/wiki/Sensors_Pack
# Tilt, Laser - Digital only
# Liquid level, Moisture, UV - Analog only
# The rest are have both digital and analog output
# Hall Sensor (magnetic), Sound Sensor V2
# UV (Ultra Violet),Flame, Gas, Infared Reflective
# Infrared Reflective - line following

from machine import ADC, Pin
import utime
adc = ADC(0)                   # Set up ADC for analog input
d_in = machine.Pin(22, Pin.IN) # Set up a digital pin for input
led = Pin(25, Pin.OUT)         # Set up Pico' LED for output

def invert(zz):                # Inverts  1/0 TO 0/1
    return int(not zz)

def sensor():                  # Function to return Digital and Analog values from sensor
    analog = adc.read_u16()
    digital = d_in.value()
    return digital, analog

seconds = 20                    # Loop to run for 20 seconds
stop_time = utime.time() + seconds

while utime.time() < stop_time:
    d,a = sensor()            # Get values from sensor
#    d = invert(d)
    led.value(d)              # Set LED
    print(d,a)                # Display the current values
    utime.sleep(0.2)          # Short delay

Советы

  • Датчик Холла требует, чтобы небольшой магнит поднесли очень близко к нему — только тогда что-то произойдёт

  • Датчик уровня жидкости нужно опустить в стакан с водой и двигать вверх-вниз

  • Датчик влажности почвы нужно воткнуть в сухую землю — он реагирует по мере полива

  • Датчик УФ-излучения: уровень УФ в помещении очень низкий, поэтому нужно вынести его на яркий солнечный свет

  • Датчик газа MQ-5 обладает высокой чувствительностью к бутану, пропану и метану

  • Лазерный датчик определяет отражение на расстоянии, тогда как инфракрасный датчик делает то же самое вблизи — менее чем на 4 см

На некоторых платах датчиков есть миниатюрные потенциометры, позволяющие настраивать чувствительность с помощью небольшой крестовой отвёртки. Это меняет пороговое значение, при котором изменяется цифровой сигнал (будьте осторожны — они очень деликатные!).

Ни один из этих простых датчиков не откалиброван, однако они вполне подходят для того, чтобы понять: растёт ли УФ-излучение или падает, нуждаются ли растения в поливе, есть ли утечка газа (но, пожалуйста, используйте эти бюджетные датчики только в качестве развлекательного проекта, а для дома приобретите нормальный датчик газа!). Цифровой выход работает как переключатель «вкл/выкл», тогда как аналоговый сигнал даёт более плавный отклик.

Синхронизация светодиодов датчика и Pico

Если сравнить светодиод DAT на плате датчика со светодиодом на Pico во время работы программы, можно заметить, что они не синхронизированы: один горит тогда, когда другой погашен.

Предпочтительнее, чтобы они были синхронизированы — то есть показание датчика высокое = True = 1, и это же переключает светодиод Pico в нужный момент.

Программа предусматривает для этого функцию invert(). Активируйте её, раскомментировав четвёртую строку с конца. После повторного запуска светодиоды должны работать синхронно.

Использование датчика температуры TMP36 с Raspberry Pi Pico

Датчик температуры TMP36

TMP36 — недорогой, компактный и простой в использовании датчик температуры, идеально подходящий для проектов мейкеров.

Он выдаёт напряжение, пропорциональное своей температуре. Мы используем пин АЦП на Pico для измерения этого напряжения и вычисления температуры по следующей формуле:

Темп °C = 100 * (показание в В) − 50

Подключение датчика TMP36 к Raspberry Pi Pico

Подключение к Pico простое. Глядя на плоскую сторону датчика с ножками, направленными вниз, подключаем следующим образом:

  • Левая ножка — 3.3V

  • Средняя ножка — сигнал — ADC0 на GP26

  • Правая ножка — GND

Альтернативно, используя схему из документации к компоненту:

Распиновка TMP36

Программирование TMP36 с Raspberry Pi Pico

Ниже приведена небольшая программа для начала работы с TMP36 и Raspberry Pi Pico. Программа полностью прокомментирована, чтобы объяснить происходящее.

Нередко приходится корректировать значение, полученное от датчика температуры, с помощью смещения (offset). Согласно паспортным данным, этот датчик точен в пределах ± 3°C. Другие, более дорогие датчики температуры могут быть точнее. Это также зависит от точности АЦП при измерении напряжения.

Обратите внимание на разницу в расположении °C в последних двух строках. Запятая в print() всегда оставляет пробел. В последней строке мы преобразовали число в строку и соединили (конкатенировали) с ней другую строку с помощью «+». Теперь при выводе пробела нет:

# TMP36
# While looking at flat side of sensor, legs pointing down
#   Left leg - 3.3 Volts
#   Centre leg - signal - ADC0 on GP26
#   Right leg - GND

from machine import ADC, Pin
import utime
adc = ADC(0)                    # Set up ADC0 pin

analog = adc.read_u16()         # Read the ADC
volts = analog/ 65535 * 3.3     # Calculate the voltage
temp = 100 *volts - 50          # Calculate temperature in °C
temp2 = round(temp)             # Round to nearest whole number
print("RAW:",analog)
print("Volts:",volts)
print("Temperature:", temp, "°C")
print("\nRounded temperature: ",temp2, "°C")

offset = 2.9                   # Apply offset (Individual to system)
temp3 =round(temp + offset)    # - you may need more - and round
print("\nAdjusted temperature:", str(temp3) + "°C")

При запуске программы вывод должен выглядеть примерно так:

>>> %Run -c $EDITOR_CONTENT
RAW: 12563
Volts: 0.632607
Temperature: 13.2607 °C

Что попробовать дальше

  • Выводите температуру каждые 10 минут. Наблюдайте, как она поднимается утром и падает вечером.

  • Включайте и выключайте красные, жёлтые, зелёные и синие светодиоды для индикации температуры.

  • Если у вас есть датчик температуры, совместимый с DS18B20, можно сравнить показания двух датчиков, написав программу, которая считывает оба датчика каждые несколько минут.

Что дальше?

В следующем руководстве мы рассмотрим двойные датчики — температуры и влажности — DHT11 и DHT22, которые также очень просто подключаются к Raspberry Pi Pico.

Первый из них входит в набор датчиков Waveshare вместе с датчиком поворота (энкодером), который мы рассмотрим в одном из следующих уроков.