# Khai bao thu vien
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
# MQTT
from umqtt.simple import MQTTClient
# ESP32
sta_if = network.WLAN(network.STA_IF)
# Cam bien
dht22 = DHT22(Pin(25))
montion_senor = Pin(16, Pin.IN)
# Den
led_motion = Pin(15, Pin.OUT)
# Servo
servo_pin = 18 # 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 = "d05k13-bkacad-2024-29-01"
MQTT_BROKER = "broker.hivemq.com"
MQTT_USER = ""
MQTT_PASSWORD = ""
# Topic
MQTT_SUB = "d05k13/iot/nguyentienduy/smart_system"
def get_msg(topic, msg):
print(topic, msg)
if(msg == b'SERVO_ON'):
servo.duty(100) # Adjust duty cycle as needed
elif(msg == b'SERVO_OFF'):
servo.duty(76)
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)
if sta_if.isconnected():
res = requests.get(url=f'https://api.thingspeak.com/update?api_key=W09U8JZ26PXXEXM2&field1={t}&field2={h}')
del res
# Control servo based on humidity
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 = montion_senor.value()
if(v == 1):
# Gui canh bao
client.publish('d05k13/iot/smart_system/alert', 'DETECT_MOTION')
led_motion.on()
else:
led_motion.off()
await asyncio.sleep(1)
# Task3
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()