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)
# Pin configurations
dht_pin = 4
dht = DHT22(Pin(dht_pin))
motion_sensor_pin = 16 # Adjust this pin based on your wiring
motion_sensor = Pin(motion_sensor_pin, Pin.IN)
# Servo
servo_pin = 14
servo = PWM(Pin(servo_pin), freq=50)
#Led
led_motion_pin = 15
led_motion = Pin(led_motion_pin, Pin.OUT)
# Uncomment the line below to connect to WiFi
connect_wifi()
#MQTT
MQTT_CLIENT_ID = "micropython-weather-demo"
MQTT_BROKER = "broker.hivemq.com"
MQTT_USER = ""
MQTT_PASSWORD = ""
#topic
MQTT_SUB = "d05k13/iot/smart_system"
SERVO_ANGLE_ON = 120 # Adjust the angle for ON position
SERVO_ANGLE_OFF = 77 # Adjust the angle for OFF position
# Servo state
servo_state = False
def get_msg(topic, msg):
print(topic, msg)
if(msg == b'SV_ON'):
turn_on_servo()
elif(msg == b'SV_OFF'):
turn_off_servo()
def turn_on_servo():
global servo_state
servo.duty(SERVO_ANGLE_ON)
servo_state = True
print("Servo ON")
def turn_off_servo():
global servo_state
servo.duty(SERVO_ANGLE_OFF)
servo_state = False
print("Servo OFF")
print("Connecting to MQTT server... ", end="")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
#khi nhan duoc mess -> se goi den callback
client.set_callback(get_msg)
client.connect()
print("Connected!")
client.subscribe(MQTT_SUB)
HUMIDITY_THRESHOLD_LOW = 50
HUMIDITY_THRESHOLD_HIGH = 70
# Task 1
async def get_env_dth22():
while True:
try:
dht.measure()
temperature = dht.temperature()
humidity = dht.humidity()
print("DHT22 - Temperature: {}°C, Humidity: {}%".format(temperature, humidity))
# Kiểm tra nếu độ ẩm thấp hơn ngưỡng thấp
if humidity < HUMIDITY_THRESHOLD_LOW:
if not servo_state:
turn_on_servo()
# Kiểm tra nếu độ ẩm cao hơn ngưỡng cao
elif humidity > HUMIDITY_THRESHOLD_HIGH:
if servo_state:
turn_off_servo()
# Send data to ThingSpeak if connected to WiFi
if sta_if.isconnected():
res = requests.get(url=f'http://api.thingspeak.com/update?api_key=204VGZJRISYH5DMQ&field1={temperature}&field2={humidity}')
del res # Release memory
except Exception as e:
print("Error reading DHT22 sensor:", str(e))
await asyncio.sleep(20)
# Task 2
async def detect_motion():
while True:
motion_value = motion_sensor.value()
if (motion_value == 1):
print("Motion Detected!")
client.publish('d05k13/iot/smart_system/alert', 'DETECT_MOTION')
led_motion.on()
else:
print("No Motion Detected!")
led_motion.off()
await asyncio.sleep(1)
# Task 3
async def get_message_from_user():
while True:
client.check_msg()
await asyncio.sleep(0.5)
loop = asyncio.get_event_loop()
loop.create_task(get_env_dth22())
loop.create_task(detect_motion())
loop.create_task(get_message_from_user())
loop.run_forever()