from machine import Pin, I2C
import ssd1306
import time
import dht
import asyncio
import network
import urequests as requests
from umqtt.simple import MQTTClient
import random as rd
# ESP32 Pin assignment
buzzer = Pin(14, Pin.OUT)
sensor = dht.DHT22(Pin(25, Pin.IN))
monitorSensor = Pin(26, Pin.IN)
led1 = Pin(16, Pin.OUT)
led2 = Pin(17, Pin.OUT)
lightsensor = Pin(27, Pin.IN)
# Connect to WiFi
print("Connecting to WiFi", end="")
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('Wokwi-GUEST', '')
timeout = 10
start_time = time.time()
while not sta_if.isconnected():
if time.time() - start_time > timeout:
print("Failed to connect to WiFi")
break
print(".", end="")
time.sleep(0.1)
if sta_if.isconnected():
print("Connected!")
# MQTT Server Parameters
MQTT_CLIENT_ID = f"d05k14{rd.randint(0, 10000)}"
MQTT_BROKER = "broker.hivemq.com"
MQTT_USER = ""
MQTT_PASSWORD = ""
MQTT_SUB_TOPIC = "dat/led"
MQTT_PUB_TEMPERATURE_TOPIC = "dat/sensor/temperature"
MQTT_PUB_HUMIDITY_TOPIC = "dat/sensor/humidity"
MQTT_PUB_CITY_TOPIC = "dat/sensor/city"
MQTT_PUB_HUMIDITY_CITY_TOPIC = "dat/sensor/humidity_city"
MQTT_PUB_TEMPERATURE_CITY_TOPIC = "dat/sensor/temperature_city"
MQTT_PUB_DESCRIPTION_CITY_TOPIC = "dat/sensor/description_city"
MQTT_PUB_LIGHT_TOPIC = "dat/sensor/light"
print("Connecting to MQTT server... ", end="")
def sub_cb(topic, msg):
print((topic, msg))
if topic == MQTT_SUB_TOPIC.encode():
if msg == b'on2':
led2.on()
elif msg == b'off2':
led2.off()
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
client.set_callback(sub_cb)
client.connect()
client.subscribe(MQTT_SUB_TOPIC)
print("Connected!")
async def task1():
while True:
try:
if monitorSensor.value() == 1:
led1.value(1)
buzzer.on()
else:
led1.value(0)
buzzer.off()
except Exception as e:
print("Error in task1:", e)
await asyncio.sleep(0.1)
prv_t = None
prv_h = None
async def task2():
global prv_t, prv_h
while True:
try:
sensor.measure()
t = sensor.temperature()
h = sensor.humidity()
if prv_t != t:
print("Cap nhap nhiet do: ", t)
client.publish(MQTT_PUB_TEMPERATURE_TOPIC, str(t))
prv_t = t
if prv_h != h:
print("Cap nhat do am: ", h)
client.publish(MQTT_PUB_HUMIDITY_TOPIC, str(h))
prv_h = h
client.check_msg()
except Exception as e:
print("Error in task2:", e)
await asyncio.sleep(0.1)
# OpenWeather API URL
url = 'https://api.openweathermap.org/data/2.5/weather?q=hanoi&appid=e63e7dabb5a76b6111f86eed4e035ae1&units=metric&lang=en'
async def task3():
while True:
try:
res = requests.get(url)
if res.status_code == 200:
data = res.json()
print(f"City: {data['name']}")
client.publish(MQTT_PUB_CITY_TOPIC, str(data['name']))
print(f"Temperature: {data['main']['temp']}")
client.publish(MQTT_PUB_TEMPERATURE_CITY_TOPIC, str(data['main']['temp']))
print(f"Humidity: {data['main']['humidity']}")
client.publish(MQTT_PUB_HUMIDITY_CITY_TOPIC, str(data['main']['humidity']))
print(f"Description: {data['weather'][0]['description']}")
client.publish(MQTT_PUB_DESCRIPTION_CITY_TOPIC, str(data['weather'][0]['description']))
client.check_msg()
else:
print(f"Failed to get weather data, status code: {res.status_code}")
except Exception as e:
print("Error in task3:", e)
await asyncio.sleep(600)
vt = None
async def task4():
while True:
global vt
v = lightsensor.value()
if(vt != v):
if(v == 1):
client.publish(MQTT_PUB_LIGHT_TOPIC, "Mo Rem.")
vt = v
else:
client.publish(MQTT_PUB_LIGHT_TOPIC, "Dong Rem.")
vt = v
client.check_msg()
await asyncio.sleep(5)
loop = asyncio.get_event_loop()
loop.create_task(task1())
loop.create_task(task2())
loop.create_task(task3())
loop.create_task(task4())
loop.run_forever()