from machine import Pin, ADC, PWM
import dht
import time
# === Пины ===
DHT_PIN = 15
LIGHT_PIN = 34
SOIL_PIN = 35
BUTTON_PIN = 13
BUZZER_PIN = 18
GREEN_LED_PIN = 21
RED_LED_PIN = 19
# === Пороги комфорта для животных ===
TEMP_MAX_SAFE = 30 # выше — опасно для животных
TEMP_MIN_SAFE = 5 # ниже — замерзают
HUMIDITY_MAX = 70 # выше — душно, риск болезней
HUMIDITY_MIN = 30 # ниже — сухо, страдают дыхательные пути
LIGHT_MIN = 1000 # слишком темно для активности
LIGHT_MAX = 3000 # слишком ярко (стресс)
SOIL_DRY_ALERT = 2500 # нет воды в поилке/земле
# === Инициализация ===
dht_sensor = dht.DHT22(Pin(DHT_PIN))
light_adc = ADC(Pin(LIGHT_PIN))
soil_adc = ADC(Pin(SOIL_PIN))
light_adc.atten(ADC.ATTN_11DB)
soil_adc.atten(ADC.ATTN_11DB)
button = Pin(BUTTON_PIN, Pin.IN, Pin.PULL_UP)
green_led = Pin(GREEN_LED_PIN, Pin.OUT)
red_led = Pin(RED_LED_PIN, Pin.OUT)
buzzer = PWM(Pin(BUZZER_PIN), duty=0)
emergency = False
last_button_time = 0
DEBOUNCE_MS = 250
# === Звуки ===
def alert_beep(times=1, freq=1200, duration=150):
for _ in range(times):
buzzer.freq(freq)
buzzer.duty(512)
time.sleep_ms(duration)
buzzer.duty(0)
time.sleep_ms(50)
def continuous_alarm(freq=2000):
buzzer.freq(freq)
buzzer.duty(512)
def silence():
buzzer.duty(0)
# === Аварийный режим ===
def animal_emergency(reason):
global emergency
emergency = True
green_led.off()
red_led.on()
continuous_alarm(2200)
print("\n[КРИТИЧЕСКАЯ ОПАСНОСТЬ ДЛЯ ЖИВОТНЫХ] ")
print("", reason)
print("ТРЕБУЕТСЯ НЕМЕДЛЕННОЕ ВМЕШАТЕЛЬСТВО!")
def reset_emergency():
global emergency
emergency = False
silence()
green_led.off()
red_led.off()
print("\n Система сброшена. Условия в вольере снова проверяются.\n")
# === Кнопка ===
def check_button():
global last_button_time
if button.value() == 0 and time.ticks_diff(time.ticks_ms(), last_button_time) > DEBOUNCE_MS:
last_button_time = time.ticks_ms()
return True
return False
# === Главный цикл ===
print("\n🐕🐈 МЕТЕОСТАНЦИЯ СПАСЕНИЯ ЖИВОТНЫХ 🐄🐖")
print("Контроль температуры, влажности, света и воды\n")
while True:
if check_button():
if emergency:
reset_emergency()
else:
animal_emergency("Ручная тревога — осмотр вольера")
if emergency:
time.sleep(0.3)
continue
try:
dht_sensor.measure()
temp = dht_sensor.temperature()
hum = dht_sensor.humidity()
light_val = light_adc.read()
soil_val = soil_adc.read()
print("\n === УСЛОВИЯ В ВОЛЬЕРЕ ===")
print(f"Температура: {temp} °C")
print(f" Влажность воздуха: {hum} %")
print(f" Освещённость: {light_val}")
print(f" Влажность почвы: {soil_val}")
green_led.on()
red_led.off()
silence()
problem = False
# === Критические угрозы жизни ===
if temp >= TEMP_MAX_SAFE:
animal_emergency(f" ОПАСНАЯ ЖАРА! {temp}°C — тепловой удар у животных")
continue
if temp <= TEMP_MIN_SAFE:
animal_emergency(f" ОПАСНЫЙ ХОЛОД! {temp}°C — риск переохлаждения")
continue
# === Предупреждения о дискомфорте ===
if hum >= HUMIDITY_MAX:
print(" [ПРЕДУПРЕЖДЕНИЕ] Слишком влажно — риск респираторных заболеваний")
red_led.on()
alert_beep(2, 1000, 100)
problem = True
elif hum <= HUMIDITY_MIN:
print(" [ПРЕДУПРЕЖДЕНИЕ] Воздух слишком сухой — страдают слизистые")
red_led.on()
alert_beep(2, 1000, 100)
problem = True
if light_val <= LIGHT_MIN:
print(" [ПРЕДУПРЕЖДЕНИЕ] Слишком темно — животные дезориентированы")
red_led.on()
alert_beep(1, 800, 200)
problem = True
elif light_val >= LIGHT_MAX:
print(" [ПРЕДУПРЕЖДЕНИЕ] Слишком ярко — стресс и беспокойство")
red_led.on()
alert_beep(1, 800, 200)
problem = True
if soil_val >= SOIL_DRY_ALERT:
print(" [ПРЕДУПРЕЖДЕНИЕ] Нет воды! Немедленно проверьте поилку")
red_led.on()
alert_beep(3, 1500, 150)
problem = True
if not problem:
print("[НОРМА] Животным комфортно. Условия в порядке.")
except Exception as e:
animal_emergency(f"Сбой датчиков — невозможно оценить безопасность: {e}")
time.sleep(2)