提要
STM32連接ESP8266發(fā)送數(shù)據(jù)到OneNET平臺
0.文章所需要的均可點(diǎn)擊上方的資源包免費(fèi)下載
1.硬件型號:ESP8266-01s 和 USBTTL轉(zhuǎn)接口模塊
2.固件:1471_esp8266-at_mqtt-1m(MQTT透傳AT固件(固件號:1471))
3.固件燒錄工具:flash_download_tool_3.9.4
固件下載和燒錄工具均可在安信可官網(wǎng)下載安信可AT固件下載
本文章使用的是XCOM V2.6 串口助手
4.OneNET平臺創(chuàng)建MQTT——WIFI直連
5.AT指令調(diào)試
6.可能遇到的問題
ESP8266驅(qū)動代碼如下 ||可以在資源包里下載(免費(fèi))
這里代碼是學(xué)習(xí)B站江科大stm32教程寫的串口2
B站江科大stm32串口學(xué)習(xí)
ESP8266驅(qū)動則是參考B站up“彼岸有光我們有船”
ESP8266驅(qū)動代碼視頻
資源包里也有
//單片機(jī)頭文件
#include "stm32f10x.h" // Device header
//C語言標(biāo)準(zhǔn)庫函數(shù)
#include <string.h>
#include <stdio.h>
//驅(qū)動
#include "USART.h"
#include "Delay.h"
#include "OLED.h"
//ESP8266驅(qū)動
#include "ESP8266.h"
#define REV_WAIT 1
#define REV_OK 0
//連接WIFI
#define ESP8266_WIFI_INFO "AT+CWJAP=\"WIFI名字\",\"WIFI密碼\"\r\n"
//連接服務(wù)器
#define ESP8266_ONENET_INFO "AT+MQTTCONN=0,\"mqtts.heclouds.com\",1883,1\r\n"
//寫你自己的Token
#define ESP8266_USERCFG_INFO "AT+MQTTUSERCFG=0,1,\"設(shè)備名稱\",\"設(shè)備ID\",\"Token\",0,0,\"\"\r\n"
const char* pubtopic="$sys/設(shè)備id/設(shè)備名稱/thing/property/post";
unsigned char ESP8266_Buffer[256];
unsigned short ESP8266_cnt = 0, ESP8266_cntPre = 0;
uint8_t RxData;
//==========================================================
// 函數(shù)名稱: ESP8266_Clear
//
// 函數(shù)功能: 清空緩存
//
// 入口參數(shù): 無
//
// 返回參數(shù): 無
//
// 說明:
//==========================================================
void ESP8266_Clear()
{
memset(ESP8266_Buffer, 0, sizeof(ESP8266_Buffer));
ESP8266_cnt = 0;
}
//==========================================================
// 函數(shù)名稱: ESP8266_WaitRecive
//
// 函數(shù)功能: 等待接收完成
//
// 入口參數(shù): 無
//
// 返回參數(shù): REV_OK-接收完成 REV_WAIT-接收超時未完成
//
// 說明: 循環(huán)調(diào)用檢測是否接收完成
//==========================================================
uint8_t ESP8266_WaitRecive(void)
{
if(ESP8266_cnt == 0) //如果接收計數(shù)為0 則說明沒有處于接收數(shù)據(jù)中,所以直接跳出,結(jié)束函數(shù)
return REV_WAIT;
if(ESP8266_cnt == ESP8266_cntPre) //如果上一次的值和這次相同,則說明接收完畢
{
ESP8266_cnt = 0; //清0接收計數(shù)
return REV_OK; //返回接收完成標(biāo)志
}
ESP8266_cntPre = ESP8266_cnt; //置為相同
return REV_WAIT; //返回接收未完成標(biāo)志
}
//==========================================================
// 函數(shù)名稱: ESP8266_SendCmd
//
// 函數(shù)功能: 發(fā)送命令
//
// 入口參數(shù): cmd:命令
// res:需要檢查的返回指令
//
// 返回參數(shù): 0-成功 1-失敗
//
// 說明:
//==========================================================
uint8_t ESP8266_SendCmd(char *cmd, char *res)
{
unsigned char timeOut = 200;
Serial_SendString(cmd);
while(timeOut--)
{
if(ESP8266_WaitRecive() == REV_OK) //如果收到數(shù)據(jù)
{
if(strstr((const char *)ESP8266_Buffer, res) != NULL) //如果檢索到關(guān)鍵詞
{
ESP8266_Clear(); //清空緩存
return 0;
}
}
Delay_ms(10);
}
return 1;
}
//==========================================================
// 函數(shù)名稱: ESP8266_Init
//
// 函數(shù)功能: 初始化ESP8266
//
// 入口參數(shù): 無
//
// 返回參數(shù): 無
//
// 說明:
//==========================================================
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");
}
//==========================================================
// 函數(shù)名稱: ESP8266_SendData
//
// 函數(shù)功能: 發(fā)送數(shù)據(jù)
//
// 入口參數(shù): temp:溫度值
// humi:濕度值
// adcx:光照度
//
// 返回參數(shù): 無
//
// 說明:
//==========================================================
void ESP8266_SendData(double temp,double humi,double adcx)
{
char cmdBuf[512];
ESP8266_Clear(); //清空接收緩存
//先發(fā)送要發(fā)送數(shù)據(jù)的指令做準(zhǔn)備
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); //發(fā)送命令
while(ESP8266_SendCmd(cmdBuf, "OK"))
Delay_ms(500);
OLED_ShowString(3,1,"8");
memset(cmdBuf,0,sizeof(cmdBuf));
Delay_ms(100);
}
//==========================================================
// 函數(shù)名稱: USART2_IRQHandler
//
// 函數(shù)功能: 串口2收發(fā)中斷
//
// 入口參數(shù): 無
//
// 返回參數(shù): 無
//
// 說明:
//==========================================================
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接口
下面的黑色按鈕是復(fù)位鍵
ESP8266 圖片為:
USB轉(zhuǎn)接頭
固件下載
固件下載地址
燒錄軟件和串口工具下載地址
燒錄步驟
1.找到你下載好的固件和燒錄軟件,打開你的燒錄軟件
燒錄成功后
燒錄成功后會顯示完成,直接關(guān)閉即可,隨后打開一個串口助手
將你的硬件插上你的設(shè)備,然后打開串口(對應(yīng)的端口)再按下硬件黑色的復(fù)位鍵
如果開始是亂碼,但最后有顯示ready就是燒錄成功
發(fā)送AT指令
AT指令測試ESP8266
先是測試AT指令是否正常發(fā)送
記得最后換行發(fā)送哦
1.AT //發(fā)送測試指令,如果ESP8266收到則會回應(yīng)一個“OK”
2.AT+RST //發(fā)送復(fù)位指令,相當(dāng)于按下了復(fù)位鍵
3.AT+CWMODE=1 //設(shè)置為模式一,還有=2,=3兩種模式,我們目前只用這一種
4.AT+CWDHCP=1,1 //啟動DHCP
5.AT+CWJAP="ESP","123456789" //連接你的WiFi,前面為名稱,后面為密碼
注意WIFI必須是2.4G模式的
發(fā)送AT指令如果如上圖所示,則代表可以正常使用了
在OneNET上創(chuàng)建MQTT(示例)
1.登錄或注冊
OneNET登錄網(wǎng)站
2.登陸后點(diǎn)擊右上角的開發(fā)者中心
3.點(diǎn)擊左上角的產(chǎn)品開發(fā)
4.點(diǎn)擊右邊的創(chuàng)建產(chǎn)品
5.產(chǎn)品品類選擇智慧城市->環(huán)境感知->溫濕度檢測
6.智能化方式選擇設(shè)備接入
7.創(chuàng)建如圖
8.創(chuàng)建后下面列表出現(xiàn)了你的產(chǎn)品,隨后點(diǎn)擊右邊的產(chǎn)品開發(fā)
9.設(shè)置物模型(可以創(chuàng)建多個)
10.在中間找到添加自定義功能點(diǎn)后如圖
11.新增后然后記得點(diǎn)雞保存
12.Token生成,回到OneNET官網(wǎng)開始界面,點(diǎn)擊“開發(fā)者中心”旁邊的文檔
然后如圖所示找到Token生成工具,里面也有其他的具體內(nèi)容
Token生成器下載地址
13.下載完成后打開一個時間戳轉(zhuǎn)換網(wǎng)址,我就在瀏覽器隨便找一個了
時間戳轉(zhuǎn)換地址
14.打開剛剛的Token轉(zhuǎn)換工具
連接MQTT
6.//設(shè)置MQTT服務(wù)器屬性
AT+MQTTUSERCFG=0,1,"設(shè)備名稱","設(shè)備id","粘貼剛剛生成后的Token",0,0,""
7、//連接服務(wù)器
AT+MQTTCONN=0,"mqtts.heclouds.com",1883,1
8、//選定物模型
AT+MQTTSUB=0,"$sys/設(shè)備id/設(shè)備名稱/thing/property/post/reply",1
9、//修改物模型數(shù)據(jù)并上傳
AT+MQTTPUB=0,"$sys/設(shè)備id/設(shè)備名稱/thing/property/post","{\"id\":\"123\"\,\"params\":{\"物模型標(biāo)識符\":{\"value\":數(shù)據(jù)\}}}",0,0
如果發(fā)送成功則最后會顯示success,如下圖所示
下面是我發(fā)送的數(shù)據(jù),在設(shè)備詳細(xì)的屬性里面可以看到
可能遇到的問題
1.WIFI連接不上
在燒錄固件后可能連不上WIFI
可能的解決方法:1.先保證手機(jī)的熱點(diǎn)或家庭WIFI是2.4G的,可以通過手機(jī)WIFI查看
2.如果2.4G連接后失敗返回的是
+CWJAP 4
ERROR
則嘗試幾遍,如果還是不行則使用那招
1.先把手機(jī)熱點(diǎn)的密碼關(guān)閉并復(fù)位ESP8266
2.發(fā)送AT指令AT+CWSAP?
它會回復(fù)+CWSAP:"名稱","",1,0,4,0
回復(fù)錯誤則復(fù)位多發(fā)送幾次可能就連上了
3.發(fā)送AT+CWSAP="WIFI名稱","",1,0,4,0
如果回復(fù)“OK”則可以繼續(xù)
4.可以把你的WIFI設(shè)置密碼發(fā)送
AT+CWJAP="WIFI名稱","密碼"
就可以了
5.如果還不行那么就自己查資料把,我搜了很久就找到這個奇怪的不知道原理的方法,因?yàn)槲揖褪怯龅竭@個問題并弄好了
連接MQTT服務(wù)器時一直說錯誤
AT+MQTTCONN=0,"mqtts.heclouds.com",1883,1
就這一句發(fā)不出去
可能的解決方法:下載另一個固件并測試AT指令,然后再下載回來這個固件,多次嘗試即可,至少我是這么解決的,網(wǎng)上也搜不到可靠的辦法,發(fā)送出去是會返回“OK”的文章來源:http://www.zghlxwxcb.cn/news/detail-764401.html
總結(jié)
1.后續(xù)更新基于stm32F103c8t6的MQTT發(fā)送數(shù)據(jù)代碼
2.可能還會由很多問題不知道怎么解決,能做的就是去網(wǎng)上查資料和排列組合去查找問題了
3.還有其他的問題可以在評論區(qū)詢問或者私信文章來源地址http://www.zghlxwxcb.cn/news/detail-764401.html
到了這里,關(guān)于STM32發(fā)送數(shù)據(jù)ESP8266固件燒錄MQTT和AT指令調(diào)試與鏈接OneNET的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!