import urequests # библиотека для отправки HTTP-запросов
from machine import I2C, Pin, PWM
from neopixel import NeoPixel # библиотека для работы с NeoPixel
from time import sleep
import dht # библиотека для работы с датчиком DHT
from pico_i2c_lcd import I2cLcd # библиотека для работы с LCD
# Инициализация I2C и LCD
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
I2C_ADDR = i2c.scan()[0]
lcd = I2cLcd(i2c, I2C_ADDR, 2, 16)
# Инициализация PIR-датчиков
pir_living_room = Pin(10, Pin.IN)
pir_kitchen = Pin(11, Pin.IN)
pir_restroom = Pin(12, Pin.IN)
# Инициализация зуммера
buzzer = PWM(Pin(16))
# Инициализация датчика DHT22
dht_sensor = dht.DHT22(Pin(15))
# Инициализация NeoPixel
NUM_PIXELS = 9 # количество светодиодов
neo_pin = Pin(2, Pin.OUT) # GPIO для NeoPixel
pixels = NeoPixel(neo_pin, NUM_PIXELS)
# Укажите URL вашего сервера
SERVER_URL = "https://6e57-2a01-b340-62-5b8b-29f5-b1fb-4d42-6710.ngrok-free.app/api/events" # замените на ваш адрес
# Функция для управления NeoPixel (эффект гирлянды)
def neopixel_effect(color=(255, 0, 0)):
for i in range(NUM_PIXELS):
pixels[i] = color # установить цвет для текущего светодиода
pixels.write() # обновить гирлянду
sleep(0.1) # задержка
pixels[i] = (0, 0, 0) # выключить текущий светодиод
pixels.write() # отключить все светодиоды
# Функция для отображения сообщений на экране
def display_message(line1, line2):
lcd.clear()
lcd.putstr(line1)
lcd.move_to(0, 1)
lcd.putstr(line2)
# Функция для отправки данных на сервер
def send_to_server(data):
try:
response = urequests.post(SERVER_URL, json=data)
print("Data sent to server:", response.text)
response.close()
except Exception as e:
print("Failed to send data to server:", e)
# Функция для обработки движения
def handle_motion(room):
display_message(f"Motion in {room}!", "ALARM!")
print(f"ALARM! Motion detected in {room}!")
# Отправка данных на сервер
send_to_server({"event_type": "motion", "room": room})
# Индикация с помощью зуммера и гирлянды
for _ in range(5): # 5 звуковых сигналов
buzzer.duty_u16(32768) # Включение зуммера
neopixel_effect((0, 255, 0)) # эффект гирлянды (зелёный цвет)
buzzer.duty_u16(0) # Выключение зуммера
sleep(0.1)
# Функция для обработки опасных условий DHT22
def handle_danger(temp, hum):
display_message("DANGER!", "Check Env!")
print(f"WARNING! Dangerous conditions! Temp: {temp}°C, Hum: {hum}%")
# Отправка данных на сервер
send_to_server({"event_type": "danger", "temperature": temp, "humidity": hum})
# Звуковой сигнал тревоги и гирлянда
for _ in range(5): # 5 звуковых сигналов
buzzer.duty_u16(32768) # Включение зуммера
neopixel_effect((255, 0, 0)) # эффект гирлянды (красный цвет)
buzzer.duty_u16(0) # Выключение зуммера
sleep(0.1)
# Функция для проверки температуры и влажности
def check_environment():
try:
dht_sensor.measure() # Измерение данных
temp = dht_sensor.temperature()
hum = dht_sensor.humidity()
print(f"Temperature: {temp}°C, Humidity: {hum}%")
# Проверка опасных условий
if temp > 35 or hum > 80 or (temp > 30 and hum > 70):
handle_danger(temp, hum)
else:
display_message(f"Temp: {temp}C", f"Hum: {hum}%")
except OSError as e:
print("Failed to read from DHT sensor.")
# Основной цикл
while True:
if pir_living_room.value():
handle_motion("Living Room")
sleep(2) # Задержка после обработки
elif pir_kitchen.value():
handle_motion("Kitchen")
sleep(2)
elif pir_restroom.value():
handle_motion("Restroom")
sleep(2)
else:
# Если движения нет, проверить данные с DHT22
check_environment()
sleep(2) # Обновление каждые 2 секунды