import machine
import time
import dht
import network
from umqtt.simple import MQTTClient
from machine import Pin
from hd44780 import HD44780
import neopixel # Импорт библиотеки для управления NeoPixel
# Настройка пинов
DHTPIN = 22 # Пин подключения DHT22
LED_TEMP_PIN = 21 # Пин для светодиода температуры
LED_HUMIDITY_PIN = 2 # Пин для светодиода влажности
LED_PIN = 4 # Пин для NeoPixel
NUM_LEDS = 10 # Количество светодиодов
# Настройка LCD дисплея
lcd = HD44780(rs=Pin(12), enable=Pin(13), d4=Pin(14), d5=Pin(27), d6=Pin(26), d7=Pin(25))
# Инициализация DHT22 и NeoPixel
dht_sensor = dht.DHT22(machine.Pin(DHTPIN))
np = neopixel.NeoPixel(Pin(LED_PIN), NUM_LEDS)
# Настройка MQTT
MQTT_BROKER = "broker.emqx.io" # Адрес сервера (можно использовать test.mosquitto.org)
CLIENT_ID = "esp32_dht22_client" # Уникальный идентификатор клиента
TOPIC_TEMP = "weather/temp"
TOPIC_HUMIDITY = "weather/humidity"
TOPIC_COLOR = "home/color" # Топик для цвета
# Настройка пинов для светодиодов
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('Connecting to WiFi...', 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('Connected!')
# Функция для отправки данных на MQTT сервер
def send_data(client, temperature, humidity):
try:
client.publish(TOPIC_TEMP, str(temperature))
client.publish(TOPIC_HUMIDITY, str(humidity))
except OSError as e:
print('Ошибка при отправке данных на MQTT:', e)
# Функция для обработки полученных сообщений
def sub_callback(topic, msg):
if topic.decode('utf-8') == TOPIC_COLOR:
color_hex = msg.decode('utf-8') # Декодируем байты в строку
set_color(color_hex)
# Функция для установки цвета NeoPixel из HEX-кода
def set_color(hex_color):
r = int(hex_color[1:3], 16)
g = int(hex_color[3:5], 16)
b = int(hex_color[5:7], 16)
for i in range(NUM_LEDS):
np[i] = (r, g, b) # Установка цвета на все светодиоды
np.write() # Применение изменений
# Основные параметры
INTERVAL_GET_DATA = 2 # Интервал измерений в секундах
last_measurement_time = time.time()
# Подключение к Wi-Fi
connect_to_wifi()
# Подключение к MQTT
client = MQTTClient(CLIENT_ID, MQTT_BROKER)
client.set_callback(sub_callback)
try:
client.connect()
client.subscribe(TOPIC_COLOR)
except OSError as e:
print('Ошибка подключения к MQTT:', e)
# Инициализация LCD
lcd.init()
lcd.clear()
# Основной цикл
while True:
current_time = time.time()
if current_time - last_measurement_time >= INTERVAL_GET_DATA:
try:
# Получение данных с DHT22
dht_sensor.measure()
humidity = dht_sensor.humidity()
temperature = dht_sensor.temperature()
# Вывод данных на 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
try:
client.check_msg()
except OSError as e:
print('Ошибка при проверке сообщений:', e)
time.sleep(0.1)