import network
import time
from umqtt.simple import MQTTClient
import random
from machine import Pin
# WiFi 配置
WIFI_SSID = "Wokwi-GUEST" # 替换为实际 WiFi 名
WIFI_PASSWORD = "" # 替换为实际 WiFi 密码
# 巴法云配置
BAFAYUN_SERVER = "bemfa.com"
BAFAYUN_PORT = 9501
BAFAYUN_CLIENT_ID = "8714483521c64509be3a0e818367c9fa" # 替换为你的巴法云私钥
BAFAYUN_TOPIC = "sensor" # 主题名称,注意拼写
# GPIO 定义(控制继电器/LED)
ALARM_PIN = Pin(15, Pin.OUT) # ESP32 引脚 15,输出模式
ALARM_THRESHOLD = 300 # 烟雾浓度阈值,低于此值触发报警
# 连接 WiFi
def connect_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('连接到 WiFi...')
wlan.connect(WIFI_SSID, WIFI_PASSWORD)
while not wlan.isconnected():
time.sleep(1)
print('WiFi 连接成功,网络配置:', wlan.ifconfig())
# 读取 MQ2 传感器数据(模拟)
def read_mq2():
# 实际项目中替换为真实传感器读取逻辑,例如:return mq2_sensor.read()
return random.uniform(0, 1000) # 模拟数据 0-1000
# 订阅消息回调函数
def sub_callback(topic, msg):
print(f"收到主题 {topic.decode()} 的消息: {msg.decode()}")
# 可扩展:根据收到的消息执行手动模式/自动模式切换等逻辑
# 主函数
def main():
connect_wifi()
# 连接巴法云 MQTT 服务器
client = MQTTClient(BAFAYUN_CLIENT_ID, BAFAYUN_SERVER, BAFAYUN_PORT)
client.set_callback(sub_callback)
try:
client.connect()
print("成功连接到巴法云 MQTT 服务器")
client.subscribe(BAFAYUN_TOPIC)
print(f"已订阅主题: {BAFAYUN_TOPIC}")
while True:
# 1. 读取传感器数据
mq2_value = read_mq2()
print(f"当前 MQ2 浓度: {mq2_value:.2f}")
# 2. 发布数据到巴法云
client.publish(BAFAYUN_TOPIC, str(mq2_value))
print(f"已发布数据: {mq2_value:.2f}")
# 3. 报警逻辑:浓度低于阈值时,控制 LED 闪烁
if mq2_value < ALARM_THRESHOLD:
ALARM_PIN.value(1)
time.sleep(0.5)
ALARM_PIN.value(0)
time.sleep(0.5)
print("触发报警:烟雾浓度低于阈值!")
else:
ALARM_PIN.value(0)
# 4. 检查订阅消息
client.check_msg()
time.sleep(5) # 每 5 秒执行一次
except Exception as e:
print(f"连接错误: {e}")
finally:
client.disconnect()
if __name__ == "__main__":
main()