import time
import dht
from machine import Pin, SoftI2C
# ==========================================
# CLASS DRIVER LCD I2C (STANDALONE)
# ==========================================
class LCDI2C:
def __init__(self, i2c, addr=0x27):
self.i2c = i2c
self.addr = addr
self.backlight = 0x08
time.sleep_ms(20)
self._write_init_nibble(0x03)
self._write_init_nibble(0x03)
self._write_init_nibble(0x03)
self._write_init_nibble(0x02)
self.cmd(0x28)
self.cmd(0x0C)
self.clear()
def _write_init_nibble(self, nibble):
byte = (nibble << 4) | self.backlight
self.i2c.writeto(self.addr, bytes([byte | 0x04, byte]))
def cmd(self, command):
byte = (command & 0xF0) | self.backlight
self.i2c.writeto(self.addr, bytes([byte | 0x04, byte]))
byte = ((command << 4) & 0xF0) | self.backlight
self.i2c.writeto(self.addr, bytes([byte | 0x04, byte]))
def data(self, char_code):
byte = (char_code & 0xF0) | self.backlight | 0x01
self.i2c.writeto(self.addr, bytes([byte | 0x04, byte]))
byte = ((char_code << 4) & 0xF0) | self.backlight | 0x01
self.i2c.writeto(self.addr, bytes([byte | 0x04, byte]))
def clear(self):
self.cmd(0x01)
self.cmd(0x02)
time.sleep_ms(2)
def move_to(self, col, row):
addr = col & 0x3F
if row == 1:
addr += 0x40
self.cmd(0x80 | addr)
def print(self, text):
for char in text:
self.data(ord(char))
# ==========================================
# INISIALISASI HARDWARE ESP32
# ==========================================
DHT_PIN = 15
LED_HIJAU_PIN = 2
LED_MERAH_PIN = 4
BUZZER_PIN = 5
BATAS_SUHU = 30.0
sensor_dht = dht.DHT22(Pin(DHT_PIN))
led_hijau = Pin(LED_HIJAU_PIN, Pin.OUT)
led_merah = Pin(LED_MERAH_PIN, Pin.OUT)
buzzer = Pin(BUZZER_PIN, Pin.OUT)
# Inisialisasi Bus I2C & LCD
i2c = SoftI2C(sda=Pin(21), scl=Pin(22), freq=400000)
lcd = LCDI2C(i2c, addr=0x27)
# Tampilan Startup
lcd.clear()
lcd.move_to(0, 0)
lcd.print("Sistem Pengawas")
lcd.move_to(0, 1)
lcd.print("Suhu Ready...")
time.sleep(2)
lcd.clear()
print("--- Sistem Pengawas Suhu Siap (MicroPython) ---")
# ==========================================
# LOOP UTAMA SIMULASI
# ==========================================
while True:
try:
# Membaca Data DHT22
sensor_dht.measure()
suhu = sensor_dht.temperature()
kelembapan = sensor_dht.humidity()
# Baris 1 LCD: Suhu & Kelembapan
lcd.move_to(0, 0)
lcd.print(f"T:{suhu:.1f}C H:{int(kelembapan)}% ")
# Serial Monitor Output
print(f"Suhu: {suhu:.1f} °C | Kelembapan: {kelembapan:.0f} %")
# Logika Peringatan Ambang Suhu
if suhu >= BATAS_SUHU:
led_merah.value(1)
led_hijau.value(0)
buzzer.value(1)
lcd.move_to(0, 1)
lcd.print("Status: OVERHEAT!")
print("--> PERINGATAN: Suhu tinggi terdeteksi!")
else:
led_merah.value(0)
led_hijau.value(1)
buzzer.value(0)
lcd.move_to(0, 1)
lcd.print("Status: Normal ")
print("--> Status: Suhu Normal.")
except OSError:
print("Gagal membaca dari sensor DHT22!")
lcd.move_to(0, 0)
lcd.print("Error Sensor! ")
print("--------------------------------")
time.sleep(2)