import machine
import time
import dht
import network
from umqtt.simple import MQTTClient
from machine import Pin
from hd44780 import HD44780
# Настройка пинов
DHTPIN = 22 # Пин подключения DHT22
LED_TEMP_PIN = 21 # Пин для светодиода температуры
LED_HUMIDITY_PIN = 2 # Пин для светодиода влажности
led_pins = [machine.Pin(i, machine.Pin.OUT) for i in [33,4,5,15,16,17,18,19,23,32]]
print("Тест светодиодов:")
for i, pin in enumerate(led_pins):
print(f"Включаю светодиод {i+1}")
pin.value(1)
time.sleep(0.3)
pin.value(0)
print("Тест завершен")
# Настройка LCD дисплея
lcd = HD44780(rs=Pin(12), enable=Pin(13), d4=Pin(14), d5=Pin(27), d6=Pin(26), d7=Pin(25))
# Инициализация DHT22
dht_sensor = dht.DHT22(machine.Pin(DHTPIN))
for pin in led_pins:
pin.value(1) # Включить все светодиоды
time.sleep(1)
for pin in led_pins:
pin.value(0) # Выключить все светодиоды
# Настройка MQTT
MQTT_BROKER = "test.e-ln.ru" # Адрес сервера
CLIENT_ID = "esp32_dht22_client" # Уникальный идентификатор клиента
TOPIC_TEMP = "goydazov/temp"
TOPIC_HUMIDITY = "goydazov/humidity"
MQTT_TOPIC_LED = "goydazov/Z" # Топик для LED бар-графа
# Настройка пинов для светодиодов
led_temp = machine.Pin(LED_TEMP_PIN, machine.Pin.OUT)
led_humidity = machine.Pin(LED_HUMIDITY_PIN, machine.Pin.OUT)
# Настройка Wi-Fi
def connect_to_wifi():
print('Подключение к Wi-Fi', end='')
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('Wokwi-GUEST', '')
while not sta_if.isconnected():
print('.', end='')
time.sleep(0.3)
print('Подключено')
def on_message(topic, msg):
global led_pins
print(f"Received message on topic {topic}: {msg}") # Отладочное сообщение
try:
value = int(msg.decode().strip())
print(f"Setting LED bar graph to {value}") # Отладочное сообщение
for i in range(len(led_pins)):
led_pins[i].value(1 if i < value else 0)
except Exception as e:
print(f"Error in on_message: {e}")
# Функция для отправки данных на MQTT сервер
def send_data(client, temperature, humidity):
client.publish(TOPIC_TEMP, str(temperature))
client.publish(TOPIC_HUMIDITY, str(humidity))
print(f"Данные отправлены на сервер MQTT: Temp={temperature}, Humidity={humidity}")
# Основные параметры
INTERVAL_GET_DATA = 3 # Интервал измерений в секундах
last_measurement_time = time.time()
# Подключение к Wi-Fi
connect_to_wifi()
# Подключение к MQTT
client = MQTTClient(CLIENT_ID, MQTT_BROKER)
client.set_callback(on_message)
client.connect()
client.subscribe(MQTT_TOPIC_LED)
print(f'Подписан на {MQTT_TOPIC_LED}')
# Инициализация LCD
lcd.init()
lcd.clear()
# Основной цикл
while True:
current_time = time.time()
# Проверка сообщений из MQTT (для LED бар-графа)
try:
client.check_msg()
except Exception as e:
print(f'mqtt error:{e}')
if current_time - last_measurement_time >= INTERVAL_GET_DATA:
try:
# Получение данных с DHT22
dht_sensor.measure()
humidity = dht_sensor.humidity()
temperature = dht_sensor.temperature()
# Вывод данных в консоль
print(f"Влажность: {humidity:.1f} %")
print(f"Температура: {temperature:.1f} C")
# Вывод данных на LCD-дисплей
lcd.move_to(0, 0) # Перемещение курсора на первую строку
lcd.putstr('Temp: %3.1f C' % temperature) # Печать температуры
lcd.move_to(0, 1) # Перемещение курсора на вторую строку
lcd.putstr('Hum: %3.1f %%' % humidity) # Печать влажности
# Отправка данных на сервер MQTT
send_data(client, temperature, humidity)
# Логика для управления светодиодами
led_temp.value(1 if temperature < 17 or temperature > 25 else 0)
led_humidity.value(1 if humidity < 40 or humidity > 60 else 0)
except OSError as e:
print('Не удалось прочитать данные с DHT22:', e)
last_measurement_time = current_time
time.sleep(0.2)