STC8H集成ESP32实现与EMQX的交互

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.模拟数据发送流程

  1. 用MQTTX客户端工具基于发布订阅模式向EMQX发送读取SO2的浓度指令 例如:3A 10 03 00 02 02 00 00 72 EA
  2. ESP32模块联网订阅EMQX中的消息,并且通过UART(串口通信)将消息进一步发送给STC8H单片机
  3. STC8H接收到指令后,开始执行对应操作并且回传数据给ESP32
  4. ESP32在将数据发布到EMQX平台上
  5. MQTTX订阅我们发布的消息,完成通信

在这里插入图片描述

在这里插入图片描述

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值