import machine
import utime
import ustruct
from ssd1306 import SSD1306_I2C
# === OLED Display ===
i2c = machine.I2C(0, scl=machine.Pin(1), sda=machine.Pin(0))
oled = SSD1306_I2C(128, 64, i2c)
# === SPI Setup (Receiver) ===
spi = machine.SPI(0, baudrate=1000000, polarity=0, phase=0)
cs = machine.Pin(17, machine.Pin.OUT)
cs.value(1)
# === Aktuator ===
relay = machine.Pin(18, machine.Pin.OUT)
led = machine.Pin(19, machine.Pin.OUT)
def update_display(suhu, rh, lux, gerak):
oled.fill(0)
oled.text("Suhu: {:.1f} C".format(suhu), 0, 0)
oled.text("RH: {:.1f}%".format(rh), 0, 10)
oled.text("Lux: {:.1f}".format(lux), 0, 20)
oled.text("Gerak: {}".format("Ada" if gerak else "Tidak"), 0, 30)
oled.show()
while True:
cs.value(0)
data = spi.read(16) # 4 float (16 bytes)
cs.value(1)
if data:
suhu, rh, lux, gerak = ustruct.unpack('ffff', data)
update_display(suhu, rh, lux, gerak)
led.value(1 if gerak else 0)
# === Logika kontrol aktuator ===
if suhu < 26 and rh > 90:
relay.value(1) # Nyalakan pemanas
elif suhu > 30 and rh < 75:
relay.value(0) # Matikan (anggap kipas otomatis)
elif lux < 50 and suhu < 30:
relay.value(1) # Tambahan pemanas saat gelap
else:
relay.value(0)
print("RX -> Suhu: {:.1f} | RH: {:.1f} | Lux: {:.1f} | Gerak: {}".format(
suhu, rh, lux, "Ada" if gerak else "Tidak"))
utime.sleep(2)