from machine import Pin, PWM, ADC
import time, dht
from machine import time_pulse_us
import network
from umqtt.simple import MQTTClient
import urequests
# ---------------- WiFi ----------------
SSID = "Wokwi-GUEST"
PASSWORD = ""
# MQTT Broker
BROKER = "broker.emqx.io"
PORT = 1883
TOPIC_SENSOR = b"smarthome/sensors"
TOPIC_CONTROL = b"smarthome/control"
CLIENT_ID = b"esp32-smarthome"
# Blynk Token
BLYNK_AUTH = "Xlc8GVWM0auSkwVjCjOChj1esHZZiosf"
# ---------------- Sensors ----------------
pir = Pin(14, Pin.IN)
ldr = ADC(Pin(34)); ldr.atten(ADC.ATTN_11DB)
gas = ADC(Pin(35)); gas.atten(ADC.ATTN_11DB)
dht_sensor = dht.DHT22(Pin(27))
trig = Pin(5, Pin.OUT); echo = Pin(18, Pin.IN)
# ---------------- Actuators ----------------
light = Pin(2, Pin.OUT)
fan = Pin(4, Pin.OUT)
buzzer = Pin(19, Pin.OUT)
alarm_led = Pin(21, Pin.OUT)
servo = PWM(Pin(22), freq=50)
# ---------------- WiFi Connect ----------------
def connect_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)
print("š Connecting WiFi...", end="")
while not wlan.isconnected():
print(".", end="")
time.sleep(0.5)
print("\nā
WiFi Connected:", wlan.ifconfig())
# ---------------- Sensor Functions ----------------
def measure_distance():
trig.value(0); time.sleep_us(2)
trig.value(1); time.sleep_us(10)
trig.value(0)
duration = time_pulse_us(echo, 1, 30000)
return (duration / 2) * 0.0343
def door_open():
servo.duty(120)
time.sleep(2)
servo.duty(40)
# ---------------- Send to Blynk ----------------
def blynk_update(pin, value):
try:
url = f"https://blr1.blynk.cloud/external/api/update?token={BLYNK_AUTH}&{pin}={value}"
urequests.get(url)
except:
print("ā ļø Blynk update failed")
# ---------------- MQTT Callback ----------------
def mqtt_callback(topic, msg):
cmd = msg.decode()
print(f"š© Control: {cmd}")
if cmd == "LIGHT_ON": light.value(1)
if cmd == "LIGHT_OFF": light.value(0)
if cmd == "FAN_ON": fan.value(1)
if cmd == "FAN_OFF": fan.value(0)
if cmd == "DOOR_OPEN": door_open()
if cmd == "ALARM_ON": buzzer.value(1); alarm_led.value(1)
if cmd == "ALARM_OFF": buzzer.value(0); alarm_led.value(0)
# ---------------- Main ----------------
connect_wifi()
client = MQTTClient(CLIENT_ID, BROKER, PORT)
client.set_callback(mqtt_callback)
client.connect()
client.subscribe(TOPIC_CONTROL)
print("ā
MQTT Connected")
while True:
# PIR + LDR ā Light Auto
motion = pir.value()
light_level = ldr.read()
if motion == 1 and light_level > 1000:
light.value(1)
else:
light.value(0)
# Temp ā Fan
dht_sensor.measure()
temp = dht_sensor.temperature()
if temp > 28:
fan.value(1)
else:
fan.value(0)
# Gas ā Alarm
gas_val = gas.read()
if gas_val > 600:
buzzer.value(1); alarm_led.value(1)
else:
buzzer.value(0); alarm_led.value(0)
# Ultrasonic ā Door
dist = measure_distance()
if dist < 20:
door_open()
# Publish sensor values
data = f"{motion},{light_level},{temp},{gas_val},{dist}"
client.publish(TOPIC_SENSOR, data.encode())
# Update Blynk
blynk_update("V1", temp) # Temp
blynk_update("V2", light_level) # Light level
blynk_update("V3", gas_val) # Gas
blynk_update("V4", dist) # Distance
blynk_update("V5", motion) # Motion
# Handle remote control commands
client.check_msg()
time.sleep(2)