Совсем недавно я получил небольшой ЖК-дисплей с интерфейсом I2C на базе контроллера SSD1306. У меня уже было несколько плат ESP-8266.

По умолчанию драйвер micropython мог рисовать только простую текстовую строку и устанавливать значение в пикселях. Достаточно для работы, но не очень удобно. Поэтому я решил реализовать вспомогательные методы для рисования изображения из файла или из последовательности. Или рисовать многострочный текст с разбиением на страницы, если требуется.

disp = Display(I2C(sda=Pin(0), scl=Pin(2)))
disp.draw_from_file('images/logo_wombat.bin')

Но для чего нужен такой экран, если он не показывает никакой полезной информации?

Итак, следующая часть - цифровой датчик температуры и влажности.

MQTT

ESP8266 имеет встроенную поддержку Wi-Fi. Поэтому я решил использовать протокол MQTT для установления связи между устройствами. Настроить брокера Mosquitto MQTT невероятно просто.

sudo apt install mosquitto

И это все! Готово к подаче. Конечно, вы можете добавить несколько конфигураций, если это необходимо. Но в этом случае - этого достаточно. Следующим шагом будет использование нашего нового брокера MQTT с нашими устройствами.

Датчик

Я использовал датчик DHT-11, купленный на Алиэкспресс. Питается от LiPo аккумулятора с солнечной панелью.

Таким образом, система должна быть маломощной. К счастью - ESP-8266 имеет режим глубокого сна. В этом режиме все системы отключены, кроме часов реального времени (RTC), которые используются для пробуждения устройства по таймеру.

Таким образом, устройство большую часть времени спит, затем просыпается на 10–15 секунд, измеряет температуру и влажность, отправляет их брокеру MQTT и засыпает следующие 5 минут.

Однако ESP-01 не имеет вывода GPIO16, который используется RTC для отправки сигнала. Нам необходимо подключить его к контакту RESET. Время для пайки некоторых деталей. На самом деле, это было проще, чем кажется 😉

После этого наш ESP был готов к использованию в режиме глубокого сна и мог автоматически просыпаться.

Micropython уже поддерживает датчики DHT и может использоваться просто:

import dht
from machine import Pin
DHT = dht.DHT11(Pin(2, Pin.IN, Pin.PULL_UP))
time.sleep(5)  # sensor need some time to prepare
DHT.measure()     
temp = DHT.temperature()    
humidity = DHT.humidity()

Micropython имеет встроенный клиент MQTT. Это означает, что использовать MQTT тоже довольно просто (а простой лучше, чем сложный 😉)

import ubinascii
from umqtt.simple import MQTTClient
CLIENT_ID = ubinascii.hexlify(machine.unique_id())
mqtt = MQTTClient(CLIENT_ID, '127.0.0.l')
mqtt.connect()
mqtt.publish('sensors/temperature/{}'.format(CLIENT_ID).encode(), str(temp).encode())
mqtt.disconnect()

После того, как все будет сделано, устройство может спокойно ложиться спать ^ _ ^

rtc = machine.RTC()
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)
rtc.alarm(rtc.ALARM0, 5 * 60 * 1000)  # 5 minutes

machine.deepsleep()

Отображать

Мой дисплей основан на SSD1306, в основном это OLED-дисплей Arduino, который поддерживается Micropython. Его можно инициализировать так:

import ssd1306
from machine import I2C, Pin
display = ssd1306.SSD1306_I2C(I2C(sda=Pin(0), scl=Pin(2)))
display.text('Hello world!', 0, 0)

Отображение данных оказалось несложным. Простая подписка на тему датчиков и обновление экрана каждый раз, когда что-то публикуется.

import ubinascii
import machine
from umqtt.simple import MQTTClient

from data import conf


CLIENT_ID = ubinascii.hexlify(machine.unique_id())


def update_data(topic, msg):
    topic = topic.decode().split('/')
    device_id = topic.pop(-1)
    name = topic[-1]
    data = msg.decode()

    ... update the display ...


mqtt = MQTTClient(CLIENT_ID, conf.MQTT_SERVER)
mqtt.set_callback(update_data)
mqtt.connect()
mqtt.subscribe(b'sensors/+/+')

try:
    while True:
        mqtt.wait_msg()
finally:
    mqtt.disconnect()

Ta-Da!

Все исходники открыты, их можно найти здесь:
https://github.com/Ignisor/ESP-Display
https://github.com/Ignisor/ESP-01-DHT -11

Спасибо за чтение и удачи!

Игнисор при поддержке GoWombat Team