STC8H集成ESP32实现与EMQX的交互
背景:通过MQTTX客户端,基于EMQX平台,实现与STC8H的数据通讯
一、简单介绍
开发环境:Thonny + MicroPython
软硬件组成
STC8H:面向传感器的单片机,实现ADC功能,处理数据的
ESP32:用于连接互联网和与STC8H之间的数据交互
EMQX:一个物联网平台,可以查看客户端连接情况,装载消息,发布/订阅消息的中间人
MQTTX:一个客户端平台,可以用来发布和订阅EMQX中的消息
二、MQTTX配置
1.先简单测试,直接使用公共EMQX服务器即可
2.连接成功后,添加2个订阅,一个用来发送消息到EMQX,一个用来接收
emqx/esp32/send
emqx/stc8h/receive
3.发送消息,确保MQTTX发送的主题和ESP32订阅的主题名称相关联
三、ESP32配置
1.首先用我们的Thoony和ESP32模块建立连接
2.创建main.py文件(在ESP32中,根目录下的main.py文件会在模块供电后自动运行)
3.连接wifi,在以下代码中初始化wifi账号密码
WIFI连接
SSID = ‘xxxx’
PASSWORD = ‘xxxx’
from umqtt.simple import MQTTClient
from machine import UART, Pin
import time
import network
# MQTT client ID and broker details
MQTT_BROKER = 'broker.emqx.io'
MQTT_PORT = 1883
MQTT_TOPIC = 'emqx/esp32/send'
REPLY_TOPIC='emqx/stc8h/receive'
CLIENT_ID='ESP32_CLIENT'
#WIFI连接
SSID = 'xxxx'
PASSWORD = 'xxxx'
# UART configuration
ID= 2
BAUDRATE= 9600
TX= 17
RX= 16
BIT=8
PARITY=None
STOP=1
has_printed = False
last_heartbeat = time.ticks_ms()
def wifi_connect(ssid, password):
# 创建 WIFI 连接对象
wlan = network.WLAN(network.STA_IF)
# 激活 wlan 接口
wlan.active(True)
# 断开之前的链接
wlan.disconnect()
# 扫描允许访问的 WiFi
print('扫描周围信号源:', wlan.scan())
print("正在连接 WiFi 中", end="")
# 连接 wifi
wlan.connect(ssid, password)
# 如果一直没有连接成功,则每隔 0.1s 在命令号中打印一个 .
while not wlan.isconnected():
print(".", end="")
time.sleep(0.1)
# 连接成功之后,打印出 IP、子网掩码(netmask)、网关(gw)、DNS 地址
print(f"\n{wlan.ifconfig()}")
def emqx_connect():
global arrayData, has_printed, last_heartbeat
arrayData = []
client = None
# Attempt to connect to MQTT broker
while client is None:
try:
client = MQTTClient(client_id=CLIENT_ID, server=MQTT_BROKER, port=MQTT_PORT)
client.connect()
print("Connected to MQTT broker")
except OSError as e:
print(f"Connection failed with error {e}. Retrying...")
time.sleep(5) # Wait before retrying
# Subscribe to topic
client.set_callback(sub_cb)
client.subscribe(MQTT_TOPIC)
print("Subscribed to topic:", MQTT_TOPIC)
# Initialize UART
global uart
uart = UART(ID, baudrate=BAUDRATE, tx=Pin(TX), rx=Pin(RX), bits=BIT, parity=PARITY, stop=STOP)
while True:
try:
# Check for new MQTT messages
client.check_msg()
# Heartbeat mechanism
if time.ticks_diff(time.ticks_ms(), last_heartbeat) > 5000: # Send heartbeat every 5 seconds
client.ping()
last_heartbeat = time.ticks_ms()
print("Heartbeat sent.")
if uart.any():
# Read available bytes
response = uart.read()
arrayData.append(response)
#print("Received from STC8H-->", response)
has_printed = False
elif arrayData and not has_printed:
# 合并所有的字节序列
merged_data = b''.join(arrayData)
# 使用列表推导式将每个字节转换为大写的两位十六进制数,然后使用join()方法连接这些字符串
hex_string = ' '.join(['{:02X}'.format(byte) for byte in merged_data])
print("Received from STC8H-TOTAL-->", hex_string)
#将消息推送到EMQX上
client.publish(REPLY_TOPIC, hex_string)
print("Data sent to EMQX---------->",hex_string)
# 清空arrayData以准备接收下一批数据
arrayData.clear()
has_printed = True
except Exception as e:
print("Error occurred:", e)
if client is not None:
client.disconnect()
client = None
time.sleep(5) # Wait before attempting to reconnect
def sub_cb(topic, msg):
# Format message as hexadecimal
formatted_hex = ' '.join(f'{byte:02X}' for byte in msg)
print("ESP32 Received------->", msg)
# Forward message to STC8H
uart.write(msg)
print("Sent to STC8H-------->", formatted_hex)
wifi_connect(SSID,PASSWORD);
emqx_connect()
四、STC8H配置
1.STC8H和ESP32之间建立连接–(UART)
将STC8H的TX、RX分别和ESP32开发板上的的RX2、TX2连接起来
再将对应的正负极连接起来即可
五、总结
1.各模块之间的连接方式
STC8H-ESP32:通过杜邦线连接
EPS32-PC :通过USB接口方式连接
2.模拟数据发送流程
- 用MQTTX客户端工具基于发布订阅模式向EMQX发送读取SO2的浓度指令 例如:3A 10 03 00 02 02 00 00 72 EA
- ESP32模块联网订阅EMQX中的消息,并且通过UART(串口通信)将消息进一步发送给STC8H单片机
- STC8H接收到指令后,开始执行对应操作并且回传数据给ESP32
- ESP32在将数据发布到EMQX平台上
- MQTTX订阅我们发布的消息,完成通信