from machine import Pin, I2C
import ssd1306
import dht
import time

# ESP32 Pin assignment 
i2c = I2C(0, scl=Pin(22), sda=Pin(21))

oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)

oled.text('Bui Trung Kien!', 10, 10)      
oled.show()
time.sleep(2)

# Định nghĩa các chân GPIO
dht_pin = Pin(21, Pin.IN, Pin.PULL_UP)  # Chân dữ liệu của cảm biến DHT
led_green = Pin(22, Pin.OUT)            # Chân LED xanh
led_red = Pin(23, Pin.OUT)              # Chân LED đỏ
led_yellow = Pin(19, Pin.OUT)           # Chân LED vàng

# Khởi tạo cảm biến DHT11
sensor = dht.DHT22(dht_pin)

# Khởi tạo màn hình OLED
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)  # Giao tiếp I2C với màn hình OLED
oled = ssd1306.SSD1306_I2C(128, 64, i2c)             # Kích thước màn hình OLED 128x64

# Đặt ngưỡng nhiệt độ và độ ẩm
temp_threshold_high = 35.0
temp_threshold_low = 10.0
humidity_threshold_high = 70.0
humidity_threshold_low = 30.0

while True:
    # Đọc dữ liệu từ cảm biến
    sensor.measure()
    temperature = sensor.temperature()
    humidity = sensor.humidity()

    # Hiển thị thông tin trên màn hình OLED
    oled.fill(0)
    oled.text('Temp: {:.1f} do C'.format(temperature), 0, 0)
    oled.text('Humidity: {:.1f} %'.format(humidity), 0, 10)
    oled.show()

    # Điều khiển LED dựa trên nhiệt độ
    if temperature < temp_threshold_low:
        led_red.value(1)       # LED đỏ sáng
        
    elif temperature > temp_threshold_high:
        led_red.value(1)       # LED đỏ sáng
        time.sleep(0.5)        # Đợi 0.5 giây
        led_red.value(0)       # Tắt LED đỏ
        time.sleep(0.5)        # Đợi 0.5 giây
        # LED đỏ nháy
        led_green.value(0)     # LED xanh tắt
        led_yellow.value(0)    # LED vàng tắt
    else:
        led_red.value(0)       # LED đỏ tắt
        led_green.value(0)     # LED xanh tắt
        led_yellow.value(0)    # LED vàng tắt

    # Điều khiển LED dựa trên độ ẩm
    if humidity < humidity_threshold_low:
        led_yellow.value(1)    # LED vàng sáng
        
    elif humidity > humidity_threshold_high:
        led_yellow.value(1)    # LED vàng nháy
        time.sleep(0.5)        # Đợi 0.5 giây
        led_yellow.value(0)    # Tắt LED vàng
        time.sleep(0.5)        # Đợi 0.5 giây
        led_red.value(0)       # LED đỏ tắt
        led_green.value(0)     # LED xanh tắt
    else:
        led_yellow.value(0)    # LED vàng tắt
        led_red.value(0)       # LED đỏ tắt
        led_green.value(0)     # LED xanh tắt
    if temperature < temp_threshold_low and  humidity > humidity_threshold_high :
        led_red.value(1)       # LED đỏ sáng
        led_yellow.value(1)    # LED vàng nháy
        time.sleep(0.5)        # Đợi 0.5 giây
        led_yellow.value(0)    # Tắt LED vàng
        time.sleep(0.5)        # Đợi 0.5 giây
        led_green.value(0)     # LED xanh tắt
    elif temperature > temp_threshold_high and humidity < humidity_threshold_low :
        led_red.value(1)       # LED đỏ sáng
        time.sleep(0.5)        # Đợi 0.5 giây
        led_red.value(0)       # Tắt LED đỏ
        time.sleep(0.5)        # Đợi 0.5 giây
        # LED đỏ nháy
        led_green.value(0)     # LED xanh tắt
        led_yellow.value(1)    # LED vàng sáng

    #time.sleep(5)  # Đợi 1 giây trước khi đọc dữ liệu lại