from machine import Pin, I2C, ADC
import time, network, urequests, dht
from ssd1306 import SSD1306_I2C
# ---------- WiFi ----------
SSID = "Wokwi-GUEST"
PASSWORD = ""
API_KEY = "WMIMS1I4DZT5BFG4"
# ---------- Pins ----------
RELAY_ACTIVE_LOW = True
relay_pins = []
for gpio in (2, 3, 4, 5):
p = Pin(gpio, Pin.OUT)
p.value(1 if RELAY_ACTIVE_LOW else 0) # OFF state
relay_pins.append(p)
button_pins = [Pin(i, Pin.IN, Pin.PULL_UP) for i in (6, 7, 8, 9)]
BUZZER_ACTIVE_LOW = True
buzzer = Pin(11, Pin.OUT)
buzzer.value(1 if BUZZER_ACTIVE_LOW else 0) # OFF
ir_pin = Pin(10, Pin.IN)
dht22 = dht.DHT22(Pin(12))
mq2 = ADC(26)
# ---------- OLED ----------
i2c = I2C(0, scl=Pin(1), sda=Pin(0))
oled = SSD1306_I2C(128, 64, i2c)
# ---------- Switch State ----------
switch_state = [0, 0, 0, 0]
emergency = 0
# ---------- IR Codes ----------
IR_CODES = {
0xcf30ff00: 0,
0xe718ff00: 1,
0x857aff00: 2,
0xef10ff00: 3,
0x5da2ff00: "EMERGENCY"
}
# ---------- IR Decoder (NEC) ----------
ir_pulses = []
last_time = 0
ir_done = False
def ir_irq(pin):
global last_time, ir_pulses, ir_done
now = time.ticks_us()
dt = time.ticks_diff(now, last_time)
last_time = now
if dt > 10000: # new frame
ir_pulses = []
else:
ir_pulses.append(dt)
if len(ir_pulses) >= 66:
ir_done = True
ir_pin.irq(
trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING,
handler=ir_irq
)
def read_ir_code():
global ir_done
if not ir_done:
return None
ir_done = False
if len(ir_pulses) < 66:
return None
code = 0
idx = 2 # skip leading pulse
for bit in range(32):
high = ir_pulses[idx + 1]
if high > 1000:
code |= (1 << bit)
idx += 2
return code
# ---------- WiFi Connect ----------
def wifi_connect():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)
while not wlan.isconnected():
time.sleep(1)
print("WiFi Connected")
# ---------- OLED Update ----------
def update_oled(temp, hum, gas):
oled.fill(0)
oled.text("HOME AUTOMATION", 0, 0)
for i in range(4):
oled.text(f"S{i+1}: {'ON' if switch_state[i] else 'OFF'}",
0 if i < 2 else 64, 12 + (i % 2) * 10)
oled.text(f"T:{temp}C H:{hum}%", 0, 36)
oled.text(f"GAS:{gas}", 0, 46)
oled.text("EMERGENCY!" if emergency else "", 0, 56)
oled.show()
# ---------- ThingSpeak ----------
def send_thingspeak(temp, hum, gas):
switch_mask = sum((switch_state[i] << i) for i in range(4))
url = (
"https://api.thingspeak.com/update?"
f"api_key={API_KEY}"
f"&field1={temp}&field2={hum}"
f"&field3={gas}&field4={emergency}"
f"&field5={switch_mask}"
)
try:
urequests.get(url).close()
print("Data send Sucessfully")
except:
print("ThingSpeak Error")
button_event = [0, 0, 0, 0]
last_button_time = [0, 0, 0, 0]
def button_handler(pin):
now = time.ticks_ms()
for i, b in enumerate(button_pins):
if pin == b:
if time.ticks_diff(now, last_button_time[i]) > 250:
button_event[i] = 1
last_button_time[i] = now
for btn in button_pins:
btn.irq(trigger=Pin.IRQ_FALLING, handler=button_handler)
def toggle_switch(i):
switch_state[i] ^= 1
if RELAY_ACTIVE_LOW:
relay_pins[i].value(0 if switch_state[i] else 1)
else:
relay_pins[i].value(1 if switch_state[i] else 0)
print(f"Switch {i+1} -> {'ON' if switch_state[i] else 'OFF'}")
wifi_connect()
last_send = time.time()
while True:
# -------- IR handling --------
ir_code = read_ir_code()
if ir_code:
print("IR:", hex(ir_code)) # DEBUG – DO NOT REMOVE
if ir_code in IR_CODES:
action = IR_CODES[ir_code]
if action == "EMERGENCY":
emergency = 1
buzzer.value(0 if BUZZER_ACTIVE_LOW else 1)
else:
toggle_switch(action)
# -------- Button handling --------
for i in range(4):
if button_event[i]:
toggle_switch(i)
button_event[i] = 0
# -------- Sensors --------
try:
dht22.measure()
temp = dht22.temperature()
hum = dht22.humidity()
except:
temp, hum = 0, 0
gas = mq2.read_u16() >> 8
# -------- OLED --------
update_oled(temp, hum, gas)
# -------- ThingSpeak --------
if time.time() - last_send > 20:
send_thingspeak(temp, hum, gas)
last_send = time.time()
time.sleep_ms(1)Loading
pi-pico-w
pi-pico-w