from machine import Pin, I2C, ADC, PWM
import ssd1306
import dht
import time
# OLED
i2c = I2C(0, scl=Pin(1), sda=Pin(0))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# Buzzer
buzzer = PWM(Pin(15))
# HC-SR04
TRIG = Pin(18, Pin.OUT)
ECHO = Pin(17, Pin.IN)
# MQ2
mq2 = ADC(Pin(28))
# DHT22
dht22 = dht.DHT22(Pin(16))
# Navigasi PB
btn_a = Pin(10, Pin.IN, Pin.PULL_UP)
btn_b = Pin(11, Pin.IN, Pin.PULL_UP)
btn_c = Pin(12, Pin.IN, Pin.PULL_UP)
menu_index = 0
page = 0
menu_items = ["HCSR", "MQ2", "DHT22"]
# Fungsi bunyi buzzer
def bunyikan_buzzer(ms=500, freq=1000):
buzzer.freq(freq)
buzzer.duty_u16(3000)
time.sleep_ms(ms)
buzzer.duty_u16(0)
# Fungsi Sensor
def baca_hcsr04():
TRIG.low()
time.sleep_us(2)
TRIG.high()
time.sleep_us(10)
TRIG.low()
while ECHO.value() == 0:
t1 = time.ticks_us()
while ECHO.value() == 1:
t2 = time.ticks_us()
durasi = time.ticks_diff(t2, t1)
jarak = durasi * 0.0343 / 2
return round(jarak, 1)
def baca_mq2():
adc_value = mq2.read_u16() >> 6
ppm = round(adc_value / 1023 * 1000, 1)
return ppm
def baca_dht22():
try:
dht22.measure()
return dht22.temperature(), dht22.humidity()
except:
return None, None
# Menu dan sensor
def tampilkan_menu():
oled.fill(0)
oled.text("MENU", 45, 0)
oled.text("MADE BY ADHIT", 10, 53)
for i, item in enumerate(menu_items):
prefix = ">" if i == menu_index else " "
oled.text(f"{prefix} {item}", 10, 15 + i * 12)
oled.show()
def tampilkan_sensor():
global page
oled.fill(0)
if page == 1:
jarak = baca_hcsr04()
oled.text("HC-SR04", 27, 0)
oled.text("MADE BY ADHIT", 10, 53)
oled.text(f"JARAK: {jarak} cm", 5, 25)
if jarak < 10 or jarak > 120:
bunyikan_buzzer()
elif page == 2:
gas = baca_mq2()
oled.text("MQ2 Sensor", 15, 0)
oled.text("MADE BY ADHIT", 10, 53)
oled.text(f"GAS: {gas} ppm", 5, 25)
if gas > 450:
bunyikan_buzzer()
elif page == 3:
suhu, hum = baca_dht22()
oled.text("DHT22", 35, 0)
oled.text("MADE BY ADHIT", 10, 53)
if suhu is not None:
oled.text(f"TEMP:{suhu}C", 5, 20)
oled.text(f"HUM:{hum}%", 5, 35)
if suhu < 20 or suhu > 40:
bunyikan_buzzer()
else:
oled.text("Error Baca", 10, 30)
bunyikan_buzzer()
oled.show()
def main():
global page, menu_index
tampilkan_menu()
while True:
if btn_a.value() == 0:
if page == 0:
menu_index = (menu_index + 1) % len(menu_items)
tampilkan_menu()
time.sleep(0.3)
if btn_b.value() == 0:
if page == 0:
page = menu_index + 1
time.sleep(0.3)
if btn_c.value() == 0:
if page != 0:
page = 0
buzzer.duty_u16(0)
tampilkan_menu()
time.sleep(0.3)
if page != 0:
tampilkan_sensor()
time.sleep(0.1)
main()