![MQTT управление на релета, изчитане на DHT сензор и напрежение Компактен проект за интелигентен дом](http://ardudevelop.eu/wp-content/uploads/2025/01/MQTT-управление-на-релета-изчитане-на-DHT-сензор-и-напрежение-Компактен-проект-за-интелигентен-дом-1.png)
Въведение
С развитието на системите за автоматизация, управлението на уреди и наблюдението на околната среда стават все по-достъпни. Тази статия представя проект, базиран на MicroPython MQTT, който включва управление на релета, измерване на температура и влажност чрез DHT22 сензор, както и мониторинг на напрежение. Проектът е реализиран върху компактна платка, поставена в стандартна кутия за монтаж на DIN шина, което осигурява лесна интеграция в електрически табла.
За какво служи проектът: MicroPython и MQTT, управление на релета, изчитане на DHT сензор и напрежение?
Проектът демонстрира как с помощта на MicroPython MQTT може да се реализира система за интелигентно управление и мониторинг, която е идеална за домашна автоматизация. Чрез този проект можете:
- Да управлявате дистанционно електроуреди чрез MQTT протокол.
- Да наблюдавате температура и влажност с помощта на DHT22 сензор.
- Да измервате напрежение в реално време.
- Лесно да интегрирате системата с платформи като Home Assistant или Node-RED.
![MicroPython и MQTT, управление на релета, изчитане на DHT сензор и напрежение: Компактен проект за интелигентен дом](http://ardudevelop.eu/wp-content/uploads/2024/12/ESP8266-управление-на-релета-през-WEB-или-бутони-и-изчитане-на-DHT22-и-напрежение-2.jpg)
Необходим е MQTT сървър, за да функционира системата. За инструкции относно създаване на MQTT сървър, вижте нашите статии по темата:
- Инсталиране на Mosquitto MQTT Broker на Raspberry Pi 4
- Инсталиране Mosquitto MQTT Broker на Orange Pi Plus 2 и Armbian Linux
Схематично решение
Системата е реализирана със следните компоненти, като на практика използваме платформа която сме разработили за програмиране с Arduino и управлението и през WEB.
- ESP8266 като микроконтролер за управление и обработка на данни. Технически характеристики в статията ни: ESP8266 D1 Mini – Малък, но Мощен Wi-Fi Микроконтролер
- 4 релета, свързани към пинове D16, D12, D13 и D15, за управление на устройства.
- DHT22 сензор, свързан към пин D14, за измерване на температура и влажност. Прочетете как се измерва влажност и температура с MicroPython в статията ни: Изчитане на DHT11 с ESP8266 и MicroPython: Практическо ръководство.
- Аналогов вход (A0) за измерване на напрежение чрез делител на напрежение, съставен от резистори с стойности 120 kΩ и 15.5 kΩ. В статията ни: Изчитане на Аналогова Стойност с ESP8266 и MicroPython, ще се запознаете как се изчита аналогова стойност с MicroPython. А в статията ни: Делители на напрежение и RC филтър: Прецизно изчисление и приложение с Arduino, ESP8266 и ESP32, ще прочетете всичко за пресмятане на делители на напрежение.
- 4 бутона, свързани към пинове D2, D0, D4 и D5, за локално управление на релетата.
- Устройството е монтирано в компактна кутия за DIN шина, което улеснява монтажа в електрически табла и интеграцията в домашната мрежа.
- Прибавили сме и LOW-PASS филтър на аналоговия вход за по-стабилно изчитане на стойностите подадени на аналоговия пин А0. В нашата статия: Използване на LOW-PASS RC филтри за изчитане на аналогови сигнали с Arduino, ще се запознаете с всичко необходимо за тяхното пресмятане.
![MicroPython и MQTT, управление на релета, изчитане на DHT сензор и напрежение: Компактен проект за интелигентен дом](http://ardudevelop.eu/wp-content/uploads/2024/12/ESP8266-управление-на-релета-през-WEB-или-бутони-и-изчитане-на-DHT22-и-напрежение-Fritzing-PCB-1013x1024.jpg)
Може да разгледате Arduino ESP8266 проекта в статията ни:
Код на проекта: MicroPython и MQTT, управление на релета, изчитане на DHT сензор и напрежение
import network
import dht
from machine import Pin, ADC
from umqtt.simple import MQTTClient
from time import sleep
# Настройка на пиновете за релета
Relay1 = Pin(16, Pin.OUT)
Relay2 = Pin(12, Pin.OUT)
Relay3 = Pin(13, Pin.OUT)
Relay4 = Pin(15, Pin.OUT)
Relay1.value(0)
Relay2.value(0)
Relay3.value(0)
Relay4.value(0)
# Настройка на пиновете за бутони
Button1 = Pin(2, Pin.IN, Pin.PULL_UP)
Button2 = Pin(0, Pin.IN, Pin.PULL_UP)
Button3 = Pin(4, Pin.IN, Pin.PULL_UP)
Button4 = Pin(5, Pin.IN, Pin.PULL_UP)
# Аналогов вход
AnalogIN = ADC(0)
# Делител на напрежение
Res1 = 120000
Res2 = 15500
voltage_in = 0
volt = 0
# DHT22 сензор
d = dht.DHT22(Pin(14))
# Настройки за WiFi и MQTT
SSID = "хххххххх" # Заместете с вашето SSID
PASSWORD = "xxxxxxxx" # Заместете с вашата парола
MQTT_SERVER = "192.168.1.70" # Заместете с IP на вашия MQTT сървър
MQTT_PORT = 1883 # Ако сте сменили порта на MQTT променете го
MQTT_USER = "xxxxxxxxx" # Име на MQTT
MQTT_PASSWORD = "xxxxxxxxx" # Парола на МЯТТ
MQTT_CLIENT_ID = "ESP8266_proto_1" # Клиентско име на устройството (може да го следите в MQTT)
MQTT_TOPIC_COMMAND = "esp8266/relays"
MQTT_TOPIC_DHTtemp = "esp8266/DHTtemp"
MQTT_TOPIC_DHThum = "esp8266/DHThum"
MQTT_TOPIC_AnalogIN = "esp8266/AnalogIN"
# Индивидуални топици за състоянията на релетата
MQTT_TOPIC_RELAY1_STATE = "esp8266/relay1/state"
MQTT_TOPIC_RELAY2_STATE = "esp8266/relay2/state"
MQTT_TOPIC_RELAY3_STATE = "esp8266/relay3/state"
MQTT_TOPIC_RELAY4_STATE = "esp8266/relay4/state"
# MQTT клиент
client = None
# Свързване към WiFi
def connect_to_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)
while not wlan.isconnected():
print("Connecting to WiFi...")
sleep(0.5)
print("Connected to WiFi:", wlan.ifconfig())
# Обработка на MQTT съобщения
def mqtt_callback(topic, msg):
print("Message received on topic:", topic.decode(), "Message:", msg.decode())
if topic.decode() == MQTT_TOPIC_COMMAND:
if msg.decode() == "R1on":
Relay1.value(1)
publish_relay_state(1)
elif msg.decode() == "R1off":
Relay1.value(0)
publish_relay_state(1)
elif msg.decode() == "R2on":
Relay2.value(1)
publish_relay_state(2)
elif msg.decode() == "R2off":
Relay2.value(0)
publish_relay_state(2)
elif msg.decode() == "R3on":
Relay3.value(1)
publish_relay_state(3)
elif msg.decode() == "R3off":
Relay3.value(0)
publish_relay_state(3)
elif msg.decode() == "R4on":
Relay4.value(1)
publish_relay_state(4)
elif msg.decode() == "R4off":
Relay4.value(0)
publish_relay_state(4)
# Свързване към MQTT сървър
def connect_to_mqtt():
global client
client = MQTTClient(MQTT_CLIENT_ID, MQTT_SERVER, port=MQTT_PORT, user=MQTT_USER, password=MQTT_PASSWORD)
client.set_callback(mqtt_callback)
client.connect()
print("Connected to MQTT server")
client.subscribe(MQTT_TOPIC_COMMAND)
# Четене на сензори и публикуване на данни
def publish_sensor_data():
try:
d.measure()
temperature = d.temperature()
humidity = d.humidity()
client.publish(MQTT_TOPIC_DHTtemp, str(temperature))
client.publish(MQTT_TOPIC_DHThum, str(humidity))
analog_value = 0
for i in range(0,50):
analog_value = AnalogIN.read() + analog_value
analog_value = analog_value / 50
voltage_in = analog_value * (3.3 / 1024) * 10
volt = (voltage_in * (Res1 / (Res1 + Res2))) - 0.14
if volt < 0:
volt = 0
volt = round(volt, 2)
#print("analog_val=", voltage_in, "volt=", volt)
client.publish(MQTT_TOPIC_AnalogIN, str(volt))
#print("Published data: Temp:", temperature, "Hum:", humidity, "Analog:", analog_value)
except Exception as e:
print("Failed to read sensors:", e)
# Публикуване на състояние на реле
def publish_relay_state(relay_number):
if relay_number == 1:
client.publish(MQTT_TOPIC_RELAY1_STATE, "ON" if Relay1.value() else "OFF")
elif relay_number == 2:
client.publish(MQTT_TOPIC_RELAY2_STATE, "ON" if Relay2.value() else "OFF")
elif relay_number == 3:
client.publish(MQTT_TOPIC_RELAY3_STATE, "ON" if Relay3.value() else "OFF")
elif relay_number == 4:
client.publish(MQTT_TOPIC_RELAY4_STATE, "ON" if Relay4.value() else "OFF")
# Обработка на бутоните
def handle_buttons():
if not Button1.value(): # Бутон 1 е натиснат
Relay1.value(not Relay1.value())
publish_relay_state(1)
print("Relay1 toggled to", Relay1.value())
sleep(0.1) # Anti-bounce
if not Button2.value(): # Бутон 2 е натиснат
Relay2.value(not Relay2.value())
publish_relay_state(2)
print("Relay2 toggled to", Relay2.value())
sleep(0.1)
if not Button3.value(): # Бутон 3 е натиснат
Relay3.value(not Relay3.value())
publish_relay_state(3)
print("Relay3 toggled to", Relay3.value())
sleep(0.1)
if not Button4.value(): # Бутон 4 е натиснат
Relay4.value(not Relay4.value())
publish_relay_state(4)
print("Relay4 toggled to", Relay4.value())
sleep(0.1)
# Главна програма
def main():
connect_to_wifi()
connect_to_mqtt()
while True:
client.check_msg() # Проверява за входящи MQTT съобщения
handle_buttons() # Проверява състоянието на бутоните
publish_sensor_data() # Чете и публикува данни от сензорите
sleep(1) # Изчаква преди следващия цикъл
# Стартиране
try:
main()
except KeyboardInterrupt:
print("Program stopped")
Обяснение на кода
1. Импортиране на необходимите библитеки
import network
import dht
from machine import Pin, ADC
from umqtt.simple import MQTTClient
from time import sleep
2. Инициализация на хардуерните компоненти
В началото на кода се настройват пиновете за релета, бутони и аналогов вход.
# Настройка на пиновете за релета
Relay1 = Pin(16, Pin.OUT)
Relay2 = Pin(12, Pin.OUT)
Relay3 = Pin(13, Pin.OUT)
Relay4 = Pin(15, Pin.OUT)
Relay1.value(0)
Relay2.value(0)
Relay3.value(0)
Relay4.value(0)
# Настройка на пиновете за бутони
Button1 = Pin(2, Pin.IN, Pin.PULL_UP)
Button2 = Pin(0, Pin.IN, Pin.PULL_UP)
Button3 = Pin(4, Pin.IN, Pin.PULL_UP)
Button4 = Pin(5, Pin.IN, Pin.PULL_UP)
# Аналогов вход
AnalogIN = ADC(0)
- Релета: Зададени като изходи, използвани за управление на електроуреди. В началото са изключени.
- Бутони: Свързани към входни пинове с включено вътрешно pull-up съпротивление, за да се избегне електрически шум.
Аналоговият вход (A0) е конфигуриран за четене на напрежение.
3. Настройка на имена и пароли за WiFi и MQTT
# Настройки за WiFi и MQTT
SSID = "хххххххх" # Заместете с вашето SSID
PASSWORD = "xxxxxxxx" # Заместете с вашата парола
MQTT_SERVER = "192.168.1.70" # Заместете с IP на вашия MQTT сървър
MQTT_PORT = 1883 # Ако сте сменили порта на MQTT променете го
MQTT_USER = "xxxxxxxxx" # Име на MQTT
MQTT_PASSWORD = "xxxxxxxxx" # Парола на МЯТТ
MQTT_CLIENT_ID = "ESP8266_proto_1" # Клиентско име на устройството (може да го следите в MQTT)
MQTT_TOPIC_COMMAND = "esp8266/relays"
MQTT_TOPIC_DHTtemp = "esp8266/DHTtemp"
MQTT_TOPIC_DHThum = "esp8266/DHThum"
MQTT_TOPIC_AnalogIN = "esp8266/AnalogIN"
4. Инициализация на топици
# Индивидуални топици за състоянията на релетата
MQTT_TOPIC_RELAY1_STATE = "esp8266/relay1/state"
MQTT_TOPIC_RELAY2_STATE = "esp8266/relay2/state"
MQTT_TOPIC_RELAY3_STATE = "esp8266/relay3/state"
MQTT_TOPIC_RELAY4_STATE = "esp8266/relay4/state"
5. Свързване към WiFi
def connect_to_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)
while not wlan.isconnected():
print("Connecting to WiFi...")
sleep(0.5)
print("Connected to WiFi:", wlan.ifconfig())
- SSID и PASSWORD: Дефинирани са като глобални променливи и съдържат името и паролата на мрежата.
- Ако устройството не се свърже, функцията изчаква с цикъл, докато се установи връзка.
6. Свързване към MQTT сървър
Функцията connect_to_mqtt
създава клиент за връзка с MQTT брокера.
def connect_to_mqtt():
global client
client = MQTTClient(MQTT_CLIENT_ID, MQTT_SERVER, port=MQTT_PORT, user=MQTT_USER, password=MQTT_PASSWORD)
client.set_callback(mqtt_callback)
client.connect()
print("Connected to MQTT server")
client.subscribe(MQTT_TOPIC_COMMAND)
- MQTT_TOPIC_COMMAND: Основният топик за получаване на команди за управление на релета.
client.set_callback
: Указва функцията, която обработва входящите MQTT съобщения.
7. Обработка на MQTT съобщения
Функцията mqtt_callback
проверява съдържанието на получените съобщения.
def mqtt_callback(topic, msg):
if topic.decode() == MQTT_TOPIC_COMMAND:
if msg.decode() == "R1on":
Relay1.value(1)
elif msg.decode() == "R1off":
Relay1.value(0)
- Всяко съобщение включва команда за включване/изключване на определено реле.
- Състоянието на релетата се актуализира според получената команда.
8. Измерване на сензори и публикуване на данни
Функцията publish_sensor_data
чете стойностите от DHT22 и аналоговия вход.
def publish_sensor_data():
d.measure()
temperature = d.temperature()
humidity = d.humidity()
client.publish(MQTT_TOPIC_DHTtemp, str(temperature))
client.publish(MQTT_TOPIC_DHThum, str(humidity))
- DHT22: Осигурява измерване на температура и влажност.
- Аналогов вход: Чете напрежението, преобразува го с помощта на делител и публикува стойността в топика
esp8266/AnalogIN
.
9. Управление на бутони
Функцията handle_buttons
следи състоянието на бутоните за локално управление на релетата.
def handle_buttons():
if not Button1.value():
Relay1.value(not Relay1.value())
- При натискане на бутон, съответното реле се включва/изключва.
10. Главен цикъл
Функцията main
обединява всички гореописани функции в един безкраен цикъл.
def main():
connect_to_wifi()
connect_to_mqtt()
while True:
client.check_msg()
handle_buttons()
publish_sensor_data()
sleep(1)
Топици и команди
Топици за управление на релетата
- esp8266/relays: Управлява всички релета.
- Команди:
"
R1on"
/"R1off
"
: Включване/изключване на реле 1."
R2on"
/"R2off
"
: Включване/изключване на реле 2."
R3on"
/"R3off
"
: Включване/изключване на реле 3."
R4on"
/"R4off
"
: Включване/изключване на реле 4.
- Команди:
Топици за публикуване на данни
- esp8266/DHTtemp: Публикува температурата.
- esp8266/DHThum: Публикува влажността.
- esp8266/AnalogIN: Публикува измереното напрежение.
- esp8266/relayX/state: Състояние на всяко реле (ON/OFF).
Настройка на IoT MQTT Panel
- Изтегляне на приложението: Инсталирайте IoT MQTT Panel от Google Play.
- Създаване на панел:
- Име на панела: ESP8266 Home Control.
- URL на брокера:
mqtt://192.168.1.70
. - Потребителско име:
ХХХХХХХХХ
. - Парола:
.ХХХХХХХХХ
- Добавяне на контролери:
- Температура: Тип Text с топик
esp8266/DHTtemp
. - Влажност: Тип Text с топик
esp8266/DHThum
. - Релета: Тип Switch с топици като
esp8266/relays
и payload съответно “R1on”/”R1off“. - Напрежение: Тип Text с топик
esp8266/AnalogIN
.
- Температура: Тип Text с топик
Обобщение
Проектът демонстрира как с MicroPython MQTT може да изградите интелигентен модул за управление на уреди и мониторинг на параметри в реално време. Системата е реализирана като прототип, който е готов за интеграция в пълноценна IoT система за автоматизация.
Заключение
С помощта на MicroPython MQTT, създаването на интелигентен дом е по-достъпно и ефективно. Описаният в статията проект е чудесна основа за изграждане на персонализирана IoT система с възможности за контрол и мониторинг, която може да бъде адаптирана към специфичните ви нужди. Повече в тази статия.