from machine import Pin, Timer, I2C
from hcsr04 import HCSR04
import ssd1306
import dht
import time

tim = Timer(0)

# Inisiasi pin I2C untuk OLED
i2c = I2C(scl=Pin(22), sda=Pin(21))
display = ssd1306.SSD1306_I2C(128, 64, i2c, 0x3c)

# Inisiasi pin untuk DHT22
p15 = Pin(27, Pin.IN)
d = dht.DHT22(p15)

# Inisiasi sensor HC-SR04
sensor = HCSR04(trigger_pin=14, echo_pin=18, echo_timeout_us=10000)

# Inisiasi pin untuk LED
led_green = Pin(23, Pin.OUT)
led_yellow = Pin(25, Pin.OUT)
led_red = Pin(26, Pin.OUT)

# Global variable untuk jarak
distance = 0

# Function to handle timer interrupt
def handleInterrupt(timer):
    global distance
    try:
        distance = sensor.distance_cm()
    except OSError as e:
        distance = -1  # Set distance to -1 on error
    print('Distance:', distance, 'cm')

# Start the timer dengan periode 1000 ms (1 detik) dan memanggil handleInterrupt
tim.init(period=1000, mode=Timer.PERIODIC, callback=handleInterrupt)

while True:
    d.measure()   # pengukuran suhu dan kelembaban
    t = d.temperature()    # pembacaan suhu
    h = d.humidity()       # pembacaan kelembaban

    print('Temperature : {:.1f} C, Humidity : {:.1f} %'.format(t, h))   # menampilkan suhu dan kelembaban pada serial monitor
    print('Distance : {:.2f} cm'.format(distance))  # menampilkan jarak pada serial monitor

    time.sleep(1)      # delay 1 detik

    display.fill(0)  # clear the screen
    display.text('Abdulloh', 0, 0, 1)
    display.text('20220120034', 0, 12, 1)
    display.text("Tem: {:.1f} C".format(t), 0, 24)  # menampilkan suhu pada OLED
    display.text("Hum: {:.1f} %".format(h), 0, 36)    # menampilkan kelembaban pada OLED
    display.text("Distance: {:.2f} cm".format(distance), 0, 48)   # menampilkan jarak pada OLED
    display.show()

    if distance >= 0:  # hanya jika jarak valid
        if distance < 10:  # jika jarak kurang dari 10 maka LED hijau akan menyala
            led_green.value(1)  # LED hijau on
            led_yellow.value(0)  # LED kuning off
            led_red.value(0)  # LED merah off
        elif distance < 15:  # jika jarak kurang dari 15 maka LED kuning akan menyala
            led_green.value(0)  # LED hijau off
            led_yellow.value(1)  # LED kuning on
            led_red.value(0)  # LED merah off
        elif distance < 20:  # jika jarak kurang dari 20 maka LED merah akan menyala
            led_green.value(0)  # LED hijau off
            led_yellow.value(0)  # LED kuning off
            led_red.value(1)  # LED merah on
        else:  # jika jarak lebih dari 20 maka semua LED akan mati
            led_green.value(0)  # LED hijau off
            led_yellow.value(0)  # LED kuning off
            led_red.value(0)  # LED merah off
    else:  # jika jarak tidak valid maka semua LED akan mati
        led_green.value(0)
        led_yellow.value(0)
        led_red.value(0)