提要
STM32连接ESP8266发送数据到OneNET平台
0.文章所需要的均可点击上方的资源包免费下载
1.硬件型号:ESP8266-01s 和 USBTTL转接口模块
2.固件:1471_esp8266-at_mqtt-1m(MQTT透传AT固件(固件号:1471))
3.固件烧录工具:flash_download_tool_3.9.4
固件下载和烧录工具均可在安信可官网下载安信可AT固件下载
本文章使用的是XCOM V2.6 串口助手
4.OneNET平台创建MQTT——WIFI直连
5.AT指令调试
6.可能遇到的问题
ESP8266驱动代码如下 ||可以在资源包里下载(免费)
这里代码是学习B站江科大stm32教程写的串口2
B站江科大stm32串口学习
ESP8266驱动则是参考B站up“彼岸有光我们有船”
ESP8266驱动代码视频
资源包里也有
//单片机头文件
#include "stm32f10x.h" // Device header
//C语言标准库函数
#include <string.h>
#include <stdio.h>
//驱动
#include "USART.h"
#include "Delay.h"
#include "OLED.h"
//ESP8266驱动
#include "ESP8266.h"
#define REV_WAIT 1
#define REV_OK 0
//连接WIFI
#define ESP8266_WIFI_INFO "AT+CWJAP=\"WIFI名字\",\"WIFI密码\"\r\n"
//连接服务器
#define ESP8266_ONENET_INFO "AT+MQTTCONN=0,\"mqtts.heclouds.com\",1883,1\r\n"
//写你自己的Token
#define ESP8266_USERCFG_INFO "AT+MQTTUSERCFG=0,1,\"设备名称\",\"设备ID\",\"Token\",0,0,\"\"\r\n"
const char* pubtopic="$sys/设备id/设备名称/thing/property/post";
unsigned char ESP8266_Buffer[256];
unsigned short ESP8266_cnt = 0, ESP8266_cntPre = 0;
uint8_t RxData;
//==========================================================
// 函数名称: ESP8266_Clear
//
// 函数功能: 清空缓存
//
// 入口参数: 无
//
// 返回参数: 无
//
// 说明:
//==========================================================
void ESP8266_Clear()
{
memset(ESP8266_Buffer, 0, sizeof(ESP8266_Buffer));
ESP8266_cnt = 0;
}
//==========================================================
// 函数名称: ESP8266_WaitRecive
//
// 函数功能: 等待接收完成
//
// 入口参数: 无
//
// 返回参数: REV_OK-接收完成 REV_WAIT-接收超时未完成
//
// 说明: 循环调用检测是否接收完成
//==========================================================
uint8_t ESP8266_WaitRecive(void)
{
if(ESP8266_cnt == 0) //如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数
return REV_WAIT;
if(ESP8266_cnt == ESP8266_cntPre) //如果上一次的值和这次相同,则说明接收完毕
{
ESP8266_cnt = 0; //清0接收计数
return REV_OK; //返回接收完成标志
}
ESP8266_cntPre = ESP8266_cnt; //置为相同
return REV_WAIT; //返回接收未完成标志
}
//==========================================================
// 函数名称: ESP8266_SendCmd
//
// 函数功能: 发送命令
//
// 入口参数: cmd:命令
// res:需要检查的返回指令
//
// 返回参数: 0-成功 1-失败
//
// 说明:
//==========================================================
uint8_t ESP8266_SendCmd(char *cmd, char *res)
{
unsigned char timeOut = 200;
Serial_SendString(cmd);
while(timeOut--)
{
if(ESP8266_WaitRecive() == REV_OK) //如果收到数据
{
if(strstr((const char *)ESP8266_Buffer, res) != NULL) //如果检索到关键词
{
ESP8266_Clear(); //清空缓存
return 0;
}
}
Delay_ms(10);
}
return 1;
}
//==========================================================
// 函数名称: ESP8266_Init
//
// 函数功能: 初始化ESP8266
//
// 入口参数: 无
//
// 返回参数: 无
//
// 说明:
//==========================================================
void ESP8266_Init()
{
ESP8266_Clear();
OLED_ShowString(2,1,"0");
//printf("0. AT\r\n");
while(ESP8266_SendCmd("AT\r\n", "OK"))
Delay_ms(500);
OLED_ShowString(2,1,"1");
//printf("1. AT+RST\r\n");
while(ESP8266_SendCmd("AT+RST\r\n", ""))
Delay_ms(500);
OLED_ShowString(2,1,"2");
//printf("2. CWMODE\r\n");
while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
Delay_ms(500);
OLED_ShowString(2,1,"3");
//printf( "3. AT+CWDHCP\r\n");
while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK"))
Delay_ms(500);
OLED_ShowString(2,1,"4");
//printf("4. CWJAP\r\n");
while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))
Delay_ms(500);
OLED_ShowString(2,1,"5");
//printf( "5. MQTTUSERCFG\r\n");
while(ESP8266_SendCmd(ESP8266_USERCFG_INFO, "OK"))
Delay_ms(1000);
OLED_ShowString(2,1,"6");
//printf( "6. MQTTCONN\r\n");
while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "OK"))
Delay_ms(500);
OLED_ShowString(2,1,"7");
//printf("7. ESP8266 Init OK\r\n");
}
//==========================================================
// 函数名称: ESP8266_SendData
//
// 函数功能: 发送数据
//
// 入口参数: temp:温度值
// humi:湿度值
// adcx:光照度
//
// 返回参数: 无
//
// 说明:
//==========================================================
void ESP8266_SendData(double temp,double humi,double adcx)
{
char cmdBuf[512];
ESP8266_Clear(); //清空接收缓存
//先发送要发送数据的指令做准备
sprintf(cmdBuf, "AT+MQTTPUB=0,\"%s\",\"{\\\"id\\\":\\\"123\\\"\\,\\\"params\\\":{\\\"temp\\\":{\\\"value\\\":%lf\\}\\,\\\"humi\\\":{\\\"value\\\":%lf\\}\\,\\\"adcx\\\":{\\\"value\\\":%lf\\}}}\",0,0\r\n",pubtopic,temp,humi,adcx); //发送命令
while(ESP8266_SendCmd(cmdBuf, "OK"))
Delay_ms(500);
OLED_ShowString(3,1,"8");
memset(cmdBuf,0,sizeof(cmdBuf));
Delay_ms(100);
}
//==========================================================
// 函数名称: USART2_IRQHandler
//
// 函数功能: 串口2收发中断
//
// 入口参数: 无
//
// 返回参数: 无
//
// 说明:
//==========================================================
void USART2_IRQHandler()
{
if(USART_GetITStatus(USART2, USART_IT_RXNE) == SET)
{
RxData = USART_ReceiveData(USART2);
if(ESP8266_cnt >= sizeof(ESP8266_Buffer)) ESP8266_cnt = 0; //防止串口被刷爆
ESP8266_Buffer[ESP8266_cnt++] = RxData;
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
}
}
硬件图片
接法
直接插在电脑的USB接口
下面的黑色按钮是复位键
ESP8266 图片为:
USB转接头
固件下载
固件下载地址
烧录软件和串口工具下载地址
烧录步骤
1.找到你下载好的固件和烧录软件,打开你的烧录软件
烧录成功后
烧录成功后会显示完成,直接关闭即可,随后打开一个串口助手
将你的硬件插上你的设备,然后打开串口(对应的端口)再按下硬件黑色的复位键
如果开始是乱码,但最后有显示ready就是烧录成功
发送AT指令
AT指令测试ESP8266
先是测试AT指令是否正常发送
记得最后换行发送哦
1.AT //发送测试指令,如果ESP8266收到则会回应一个“OK”
2.AT+RST //发送复位指令,相当于按下了复位键
3.AT+CWMODE=1 //设置为模式一,还有=2,=3两种模式,我们目前只用这一种
4.AT+CWDHCP=1,1 //启动DHCP
5.AT+CWJAP="ESP","123456789" //连接你的WiFi,前面为名称,后面为密码
注意WIFI必须是2.4G模式的
发送AT指令如果如上图所示,则代表可以正常使用了
在OneNET上创建MQTT(示例)
1.登录或注册
OneNET登录网站
2.登陆后点击右上角的开发者中心
3.点击左上角的产品开发
4.点击右边的创建产品
5.产品品类选择智慧城市->环境感知->温湿度检测
6.智能化方式选择设备接入
7.创建如图
8.创建后下面列表出现了你的产品,随后点击右边的产品开发
9.设置物模型(可以创建多个)
10.在中间找到添加自定义功能点后如图
11.新增后然后记得点鸡保存
12.Token生成,回到OneNET官网开始界面,点击“开发者中心”旁边的文档
然后如图所示找到Token生成工具,里面也有其他的具体内容
Token生成器下载地址
13.下载完成后打开一个时间戳转换网址,我就在浏览器随便找一个了
时间戳转换地址
14.打开刚刚的Token转换工具
连接MQTT
6.//设置MQTT服务器属性
AT+MQTTUSERCFG=0,1,"设备名称","设备id","粘贴刚刚生成后的Token",0,0,""
7、//连接服务器
AT+MQTTCONN=0,"mqtts.heclouds.com",1883,1
8、//选定物模型
AT+MQTTSUB=0,"$sys/设备id/设备名称/thing/property/post/reply",1
9、//修改物模型数据并上传
AT+MQTTPUB=0,"$sys/设备id/设备名称/thing/property/post","{\"id\":\"123\"\,\"params\":{\"物模型标识符\":{\"value\":数据\}}}",0,0
如果发送成功则最后会显示success,如下图所示
下面是我发送的数据,在设备详细的属性里面可以看到
可能遇到的问题
1.WIFI连接不上
在烧录固件后可能连不上WIFI
可能的解决方法:1.先保证手机的热点或家庭WIFI是2.4G的,可以通过手机WIFI查看
2.如果2.4G连接后失败返回的是
+CWJAP 4
ERROR
则尝试几遍,如果还是不行则使用那招
1.先把手机热点的密码关闭并复位ESP8266
2.发送AT指令AT+CWSAP?
它会回复+CWSAP:"名称","",1,0,4,0
回复错误则复位多发送几次可能就连上了
3.发送AT+CWSAP="WIFI名称","",1,0,4,0
如果回复“OK”则可以继续
4.可以把你的WIFI设置密码发送
AT+CWJAP="WIFI名称","密码"
就可以了
5.如果还不行那么就自己查资料把,我搜了很久就找到这个奇怪的不知道原理的方法,因为我就是遇到这个问题并弄好了
连接MQTT服务器时一直说错误
AT+MQTTCONN=0,"mqtts.heclouds.com",1883,1
就这一句发不出去
可能的解决方法:下载另一个固件并测试AT指令,然后再下载回来这个固件,多次尝试即可,至少我是这么解决的,网上也搜不到可靠的办法,发送出去是会返回“OK”的文章来源:https://www.toymoban.com/news/detail-764401.html
总结
1.后续更新基于stm32F103c8t6的MQTT发送数据代码
2.可能还会由很多问题不知道怎么解决,能做的就是去网上查资料和排列组合去查找问题了
3.还有其他的问题可以在评论区询问或者私信文章来源地址https://www.toymoban.com/news/detail-764401.html
到了这里,关于STM32发送数据ESP8266固件烧录MQTT和AT指令调试与链接OneNET的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!