from machine import Pin, I2C, UART
from i2c_lcd import I2cLcd
import time
# ---------- UART Setup ----------
uart_connection = UART(1, baudrate=9600, tx=Pin(17), rx=Pin(16))
print("UART START")
# ---------- Hardware Setup ----------
i2c_bus = I2C(0, scl=Pin(22), sda=Pin(21))
found_devices = i2c_bus.scan()
if not found_devices:
raise RuntimeError("No LCD!")
lcd_display = I2cLcd(i2c_bus, found_devices[0], 2, 16)
# ---------- Display Function ----------
def show_reading(temperature, humidity, door_state, gas_value):
lcd_display.clear()
# Gas Alert
if gas_value == 0:
lcd_display.move_to(0, 0)
lcd_display.putstr("GAS ALERT!")
lcd_display.move_to(0, 1)
lcd_display.putstr("Ventilate NOW")
return
# Normal Display
lcd_display.move_to(0, 0)
lcd_display.putstr("T:{:.1f} H:{:.1f}".format(temperature, humidity))
lcd_display.move_to(0, 1)
lcd_display.putstr(("Door:" + door_state)[:16])
# ---------- Startup ----------
def show_waiting():
lcd_display.clear()
lcd_display.move_to(1, 0)
lcd_display.putstr("Wait for data")
lcd_display.move_to(5, 1)
lcd_display.putstr("......")
show_waiting()
time.sleep(2)
# ---------- Previous Values ----------
last_payload = None
last_gas = None
# ---------- Main Loop ----------
while True:
if uart_connection.any():
raw_uart_data = uart_connection.readline()
if raw_uart_data:
decoded_string = raw_uart_data.decode().strip()
print("RECEIVED:", decoded_string)
data_fields = decoded_string.split(",")
if len(data_fields) != 5:
continue
try:
temperature = float(data_fields[0])
humidity = float(data_fields[1])
near_flag = int(data_fields[2])
door_state = data_fields[3]
gas_value = int(data_fields[4])
except:
continue
payload = (temperature, humidity, door_state)
# Only update LCD if something changed
if payload == last_payload and gas_value == last_gas:
continue
print(temperature, humidity, near_flag, door_state, gas_value)
show_reading(
temperature,
humidity,
door_state,
gas_value
)
last_payload = payload
last_gas = gas_value
time.sleep(0.2)