from machine import Pin, ADC, I2C
import time
import ssd1306
# --- Setup Pin ---
TRIG = Pin(3, Pin.OUT)
ECHO = Pin(2, Pin.IN)
NTC = ADC(26) # GP26 = ADC0
BUZZER = Pin(20, Pin.OUT)
# I2C OLED
i2c = I2C(0, scl=Pin(1), sda=Pin(0))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# --- Fungsi Baca Ultrasonik (ketinggian) ---
def read_distance():
TRIG.low()
time.sleep_us(2)
TRIG.high()
time.sleep_us(10)
TRIG.low()
while ECHO.value() == 0:
start = time.ticks_us()
while ECHO.value() == 1:
end = time.ticks_us()
duration = time.ticks_diff(end, start)
distance_cm = (duration * 0.0343) / 2
return distance_cm
# --- Fungsi Baca Suhu dari NTC (estimasi sederhana) ---
def read_temperature():
adc_value = NTC.read_u16()
voltage = adc_value * 3.3 / 65535
# Rumus pendekatan suhu (disesuaikan berdasarkan sensor NTC)
temperature = (voltage - 0.5) * 100 # asumsi linear
return temperature
# --- Loop Utama ---
while True:
distance = read_distance() # dalam cm
temperature = read_temperature() # dalam °C
distance_meter = distance / 100 # ubah ke meter
buzzer_status = "OFF"
if distance_meter >= 0.1 or temperature >= 60:
BUZZER.on()
buzzer_status = "ON"
else:
BUZZER.off()
# Tampilkan di OLED
oled.fill(0)
oled.text("Ketinggian: {:.2f}m".format(distance_meter), 0, 0)
oled.text("Suhu: {:.1f}C".format(temperature), 0, 16)
oled.text("Buzzer: {}".format(buzzer_status), 0, 32)
oled.show()
time.sleep(1)