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()