import network
import time
import asyncio
import dht
import ntptime
from machine import Pin,I2C
from connect import ESP32
import ssd1306
from mqtt_config import *
from umqtt.simple import MQTTClient
import ujson
# Khai báo led
led1 = Pin(12, Pin.OUT) # red led
led2 = Pin(14, Pin.OUT) # yellow led
led3 = Pin(18, Pin.OUT) # blue led
# Khai báo cảm biến
dht22 = dht.DHT22(Pin(25, Pin.IN))
gas_sensor = Pin(26, Pin.IN)
motion_sensor = Pin(13, Pin.IN)
# Khai báo màn hình OLED kích thước 128x64
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
# Các dữ liệu mặc định
prev_t = 0 # Mặc định nhiệt độ bằng 0
prev_h = 0 # Mặc định độ ẩm bằng 0
prev_gas = 0 # Mặc định không phát hiện khí gas
prev_motion = 0 # Mặc định không phát hiện chuyển động
prev_led3 = 0 # Mặc định đèn tắt
# KẾT NỐI WIFI, SỬ DỤNG SSID VÀ PASSWORD MẶC ĐỊNH WOKWI
esp = ESP32()
esp.connect()
# ĐỒNG BỘ THỜI GIAN HIỆN TẠI VỚI NTP
ntptime.settime()
# MQTT CALLBACK
def sub_cb(topic, msg):
print("Topic:",topic,"Msg", msg)
# XỬ LÝ
global prev_led3
if(topic == LISTEN_MQTT_TOPIC):
if(msg == b"turn_on"):
led3.on()
prev_led3 = 1
elif(msg == b"turn_off"):
led3.off()
prev_led3 = 0
# KẾT NỐI MQTT BROKER: https://www.emqx.com/
print("Kết nối đến MQTT ", end="")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
client.set_callback(sub_cb)
client.connect()
client.subscribe(LISTEN_MQTT_TOPIC)
print("Kết nối MQTT thành công!")
##### TASK 1: ĐO NHIỆT ĐỘ - ĐỘ ẨM TỪ DHT 22 #####
async def task1():
global prev_t
global prev_h
while True:
oled.fill(0)
t = time.localtime() # Thông tin thời gian
h = (t[3]+ 7 ) % 24 # Giờ cần đổi sang múi giờ +7
m = t[4] # Phút
s = t[5] # Giây
txt = f"Time: {h:<2}:{m:<2}:{s:<2}"
oled.text(txt, 0, 30) # Hiển thị lên màn hình OLED
dht22.measure()
t = dht22.temperature() # Nhiệt độ hiện tại
h = dht22.humidity() # Độ ẩm hiện tại
rs = f"T:{t:<4},H:{h:<4}"
if(prev_t != t or prev_h != h):
# TODO: gửi lên MQTT
prev_t = t
prev_h = h
print(rs) # In ra console
oled.text(rs, 0, 10) # Hiển thị lên màn hình OLED
oled.show()
await asyncio.sleep(1) # 1s đo 1 lần
##### TASK 2: CẢM BIẾN CHUYỂN ĐỘNG - TỰ ĐỘNG BẬT ĐÈN #####
async def task2():
global prev_motion
while True:
v = motion_sensor.value()
if(v != prev_motion):
if v == 0:
led2.off()
else:
led2.on()
prev_motion = v
await asyncio.sleep(1) # 1s đo 1 lần
##### TASK 3: CẢM BIẾN KHÍ GAS #####
async def task3():
global prev_gas
while True:
v = gas_sensor.value()
if v == 1:
led1.off()
prev_gas = 0
else:
led1.on()
prev_gas = 1
await asyncio.sleep(0.1) # 0.1s đo 1 lần
##### TASK 4: LẮNG NGHE BẢN TIN TỪ MQTT BROKER #####
async def listen_mqtt():
while True:
try:
client.check_msg()
except OSError as e:
print("Log: ", e)
await asyncio.sleep(0.1)
#### TASK 5: CẬP NHẬT DỮ LIỆU HIỆN TẠI LÊN MQTT ####
async def push_data_cloud():
while True:
message = ujson.dumps({
"temp": prev_t,
"humidity": prev_h,
"motion": prev_motion,
"gas": prev_gas,
"led": prev_led3
})
print(message)
client.publish(UPDATE_TOPIC, message)
await asyncio.sleep(1) # Mỗi giây update 1 lần
#### MAIN - SYSTEM ####
async def main():
asyncio.create_task(task1())
asyncio.create_task(task2())
asyncio.create_task(task3())
asyncio.create_task(listen_mqtt())
asyncio.create_task(push_data_cloud())
# Main loop
loop = asyncio.get_event_loop()
loop.create_task(main())
loop.run_forever()
Cảm biến DHT22
Cảm biến ga
Cảm biến chuyển động
LED điều khiển theo lệnh người dùng, qua MQTT
ESP32
THAY ĐỔI GIÁ TRỊ CẢM BIẾN BẰNG CÁCH CLICK VÀO CẢM BIẾN, KÉO THANH TRƯỢT HOẶC BẤM MÔ PHỎNG