import time
import ujson
from machine import ADC, Pin
from umqtt_simple import MQTTClient
import dht
# --- WiFi Configuration ---
WIFI_SSID = "Wokwi-GUEST"
WIFI_PASS = ""
# --- ThingsBoard MQTT Configuration ---
THINGSBOARD_BROKER = "eu.thingsboard.cloud"
THINGSBOARD_PORT = 1883
THINGSBOARD_TOKEN = "WmNnmNxf1hJsIsPJ8Mgv"
TOPIC_THINGSBOARD = "v1/devices/me/telemetry"
# --- Node-RED / Local Broker Configuration ---
NODERED_BROKER = "broker.hivemq.com"
NODERED_PORT = 1883
TOPIC_NODERED = "office/room101/telemetry"
# --- Pins Setup ---
dht_sensor = dht.DHT22(Pin(4))
ldr_adc = ADC(Pin(34))
ldr_adc.atten(ADC.ATTN_11DB)
gas_pot = ADC(Pin(35))
gas_pot.atten(ADC.ATTN_11DB)
cooling_led = Pin(2, Pin.OUT)
cooling_led.value(0)
def connect_wifi():
import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_SSID, WIFI_PASS)
print("Connecting to WiFi", end="")
while not wlan.isconnected():
print(".", end="")
time.sleep(0.5)
print("\nWiFi connected!")
def main():
# Establish WiFi connection
connect_wifi()
# Initialize MQTT Client for ThingsBoard (using Access Token as username)
tb_client = MQTTClient("ESP32_TB_Client", THINGSBOARD_BROKER, port=THINGSBOARD_PORT, user=THINGSBOARD_TOKEN, password="")
print(f"Connecting to ThingsBoard Broker: {THINGSBOARD_BROKER}...")
try:
tb_client.connect()
print("Connected to ThingsBoard successfully!")
except Exception as e:
print(f"Failed to connect to ThingsBoard: {e}")
# Initialize MQTT Client for Node-RED pipeline
nr_client = MQTTClient("ESP32_NR_Client", NODERED_BROKER, port=NODERED_PORT)
print(f"Connecting to Node-RED Broker: {NODERED_BROKER}...")
try:
nr_client.connect()
print("Connected to Node-RED Broker successfully!")
except Exception as e:
print(f"Failed to connect to Node-RED broker: {e}")
last_sent_time = 0
send_interval = 2 # Optimized interval to prevent high server load and lagging
while True:
try:
current_time = time.time()
if current_time - last_sent_time >= send_interval:
last_sent_time = current_time
# Read environmental sensors
dht_sensor.measure()
temperature = dht_sensor.temperature()
humidity = dht_sensor.humidity()
# Read LDR light level
ldr_raw = ldr_adc.read()
light_level = int((ldr_raw / 4095) * 100)
# Read Gas/CO2 level dynamically from the Potentiometer (mapped to 400 - 2000 ppm)
gas_raw = gas_pot.read()
co2_level = int((gas_raw / 4095) * 1600) + 400
# Local Actuation / LED control based on temperature threshold
if temperature >= 30.0:
cooling_led.value(1)
else:
cooling_led.value(0)
# Construct JSON payload matching lab specifications
payload = {
"device_id": "Office-Room-101",
"room": "room101",
"building": "Main-Building",
"temperature": round(temperature, 2),
"humidity": round(humidity, 2),
"light": round(light_level, 2),
"co2": round(co2_level, 2),
}
payload_json = ujson.dumps(payload)
print(f"Publishing telemetry: {payload_json}")
# 1. Publish telemetry directly to ThingsBoard
try:
tb_client.publish(TOPIC_THINGSBOARD, payload_json)
except:
pass
# 2. Publish telemetry to Node-RED pipeline
try:
nr_client.publish(TOPIC_NODERED, payload_json)
except:
pass
# Small delay to keep the loop non-blocking and stable
time.sleep(1)
except OSError as e:
print(f"Connection lost: {e}. Reconnecting clients...")
time.sleep(5)
try:
tb_client.connect()
nr_client.connect()
except:
pass
if __name__ == "__main__":
main()Loading
esp32-devkit-c-v4
esp32-devkit-c-v4