from machine import Pin, PWM
import uasyncio as asyncio
import urequests as requests
from dht import DHT22
import network
from connect_internet import connect_wifi
from umqtt.simple import MQTTClient
# ESP32
sta_if = network.WLAN(network.STA_IF)
# Cam bien
dht22 = DHT22(Pin(25))
motion_sensor = Pin(16, Pin.IN)
# Servo
servo_pin = 14 # Choose an available pin for servo control
servo = PWM(Pin(servo_pin), freq=50)
# Ket noi den wifi
connect_wifi()
# Ket noi den MQTT Broker
MQTT_CLIENT_ID = "iotd05k13tu11111"
MQTT_BROKER = "broker.hivemq.com"
MQTT_USER = ""
MQTT_PASSWORD = ""
# Topic
MQTT_SUB = "d05k13tu/iot/smart_system"
def get_msg(topic, msg):
print(topic, msg)
if (msg == b'SERVO_ON'):
servo.duty(115)
elif (msg == b'SERVO_OFF'):
servo.duty(77)
print("Connecting to MQTT server... ", end="")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
# Khi nhan dc message -> se goi den ham callback
client.set_callback(get_msg)
client.connect()
print("Connected!")
client.subscribe(MQTT_SUB)
# Task 1
async def get_env_dht22():
while True:
dht22.measure()
t = dht22.temperature()
h = dht22.humidity()
print(t, h)
# https://api.thingspeak.com/update?api_key=3DK6P4EHA2VQAOIF&field1=30&field2=50
if sta_if.isconnected(): # Neu co ket noi internet
res = requests.get(url=f'http://api.thingspeak.com/update?api_key=3DK6P4EHA2VQAOIF&field1={t}&field2={h}')
del res
if h < 20:
client.publish('d05k13/iot/smart_system/alert', 'LOW_HUMIDITY')
servo.duty(100) # Turn on servo
elif h >= 50:
client.publish('d05k13/iot/smart_system/alert', 'HIGH_HUMIDITY')
servo.duty(76) # Turn off servo
await asyncio.sleep(20)
# Task 2
async def detect_motion():
while True:
v = motion_sensor.value()
if v == 1:
# Gui canh bao
client.publish('d05k13/iot/smart_system/alert', 'DETECT_MOTION')
await asyncio.sleep(1)
# Task 3
async def get_message_from_user():
while True:
client.check_msg()
await asyncio.sleep(0.5)
# Khởi tạo và chạy các công việc bất đồng bộ
loop = asyncio.get_event_loop()
loop.create_task(get_env_dht22())
loop.create_task(detect_motion())
loop.create_task(get_message_from_user())
loop.run_forever()