![MQTT RGB управление и DHT22 мониторинг с MicroPython на ESP8266 D1 mini](http://ardudevelop.eu/wp-content/uploads/2025/01/MQTT-RGB-управление-и-DHT22-мониторинг-с-MicroPython-на-ESP8266-D1-mini.jpg)
Въведение
Интелигентните устройства, базирани на ESP8266, са популярен избор за изграждане на автоматизирани системи. Тази статия представя как да реализирате проект с RGB LED управление и мониторинг на температура и влажност чрез DHT22 сензор, използвайки MicroPython и MQTT протокол. Този проект съчетава удобство и функционалност, като позволява лесно дистанционно управление и мониторинг чрез MQTT.
За какво служи проектът?
Проектът комбинира RGB LED контрол и мониторинг на околната среда чрез MQTT. С него можете:
- Да управлявате цветовете на RGB LED светлина чрез MQTT команди.
- Да следите в реално време температурата и влажността в помещението с DHT22 сензор. Прочетете как става това в статията ни: Изчитане на DHT11 с ESP8266 и MicroPython: Практическо ръководство.
- Да интегрирате проекта с платформи като Home Assistant или Node-RED за разширена автоматизация.
Видео на проекта: MQTT RGB управление и DHT22 мониторинг с MicroPython на ESP8266
Използваната платформа ESP8266 D1 mini, в комбинация с MicroPython, прави проекта лесен за изпълнение и модификация.
Схематично решение
Използвали сме разработената от нас схема и платка от проекта ни: Контрол на RGB осветление с ESP8266 и Arduino IDE през WEB интерфейс. Ще публикуваме само схемата на проекта а останалата част като изглед на платката+частите на нея разгледайте в горния линк.
ESP8266-WEB-RGB-LED-LDR-schemeRGB LED и DHT22 сензорът са свързани към ESP8266 D1 mini. Свързването е както следва:
- RGB LED:
- Червен канал (Red): GPIO5 (D1).
- Зелен канал (Green): GPIO4 (D2).
- Син канал (Blue): GPIO0 (D3).
- DHT22 сензор: GPIO2 (D4).
Уверете се, че знаете пин-диаграмата на ESP8266 D1 mini, като разгледате статията ни: ESP8266 D1 Mini – Малък, но Мощен Wi-Fi Микроконтролер.
MQTT протоколът осигурява комуникацията между ESP8266 и сървър за управление и мониторинг. Wi-Fi модулът на ESP8266 свързва устройството към локалната мрежа, като осигурява безжична връзка с MQTT брокера.
Код на проекта за MQTT RGB управление и DHT22 мониторинг с MicroPython на ESP8266 D1 mini
import network
import time
import machine
from umqtt.simple import MQTTClient
from dht import DHT22
from machine import Pin, PWM
# Настройки за WiFi
SSID = "XXXXXXXXXX" # Вашето име на WiFi мрежата
PASSWORD = "XXXXXXXXXX" # Вашата парола на WiFi мрежата
# Настройки за MQTT
MQTT_BROKER = "192.168.1.70" # Променете с вашето IP на MQTT сървъра
MQTT_CLIENT_ID = "esp8266_rgb_dht"
MQTT_USER = "XXXXXXXXXX" # Вашето MQTT потребителско име
MQTT_PASS = "XXXXXXXXXX" # Вашата MQTT парола
MQTT_TOPIC_RED = "home/rgb/red"
MQTT_TOPIC_GREEN = "home/rgb/green"
MQTT_TOPIC_BLUE = "home/rgb/blue"
MQTT_TOPIC_TEMP = "home/temperature"
MQTT_TOPIC_HUMID = "home/humidity"
# Настройки на RGB
red = PWM(Pin(5), freq=500)
green = PWM(Pin(4), freq=500)
blue = PWM(Pin(0), freq=500)
# Инициализация на DHT сензора
dht_sensor = DHT22(Pin(2))
# Свързване към WiFi
def connect_to_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)
print("Свързване към WiFi...")
while not wlan.isconnected():
time.sleep(1)
print("Свързан:", wlan.ifconfig())
# MQTT callback за получаване на съобщения
def mqtt_callback(topic, msg):
print("Получено съобщение:", topic, msg)
try:
if topic == MQTT_TOPIC_RED.encode():
r = int(float(msg))
set_rgb(r, None, None) # Промяна само на червения канал
elif topic == MQTT_TOPIC_GREEN.encode():
g = int(float(msg))
set_rgb(None, g, None) # Промяна само на зеления канал
elif topic == MQTT_TOPIC_BLUE.encode():
b = int(float(msg))
set_rgb(None, None, b) # Промяна само на синия канал
except Exception as e:
print("Грешка при обработка на командата:", e)
# Задаване на стойности на RGB
def set_rgb(r=None, g=None, b=None):
if r is not None:
red.duty(int(r * 1023 / 255))
if g is not None:
green.duty(int(g * 1023 / 255))
if b is not None:
blue.duty(int(b * 1023 / 255))
# Изпращане на данни от DHT сензора
def publish_sensor_data(client):
try:
dht_sensor.measure()
temp = dht_sensor.temperature()
humid = dht_sensor.humidity()
client.publish(MQTT_TOPIC_TEMP, str(temp))
client.publish(MQTT_TOPIC_HUMID, str(humid))
print(f"Температура: {temp}°C, Влажност: {humid}%")
except Exception as e:
print("Грешка при четене на DHT:", e)
# Основна програма
def main():
connect_to_wifi()
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASS)
client.set_callback(mqtt_callback)
client.connect()
print("Свързан към MQTT брокера.")
# Абониране за RGB канали
client.subscribe(MQTT_TOPIC_RED)
client.subscribe(MQTT_TOPIC_GREEN)
client.subscribe(MQTT_TOPIC_BLUE)
while True:
client.check_msg()
publish_sensor_data(client)
time.sleep(1) # Изпращане на данни на всеки 5 секунди
# Стартиране
try:
main()
except Exception as e:
print("Грешка:", e)
machine.reset()
Обяснение на кода
1. Импортиране на модули (библиотеки)
import network
import time
import machine
from umqtt.simple import MQTTClient
from dht import DHT22
from machine import Pin, PWM
Тези модули са необходими за основната функционалност на програмата:
network
: Управлява WiFi свързването.time
: Използва се за паузи и забавяния.machine
: Осигурява достъп до хардуерните компоненти на платката.umqtt.simple
: Лека библиотека за MQTT протокол.dht
: Библиотека за работа със сензорите DHT22/DHT11.Pin, PWM
: Класове за управление на GPIO пинове и PWM сигнали.
2. Настройки за WiFi
SSID = "XXXXXXXXXX" # Вашето име на WiFi мрежата
PASSWORD = "XXXXXXXXXX" # Вашата парола на WiFi мрежата
Тези променливи съхраняват данни за свързване към WiFi мрежата:
SSID
: Името на безжичната мрежа.PASSWORD
: Паролата за достъп до мрежата.
3. Настройки за MQTT
MQTT_BROKER = "192.168.1.70" # Променете с вашето IP на MQTT сървъра
MQTT_CLIENT_ID = "esp8266_rgb_dht" # По избор
MQTT_USER = "XXXXXXXXXX" # Вашето MQTT потребителско име
MQTT_PASS = "XXXXXXXXXX" # Вашата MQTT парола
MQTT_TOPIC_RED = "home/rgb/red"
MQTT_TOPIC_GREEN = "home/rgb/green"
MQTT_TOPIC_BLUE = "home/rgb/blue"
MQTT_TOPIC_TEMP = "home/temperature"
MQTT_TOPIC_HUMID = "home/humidity"
Тези настройки конфигурират MQTT клиента:
MQTT_BROKER
: IP адрес на MQTT брокера.MQTT_CLIENT_ID
: Уникален идентификатор за устройството в MQTT мрежата.MQTT_USER
иMQTT_PASS
: Удостоверяване за достъп до брокера.MQTT_TOPIC_*
: Теми за публикуване и абониране:home/rgb/red
,home/rgb/green
,home/rgb/blue
– RGB управление.home/temperature
,home/humidity
– Данни от DHT сензора.
4. Настройки за RGB светодиода
red = PWM(Pin(5), freq=500)
green = PWM(Pin(4), freq=500)
blue = PWM(Pin(0), freq=500)
- Тук се инициализират PWM сигнали за управление на RGB каналите:
- Червен (Red): GPIO5 (D1).
- Зелен (Green): GPIO4 (D2).
- Син (Blue): GPIO0 (D3).
freq=500
: Честота на PWM сигнала за плавно регулиране на яркостта.
5. Инициализация на DHT22 сензора
dht_sensor = DHT22(Pin(2))
- DHT22 сензорът е свързан към GPIO2 (D4).
- Тази библиотека позволява измерване на температура и влажност.
6. Свързване към WiFi
def connect_to_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)
print("Свързване към WiFi...")
while not wlan.isconnected():
time.sleep(1)
print("Свързан:", wlan.ifconfig())
network.WLAN
: Активира STA режим (клиент).wlan.connect()
: Свързва устройството към зададената WiFi мрежа.while not wlan.isconnected()
: Чака, докато връзката бъде установена.wlan.ifconfig()
: Показва IP адреса на устройството.
7. MQTT callback за получаване на съобщения
def mqtt_callback(topic, msg):
print("Получено съобщение:", topic, msg)
try:
if topic == MQTT_TOPIC_RED.encode():
r = int(float(msg))
set_rgb(r, None, None) # Промяна само на червения канал
elif topic == MQTT_TOPIC_GREEN.encode():
g = int(float(msg))
set_rgb(None, g, None) # Промяна само на зеления канал
elif topic == MQTT_TOPIC_BLUE.encode():
b = int(float(msg))
set_rgb(None, None, b) # Промяна само на синия канал
except Exception as e:
print("Грешка при обработка на командата:", e)
topic
: Тема, от която е получено съобщението.msg
: Стойност на съобщението.- Обработка на команди:
- Ако темата съвпада с RGB канала, стойността се преобразува и предава на функцията
set_rgb
.
- Ако темата съвпада с RGB канала, стойността се преобразува и предава на функцията
- В случай на грешка, се извежда диагностично съобщение.
8. Задаване на стойности на RGB светодиода
def set_rgb(r=None, g=None, b=None):
if r is not None:
red.duty(int(r * 1023 / 255))
if g is not None:
green.duty(int(g * 1023 / 255))
if b is not None:
blue.duty(int(b * 1023 / 255))
Функцията set_rgb
е отговорна за настройката на яркостта на всеки от трите канала (червен, зелен и син) на RGB светодиода.
- Аргументи на функцията:
r
,g
,b
: Параметрите представляват стойности за червения, зеления и синия канал, съответно. Те приемат стойности между0
и255
, където0
означава изключен канал, а255
— максимална яркост.
- Пресмятане на PWM дългата:
- Стойността на всеки параметър се преобразува в PWM дългата, която контролира интензитета на светлината. Уравнението:
int(r * 1023 / 255)
преобразува диапазона от 0 до 255 към диапазона от 0 до 1023, използван от микроконтролера.
- Стойността на всеки параметър се преобразува в PWM дългата, която контролира интензитета на светлината. Уравнението:
- Задаване на стойности за каналите:
- Ако параметърът не е
None
, се променя съответната дългата: codered.duty(...)
, green.duty(...), blue.duty(...).
Това гарантира, че промяната засяга само канала, за който има стойност.
- Ако параметърът не е
9. Изпращане на данни от DHT сензора
def publish_sensor_data(client):
try:
dht_sensor.measure()
temp = dht_sensor.temperature()
humid = dht_sensor.humidity()
client.publish(MQTT_TOPIC_TEMP, str(temp))
client.publish(MQTT_TOPIC_HUMID, str(humid))
print(f"Температура: {temp}°C, Влажност: {humid}%")
except Exception as e:
print("Грешка при четене на DHT:", e)
Функцията publish_sensor_data
измерва температурата и влажността с помощта на DHT сензора и изпраща резултатите към MQTT брокера.
- Четене на данни от сензора:
dht_sensor.measure()
: Инициира измерване от DHT сензора.dht_sensor.temperature()
иdht_sensor.humidity()
: Получават стойностите за температура и влажност, съответно.
- Изпращане към MQTT:
client.publish()
: Изпраща съответните данни към топиците:MQTT_TOPIC_TEMP
: Топик за температурата.MQTT_TOPIC_HUMID
: Топик за влажността.
- Стойностите се преобразуват в низове с
str()
.
- Отпечатване в терминала:
- Изведените стойности за температура и влажност помагат за диагностика.
- Обработка на грешки:
- Ако възникне грешка при измерването, тя се хваща и извежда на екрана.
10. Основна програма
def main():
connect_to_wifi()
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASS)
client.set_callback(mqtt_callback)
client.connect()
print("Свързан към MQTT брокера.")
# Абониране за RGB канали
client.subscribe(MQTT_TOPIC_RED)
client.subscribe(MQTT_TOPIC_GREEN)
client.subscribe(MQTT_TOPIC_BLUE)
while True:
client.check_msg()
publish_sensor_data(client)
time.sleep(1)
Функцията main
е основната част на програмата, която изпълнява всички операции по свързване, абониране за топици и непрекъсната обработка на данни.
- Свързване към WiFi:
connect_to_wifi()
: Гарантира, че устройството е свързано към мрежата.
- Настройка на MQTT клиента:
MQTTClient(...)
: Създава MQTT клиент с необходимите идентификационни данни.set_callback(...)
: Настройва функция за обработка на входящи MQTT съобщения.connect()
: Свързва клиента към MQTT брокера.
- Абониране за топици:
- Клиентът се абонира за трите RGB канала (
MQTT_TOPIC_RED
,MQTT_TOPIC_GREEN
,MQTT_TOPIC_BLUE
).
- Клиентът се абонира за трите RGB канала (
- Главен цикъл:
check_msg()
: Проверява за входящи съобщения от MQTT брокера.publish_sensor_data()
: Изпраща данни от DHT сензора към съответните топици.time.sleep(1)
: Изчаква 1 секунда между изпращанията, за да не претоварва мрежата.
- Непрекъснато изпълнение:
- Цикълът работи непрекъснато, докато програмата не бъде прекратена.
Обяснение на всички топици и команди
Теми за RGB управление:
home/rgb/red
: Задава интензитета на червения канал (стойности от 0 до 255).home/rgb/green
: Задава интензитета на зеления канал (стойности от 0 до 255).home/rgb/blue
: Задава интензитета на синия канал (стойности от 0 до 255).
Теми за мониторинг:
home/temperature
: Публикува текущата температура от DHT22.home/humidity
: Публикува текущата влажност от DHT22.
Настройка на MQTT панела
За да настроите MQTT панела:
- Добавете полета за RGB канали:
- Тема:
home/rgb/red
| Тип: слайдер | Стойности: от 0 до 255. - Тема:
home/rgb/green
| Тип: слайдер | Стойности: от 0 до 255. - Тема:
home/rgb/blue
| Тип: слайдер | Стойности: от 0 до 255.
- Тема:
- Добавете полета за мониторинг на температура и влажност:
- Тема:
home/temperature
| Тип: текстово поле | Само за четене. - Тема:
home/humidity
| Тип: текстово поле | Само за четене.
- Тема:
Обобщение
Този проект демонстрира как да използвате ESP8266 D1 mini с MicroPython за управление на RGB LED и мониторинг на температура и влажност чрез DHT22 през MQTT. Интеграцията на RGB контрол с DHT22 сензор предоставя мощна и гъвкава основа за интелигентни домашни системи.
Заключение
Използването на MicroPython с ESP8266 и MQTT улеснява изграждането на персонализирани IoT решения. Проектът е идеален за обучение, прототипиране или разширяване на съществуващи интелигентни системи.
Источници: