# Итоговая работа: Умная теплица_Онищук
import dht
from machine import Pin, ADC, PWM
import utime
# --- Инициализация датчиков ---
sensor_dht = dht.DHT22(Pin(15)) # Датчик температуры
sensor_ldr = ADC(Pin(26)) # Датчик освещенности (АЦП)
sensor_pir = Pin(14, Pin.IN) # Датчик движения
# --- Инициализация исполнительных устройств ---
led_vent = Pin(2, Pin.OUT) # Синий LED (Вентиляция)
led_light = Pin(3, Pin.OUT) # Желтый LED (Освещение)
buzzer = PWM(Pin(11)) # Пьезодинамик (Сигнализация)
# --- Аварийная кнопка ---
# Используем внутреннюю подтяжку (PULL_UP), чтобы пин по умолчанию выдавал 1
btn_emergency = Pin(16, Pin.IN, Pin.PULL_UP)
# Флаг текущего состояния (Авария или Норма)
emergency_mode = False
def trigger_beep():
"""Короткий звуковой сигнал для отпугивания вредителей"""
buzzer.freq(800)
buzzer.duty_u16(32768)
utime.sleep(0.2)
buzzer.duty_u16(0)
while True:
# 1. Проверка аварийной кнопки (с программным антидребезгом)
if btn_emergency.value() == 0: # Если кнопка нажата
utime.sleep_ms(50) # Задержка для подавления дребезга
if btn_emergency.value() == 0: # Проверяем еще раз
emergency_mode = not emergency_mode # Меняем режим
if emergency_mode:
print("!!! АВАРИЯ: СИСТЕМА ПРИНУДИТЕЛЬНО ОСТАНОВЛЕНА !!!")
# Выключаем все приборы
led_vent.value(0)
led_light.value(0)
# Включаем непрерывную сирену
buzzer.freq(1000)
buzzer.duty_u16(32768)
else:
print("Система возвращена в штатный режим.")
buzzer.duty_u16(0) # Выключаем сирену
utime.sleep(1) # Защита от случайного двойного клика
# 2. Нормальная работа системы (если нет аварии)
if not emergency_mode:
try:
# Считываем данные
sensor_dht.measure()
temp = sensor_dht.temperature()
light = sensor_ldr.read_u16()
motion = sensor_pir.value()
print(f"Температура: {temp}°C | Освещенность: {light} | Движение: {motion}")
# Логика 1: Контроль климата
if temp > 28.0:
led_vent.value(1) # Жарко - включаем вентиляцию (синий LED)
else:
led_vent.value(0)
# Логика 2: Контроль света (в Wokwi темнота дает большие значения АЦП)
if light > 40000:
led_light.value(1) # Темно - включаем фитолампы (желтый LED)
else:
led_light.value(0)
# Логика 3: Охрана от грызунов/вредителей
if motion == 1:
trigger_beep() # Замечено движение - включаем отпугиватель (писк)
except OSError:
print("Ошибка чтения данных с датчика DHT22")
utime.sleep(0.5) # Пауза перед следующим измерением