前言
本来这个项目是想用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);
}