import machine
import time
import dht
from machine import Pin, SoftI2C
from lcd_api import LcdApi
from i2c_lcd import I2cLcd  # Thư viện LCD I2C từ Wokwi

# Định nghĩa các chân
TRIG_PIN = 14
ECHO_PIN = 12
DHT_PIN = 4
LIGHT_SENSOR_PIN = 33  # Chân DO của cảm biến ánh sáng
LED_PIN = 16

# Địa chỉ I2C và thông số LCD
I2C_ADDR = 0x27  # Địa chỉ I2C của màn hình LCD (có thể là 0x27 hoặc 0x3F)
TOTAL_ROWS = 2    # Số hàng của màn hình LCD
TOTAL_COLUMNS = 16 # Số cột của màn hình LCD

# Khởi tạo cảm biến DHT22
dht_sensor = dht.DHT22(Pin(DHT_PIN))

# Khởi tạo I2C (phần cứng I2C)
i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=100000)

# Khởi tạo màn hình LCD I2C
lcd = I2cLcd(i2c, I2C_ADDR, TOTAL_ROWS, TOTAL_COLUMNS)

# Khởi tạo các chân
trigger = Pin(TRIG_PIN, Pin.OUT)
echo = Pin(ECHO_PIN, Pin.IN)
led = Pin(LED_PIN, Pin.OUT)

# Khởi tạo chân cảm biến ánh sáng DO (Digital Output)
light_sensor = Pin(LIGHT_SENSOR_PIN, Pin.IN)

def get_distance():
    # Gửi tín hiệu siêu âm
    trigger.value(0)
    time.sleep_us(2)
    trigger.value(1)
    time.sleep_us(10)
    trigger.value(0)
    
    # Đo thời gian phản hồi từ cảm biến
    pulse_duration = machine.time_pulse_us(echo, 1)
    distance = (pulse_duration / 2) / 29.1  # Công thức tính khoảng cách
    return distance

def read_light():
    # Đọc giá trị digital từ cảm biến ánh sáng
    light_level = light_sensor.value()  # Đọc giá trị 0 hoặc 1 từ chân DO
    return light_level

def update_lcd(distance, temperature, humidity, light_level):
    # Hiển thị thông tin lên LCD
    lcd.clear()
    lcd.putstr("Rac: {:.1f} cm".format(distance))
    lcd.move_to(0, 1)
    lcd.putstr("T: {:.1f}C H: {:.1f}%".format(temperature, humidity))

def main():
    while True:
        # Đo khoảng cách từ cảm biến siêu âm
        distance = get_distance()
        
        # Đọc nhiệt độ và độ ẩm từ cảm biến DHT22
        dht_sensor.measure()
        temperature = dht_sensor.temperature()  # Nhiệt độ (C)
        humidity = dht_sensor.humidity()       # Độ ẩm (%)
        
        # Đọc giá trị ánh sáng từ cảm biến ánh sáng (DO)
        light_level = read_light()

        # Cập nhật thông tin lên màn hình LCD
        update_lcd(distance, temperature, humidity, light_level)

        # Nếu thùng rác đầy (khoảng cách < 10 cm), bật LED
        if distance < 10:
            led.value(1)  # Bật LED
        else:
            led.value(0)  # Tắt LED

        # Chờ 2 giây trước khi tiếp tục
        time.sleep(2)

if __name__ == "__main__":
    main()
$abcdeabcde151015202530fghijfghij