from machine import Pin, ADC, I2C
from time import sleep
from i2c_lcd import I2cLcd
import ds1307
import utime
# I2C setup
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
# LCD setup
lcd = I2cLcd(i2c, 0x27, 2, 16)
# RTC setup
rtc = ds1307.DS1307(i2c)
# Sensor pins
ldr = ADC(Pin(13))
ldr.atten(ADC.ATTN_11DB)
soil = ADC(Pin(12))
soil.atten(ADC.ATTN_11DB)
# RGB LED pins
led_r = Pin(26, Pin.OUT)
led_g = Pin(27, Pin.OUT)
led_b = Pin(14, Pin.OUT)
# Relay
relay = Pin(15, Pin.OUT)
# Button
button = Pin(25, Pin.IN, Pin.PULL_DOWN)
# Mode flag
manual_mode = False
def update_lcd(temperature, light, mode):
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr("T:{}C L:{:.0f}".format(temperature, light))
lcd.move_to(0, 1)
lcd.putstr("Mode: {}".format("Manual" if mode else "Auto"))
def read_temp(raw):
# Assuming 0-3.3V = 0-100°C, scale accordingly
voltage = raw / 4095 * 3.3
temperature = (voltage / 3.3) * 100
return round(temperature, 1)
def set_led(r, g, b):
led_r.value(r)
led_g.value(g)
led_b.value(b)
# Optional: set RTC time once (uncomment to use)
# rtc.datetime((2025, 7, 17, 4, 23, 0, 0, 0))
last_button = 0
lcd_timer = 0
while True:
now = utime.ticks_ms()
# Read sensors
soil_raw = soil.read()
ldr_raw = ldr.read()
temp = read_temp(soil_raw)
light = ldr_raw / 4095 * 100
# Handle push button with debounce
if button.value() == 1 and utime.ticks_diff(now, last_button) > 500:
manual_mode = not manual_mode
last_button = now
# LED behavior
if manual_mode:
set_led(1, 1, 1) # White = all ON
relay.value(1)
else:
set_led(0, 0, 0)
relay.value(0)
# LCD update every 1s
if utime.ticks_diff(now, lcd_timer) > 1000:
update_lcd(temp, light, manual_mode)
lcd_timer = now
sleep(0.05)