from machine import Pin, I2C, PWM
from ssd1306 import SSD1306_I2C
import framebuf, sys
import utime
import dht
pix_res_x = 128
pix_res_y = 64
# Inisialisasi DHT22 di pin GP1
sensor = dht.DHT22(Pin(1))
# Inisialisasi buzzer aktif via PWM di GP15
buzzer = PWM(Pin(15))
buzzer.duty_u16(0) # Matikan awal
def init_i2c(scl_pin, sda_pin):
i2c_dev = I2C(1, scl=Pin(scl_pin), sda=Pin(sda_pin), freq=200000)
i2c_addr = [hex(ii) for ii in i2c_dev.scan()]
if not i2c_addr:
print('No I2C Display Found')
sys.exit()
else:
print("I2C Address : {}".format(i2c_addr[0]))
print("I2C Configuration: {}".format(i2c_dev))
return i2c_dev
def display_text(oled):
oled.text("Pembacaan Suhu", 7, 1)
oled.show()
def draw_degree_symbol(oled, x, y):
degree = bytearray([
0b01110,
0b10001,
0b10001,
0b01110,
0b00000
])
fb = framebuf.FrameBuffer(degree, 5, 5, framebuf.MONO_HLSB)
oled.blit(fb, x, y)
def buzzer_on():
buzzer.freq(1000)
buzzer.duty_u16(30000)
def buzzer_off():
buzzer.duty_u16(0)
def display_anima(oled):
while True:
try:
sensor.measure()
suhu = sensor.temperature()
kelembaban = sensor.humidity()
oled.fill_rect(0, 15, 128, 48, 0)
oled.text("Suhu : {:.1f}".format(suhu), 1, 15)
draw_degree_symbol(oled, 90, 15)
oled.text("C", 100, 15)
oled.text("Lembab: {:.1f} %".format(kelembaban), 1, 27)
# Cek suhu ekstrem
if suhu < 20:
oled.text("Terlalu Dingin!", 1, 45)
buzzer_on()
elif suhu > 40:
oled.text("Terlalu Panas!", 1, 45)
buzzer_on()
else:
oled.fill_rect(0, 45, 128, 10, 0)
buzzer_off()
oled.show()
except OSError:
oled.fill_rect(0, 20, 128, 20, 0)
oled.text("Sensor Error", 1, 25)
oled.show()
buzzer_off()
utime.sleep(2)
def main():
i2c_dev = init_i2c(scl_pin=27, sda_pin=26)
oled = SSD1306_I2C(pix_res_x, pix_res_y, i2c_dev)
display_text(oled)
display_anima(oled)
if __name__ == '__main__':
main()