import machine
import time
import dht
import network
from umqtt.simple import MQTTClient
from machine import Pin
from hd44780 import HD44780
import neopixel
import socket
import urequests
# Настройка пинов
DHTPIN = 22
LED_TEMP_PIN = 21
LED_HUMIDITY_PIN = 2
NEOPIXEL_PIN = 4
NUM_PIXELS = 16
# Настройка 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))
# Настройка NeoPixel
ring = neopixel.NeoPixel(machine.Pin(NEOPIXEL_PIN), NUM_PIXELS)
# Настройка MQTT
MQTT_BROKER = "test.mosquitto.org"
CLIENT_ID = "esp32_dht22_client"
TOPIC_TEMP = "furious/temp"
TOPIC_HUMIDITY = "furious/humidity"
TOPIC_NEOPIXEL = "furious/neopixel"
# --- Функции для проверки и подключения к интернету ---
def check_internet_connection():
try:
response = urequests.get("https://www.google.com")
response.close()
return response.status_code == 200
except Exception as e:
print(f"Ошибка проверки интернет-соединения: {e}")
return False
# Настройка пинов для светодиодов
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):
if client: # Проверка, что клиент MQTT определен
client.publish(TOPIC_TEMP, str(temperature))
client.publish(TOPIC_HUMIDITY, str(humidity))
print(f"Данные отправлены на сервер MQTT: Temp={temperature}, Humidity={humidity}")
else:
print("MQTT client is not connected. Data not sent.")
# Функция для обработки сообщений MQTT
def on_message(topic, msg):
if topic.decode() == TOPIC_NEOPIXEL:
try:
data = msg.decode().strip()
parts = data.split(":")
if len(parts) == 2:
led_index = int(parts[0])
rgb_values = list(map(int, parts[1].split(",")))
if 0 <= led_index < NUM_PIXELS and len(rgb_values) == 3:
for i in range(NUM_PIXELS):
ring[i] = (0, 0, 0)
ring[led_index] = (rgb_values[0], rgb_values[1], rgb_values[2])
ring.write()
print(f"Updated NeoPixel {led_index} to color {rgb_values}")
else:
print(f"Invalid NeoPixel data: {data}")
except ValueError as e:
print(f"Error parsing NeoPixel data: {e}")
# Подключение к MQTT
def connect_and_publish():
try:
client = MQTTClient(CLIENT_ID, MQTT_BROKER)
client.connect()
print("Подключение к MQTT-брокеру установлено")
client.set_callback(on_message)
client.subscribe(TOPIC_NEOPIXEL)
return client
except OSError as e:
print(f"Ошибка подключения к MQTT: {e}")
time.sleep(5)
return None
# Функция переподключения к MQTT
def reconnect_mqtt(client):
print("Попытка переподключения MQTT...")
if client:
try:
client.disconnect()
except Exception as e:
print("Error while disconnecting:",e)
time.sleep(5)
new_client = connect_and_publish()
if new_client:
print("Успешно переподключено к MQTT.")
return new_client
else:
print("Не удалось переподключиться к MQTT.")
return client
# Инициализация LCD
lcd.init()
lcd.clear()
# Подключение к Wi-Fi
connect_to_wifi()
# Основной цикл
if check_internet_connection():
print("Интернет-соединение установлено. Подключение к MQTT...")
client = connect_and_publish()
if client:
while True:
try:
dht_sensor.measure()
temperature = dht_sensor.temperature()
humidity = dht_sensor.humidity()
# Выводим данные на LCD
lcd.clear()
lcd.putstr(f"Temp: {temperature:.1f} C")
lcd.move_to(0, 1)
lcd.putstr(f"Hum: {humidity:.1f} %")
# Отправляем данные на 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)
client.check_msg()
time.sleep(2)
except OSError as e:
print("Ошибка считывания DHT22:", e)
client = reconnect_mqtt(client)
except Exception as e:
print("Ошибка:", e)
time.sleep(10)
else:
print("Не удалось подключиться к MQTT. Завершение работы.")
else:
print("Нет интернет-соединения. Невозможно подключиться к MQTT.")
while True:
time.sleep(10)