from machine import Pin, ADC
import time
import network
import ujson
from umqtt.simple import MQTTClient
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect("Wokwi-GUEST", "")
while not wifi.isconnected():
print("Connecting to WiFi...")
time.sleep(0.3)
print("WiFi Connected:", wifi.ifconfig())
led = Pin(2, Pin.OUT)
ldr = ADC(Pin(34))
ldr.atten(ADC.ATTN_11DB)
BROKER = "mqtt.netpie.io"
CLIENT_ID = "341f6607-0598-4164-93da-61538bbc2f46"
TOKEN = "PrAkZfdKEJLcBg2T4gRY7XaAF9PqQFUW"
SECRET = "oerxAyQEb9vfkjQ2QAsmJeEzo4Z68tBy"
TOPIC_SUB = "@msg/emergency"
TOPIC_PUB = "@shadow/data/update"
emergency_mode = False
LIGHT_THRESHOLD = 50
def on_message(topic, msg):
global emergency_mode
message = msg.decode().upper()
print("Message Received:", message)
if message == "EMERGENCY_PRESSED":
emergency_mode = not emergency_mode
print("Emergency Mode:", "ON" if emergency_mode else "OFF")
try:
netpie = MQTTClient(
CLIENT_ID,
BROKER,
user=TOKEN,
password=SECRET,
port=1883
)
netpie.set_callback(on_message)
netpie.connect()
netpie.subscribe(TOPIC_SUB)
print("Connected to NETPIE, subscribed to:", TOPIC_SUB)
except Exception as e:
print("MQTT Connection Failed:", e)
raise SystemExit()
def read_light_level():
raw = ldr.read()
light_level = int((4095 - raw) / 40.95)
return max(0, min(100, light_level))
def publish_shadow(light, led_status):
payload = {
"data": {
"light_level": light,
"led_status": led_status,
"emergency_mode": emergency_mode,
"light_indicator": True if light >= LIGHT_THRESHOLD else False
}
}
netpie.publish(TOPIC_PUB, ujson.dumps(payload))
print("Smart Green House System Started")
print("Light Threshold:", LIGHT_THRESHOLD)
print("----------------------------------------")
while True:
try:
netpie.check_msg()
light_level = read_light_level()
if emergency_mode:
led.value(1)
else:
if light_level < LIGHT_THRESHOLD:
led.value(1)
else:
led.value(0)
publish_shadow(light_level, led.value())
print(
"Light:",
light_level,
"| LED:",
"ON" if led.value() else "OFF",
"| Mode:",
"EMERGENCY" if emergency_mode else "AUTO"
)
time.sleep(0.5)
except Exception as e:
print("Runtime Error:", e)
time.sleep(1)