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)