from machine import Pin, PWM, I2C
from time import sleep
import utime
from dht import DHT22
from pico_i2c_lcd import I2cLcd
# RTC used
import ds3231
# Buzzer control
buzzer = None
def buzzer_on(freq=1000, duty_value=5000):
global buzzer
if buzzer is None:
buzzer = PWM(Pin(19))
buzzer.freq(freq)
buzzer.duty_u16(duty_value)
def buzzer_off():
global buzzer
if buzzer is not None:
buzzer.duty_u16(0)
# DHT22 Setup
dht = DHT22(Pin(16))
# I2C for LCD & RTC
i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=400000)
# Get I2C address for LCD
I2C_ADDR = i2c.scan()[0]
# LCD object (16x2)
lcd = I2cLcd(i2c, I2C_ADDR, 2, 16)
# RTC object (DS3231)
rtc = ds3231.DS3231(i2c)
# LEDs
red_led = Pin(27, Pin.OUT) # Red LED GP27
green_led = Pin(26, Pin.OUT) # Green LED GP26
# LDR Module
ldr = Pin(20, Pin.IN)
# Alert state tracking
alert_active = False
buzzer_start_time = 0
print("Temperature & Humidity Monitor Started")
while True:
try:
# Get sensor readings
dht.measure()
temp = dht.temperature()
hum = dht.humidity()
# Read LDR Module (Digital Output) -->no ADC so cannot get the analog output
light_value = ldr.value()
light_status = "LOW" if light_value == 0 else "HIGH"
# Get real time from RTC
year, month, day, weekday, hour, minute, second, _ = rtc.datetime()
# LCD Display
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr(f"{hour:02}:{minute:02}:{second:02} {day:02}/{month:02}")
lcd.move_to(0, 1)
lcd.putstr(f"T:{temp:.1f}C H:{hum:.1f}%")
current_time = utime.ticks_ms()
temp_high = temp > 30 # Temperature > 30°C
humidity_low = hum < 30 # Humidity < 30%
if temp_high or humidity_low:
# ALERT CONDITIONS: Red LED + Buzzer
red_led.value(0)
green_led.value(1)
if not alert_active:
buzzer_on()
buzzer_start_time = current_time
alert_active = True
print(f"ALERT, Temp: {temp:.1f}°C, Humidity: {hum:.1f}%")
if temp_high:
print("- Temperature is HIGH (>30°C)")
if humidity_low:
print("- Humidity is LOW (<30%)")
#elif utime.ticks_diff(current_time, buzzer_start_time) > 1000: # 1 second
# Turn off buzzer after 1 second, but keep red LED on
#buzzer_off()
else:
# NORMAL CONDITIONS: Green LED (no buzzer)
green_led.value(0)
red_led.value(1)
buzzer_off()
alert_active = False
print(f"Normal conditions - Temp: {temp:.1f}°C, Humidity: {hum:.1f}%")
except Exception as e:
print(f"Sensor Error: {e}")
# Turn off everything in case of error
red_led.value(1)
green_led.value(1)
buzzer_off()
lcd.clear()
lcd.putstr("SENSOR ERROR")
sleep(2) # Update every 2 seconds