利用ESP32C3和STC89C51单片机实现MQTT向上位机通讯

前言

        本来这个项目是想用ESP32+LVGL一个板子实现的,奈何要求太刁钻。强制要求我们用51单片机,导致我的项目含精量大打折扣在这里我也是被狠狠无语住了。所以在此,仅以此项目作为一个思路提供给大家举一反三。

准备材料

        ESP32C3(其他型号也是可以的)

        STC89C51开发板(这里用的是普中的)

给ESP32刷个AT固件

        ESP32本身可以做单片机,但这里我只用到了他的配网和mqtt,所以直接刷AT固件包会提高开发效率。

下载固件包

        下载两个东西:

        AT固件包:发布的固件 - ESP32 - — ESP-AT 用户指南 latest 文档

        FLASH工具:工具 | 乐鑫科技

烧录AT固件

        

        打开flash,选择ESP32C2

箭头所指的三个位置需要修改

        选择固件包,路径如下

        后面地址写0x0

        选择串口,点击START等待烧录。

烧录完成

        烧录完成后默认的串口(UART0)并不是AT指令用的串口,按复位可以看到有数据输出,证明安装成功。

        如果想用AT固件要接其他串口(UART1),这里用杜邦线连接,测试AT。硬件连接 - ESP32-C3 - — ESP-AT 用户指南 release-v3.3.0.0 文档

测试成功AT固件烧录成功

AT配置

命令:基础 AT 命令集 - ESP32-C3 - — ESP-AT 用户指南 release-v3.3.0.0 文档

设置波特率,因为STC89C52用了12MHZ的波特率,所以这里我们波特率配置为4800

AT+UART_DEF=4800,8,1,0,0

修改成功,切换波特率。

MQTT指令测试

MQTT AT 命令集 - ESP32-C3 - — ESP-AT 用户指南 release-v3.3.0.0 文档

AT+CWMODE=1 设置模式

AT+CWJAP="ssid","pwd"   连接WIFI

AT+MQTTUSERCFG=0,1,"用户ID","账号","密码",0,0,""

账号密码是你登录EMQX的账号密码

用户ID是你登录后在EMQX看到的连接设备IID

AT+MQTTCONN=0,"本地IP",1883,0

AT+MQTTSUB=0,"订阅主题",0

可以看到已经能够收到消息了

AT+MQTTPUB=0,"主题","数据",0,0

正常发送,测试完成,接下来就是把这一套流程移植到单片机上了。

这里建议把WIFI上电自动连接关了:

AT+CWAUTOCONN=0

51单片机移植

51单片机连接代码

void connect_to_mqtt()
{
    ES=0;
    send_string("AT+RST\r\n");
    rec_flag=1;
    TIME_BASE=0;
    while(rec_flag);
    delay_ms(200);
    
    send_string("AT+CWMODE=1\r\n");
    rec_flag=1;
    TIME_BASE=0;
    while(rec_flag);
    delay_ms(200);
    
    send_string("AT+CWJAP=\"xxxxxx\",\"xxxxx\"\r\n");
    rec_flag=1;
    TIME_BASE=0;
    while(rec_flag);
    delay_ms(500);
    
    send_string("AT+MQTTUSERCFG=0,1,\"xxxxx\",\"xxxx\",\"xxxxx\",0,0,\"\"\r\n");
    rec_flag=1;
    TIME_BASE=0;
    while(rec_flag);
    delay_ms(200);
    
    send_string("AT+MQTTCONN=0,\"42.51.41.107\",1883,0\r\n");
    rec_flag=1;
    TIME_BASE=0;
    while(rec_flag);
    delay_ms(200);
    
    send_string("AT+MQTTSUB=0,\"cmd\",0\r\n");
    rec_flag=1;
    TIME_BASE=0;
    while(rec_flag);
    delay_ms(200);
    ES=1;
}

        重点,用串口发送指令的时候结尾必须为\r\n。少一个\r,esp32的at指令接收会失效。

数据上报代码

void send_msg()
{

 

    memset(str, 0, sizeof(str));
    sprintf(str,"AT+MQTTPUB=0,\"data\",\"A%.1fB%.1fC%.1f\",0,0\r\n",RH,temperature[0],temperature[1]);
    send_string(str);

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值