# ---------------- Imports ----------------
import network
import time
import dht
from machine import Pin, PWM
from umqtt import MQTTClient
# ---------------- Adafruit IO Config ----------------
AIO_USERNAME = "alone_master_096"
AIO_KEY = "aio_TsZZ36THTjFGrX0QyFce6eKZJibx"
MQTT_BROKER = "io.adafruit.com"
MQTT_PORT = 1883
CLIENT_ID = "Industrial_Node_Alpha_99"
# Feeds
TEMP_FEED = AIO_USERNAME + "/feeds/temperature"
HUM_FEED = AIO_USERNAME + "/feeds/humidity"
FAN_FEED = AIO_USERNAME + "/feeds/fan_status"
CTRL_FEED = AIO_USERNAME + "/feeds/control"
# ---------------- WiFi Config ----------------
WIFI_SSID = "Wokwi-GUEST"
WIFI_PASS = ""
# ---------------- Hardware Setup ----------------
sensor = dht.DHT22(Pin(15))
led = Pin(14, Pin.OUT)
buzzer = PWM(Pin(13))
fan = PWM(Pin(16))
fan.freq(50)
def set_fan(angle):
duty = int(1638 + (angle / 180) * (8192 - 1638))
fan.duty_u16(duty)
# ---------------- MQTT Callback ----------------
def on_message(topic, msg):
command = msg.decode()
print("Received Command:", command)
if command == "FAN_ON":
set_fan(90)
led.value(1)
elif command == "FAN_OFF":
set_fan(0)
led.value(0)
elif command == "ALARM":
buzzer.freq(1000)
buzzer.duty_u16(32768)
time.sleep(0.5)
buzzer.duty_u16(0)
# ---------------- WiFi Connection ----------------
print("Connecting WiFi...", end="")
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_SSID, WIFI_PASS)
while not wlan.isconnected():
print(".", end="")
time.sleep(0.5)
print(" Connected!")
# ---------------- MQTT Connection ----------------
print("Connecting to Adafruit IO...", end="")
client = MQTTClient(
CLIENT_ID,
MQTT_BROKER,
user=AIO_USERNAME,
password=AIO_KEY,
port=MQTT_PORT
)
client.set_callback(on_message)
client.connect()
client.subscribe(CTRL_FEED)
print(" Connected!")
print("System Online. Awaiting Cloud Commands...")
# ---------------- Main Loop ----------------
last_publish = 0
while True:
# Non-blocking MQTT receive
client.check_msg()
# Publish every 10 seconds
if time.time() - last_publish > 10:
try:
sensor.measure()
temp = sensor.temperature()
hum = sensor.humidity()
fan_status = "Active" if led.value() else "Idle"
client.publish(TEMP_FEED, str(temp))
client.publish(HUM_FEED, str(hum))
client.publish(FAN_FEED, fan_status)
print("Telemetry Sent ->",
"Temp:", temp,
"Hum:", hum,
"Fan:", fan_status)
last_publish = time.time()
except OSError:
print("Sensor Error")
time.sleep(0.1)