import network
import time
import dht
from machine import Pin
from umqtt.simple import MQTTClient
# ----------------------------------------------------------------------------
# Network & Cloud Configuration Parameters
# ----------------------------------------------------------------------------
WIFI_SSID = "Wokwi-GUEST"
WIFI_PASSWORD = ""
MQTT_BROKER = "test.mosquitto.org"
TOPIC = b"school/esp32/weather"
CLIENT_ID = "ESP32SecurityDemo"
# Initialize DHT22 Sensor on GPIO 15
sensor = dht.DHT22(Pin(15))
def connect_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_SSID, WIFI_PASSWORD)
print("Connecting WiFi...")
while not wlan.isconnected():
print("Waiting...")
time.sleep(1)
print("WiFi Connected\n")
return wlan
def connect_mqtt():
client = MQTTClient(CLIENT_ID, MQTT_BROKER)
client.connect()
print("MQTT Connected\n")
return client
def read_sensor():
sensor.measure()
t = sensor.temperature()
h = sensor.humidity()
return t, h
# ----------------------------------------------------------------------------
# Updated Validation Logic (Strict Bounds for Testing)
# ----------------------------------------------------------------------------
def validate(t, h):
"""
Checks if values breach safe operating ranges.
Using <= and >= flags extreme values (-40 and 0) as errors for testing.
"""
if t <= -40:
print("Validation Fault: Temperature is too low! (<= -40°C)")
return False
if t >= 80:
print("Validation Fault: Temperature is too high! (>= 80°C)")
return False
if h <= 0:
print("Validation Fault: Humidity is too low! (<= 0%)")
return False
if h >= 100:
print("Validation Fault: Humidity is too high! (>= 100%)")
return False
return True
# ============================================================================
# Main Program Boot & Telemetry Lifecycle
# ============================================================================
print("\nStarting System\n")
wifi = connect_wifi()
mqtt = connect_mqtt()
while True:
try:
# Capture current climate numbers from hardware
temperature, humidity = read_sensor()
print("------------------------")
print("Raw Sensor Data -> Temp: {:.1f}°C, Humid: {:.1f}%".format(temperature, humidity))
# Validate data integrity before publishing
if validate(temperature, humidity):
msg = "Temp={:.1f} Humidity={:.1f}".format(temperature, humidity)
# Broadcast message payload out to the cloud channel topic
mqtt.publish(TOPIC, msg)
print("Status: Published Successfully")
else:
# Caught an intentional boundary anomaly
print("Status: Invalid Sensor Reading (Data Suppressed)")
except Exception as e:
print("\n[Runtime Exception Handled]:", e)
print("Retrying connection in next cycle...")
# Wait 5 seconds before repeating
time.sleep(5)