基于STM32的(NB-IOT(BC26))溫濕度監(jiān)測系統(tǒng)
閑來無事,用手頭STM32做個項目。
成品功能:STM32采集溫度、濕度數(shù)據(jù),顯示在屏幕上,通過NB-IOT(BC26)模塊連接阿里云物聯(lián)網(wǎng)平臺接受數(shù)據(jù)并實時監(jiān)控。
材料
- STM32ZET6開發(fā)板(戰(zhàn)艦V3)
- TFT顯示屏(戰(zhàn)艦有我用的2.7寸的)
- NB-IOT(BC26)模塊
- DHT11溫濕度模塊
- 杜邦線
- 用keil5進行開發(fā)
開始制作。
制作過程
首先從板子測溫濕度開始
DHT11溫濕度模塊
原子哥有DHT11例程,所以直接在此基礎(chǔ)上進行開發(fā)
下載上之后這是效果。
阿里云物聯(lián)網(wǎng)平臺
先到阿里云物聯(lián)網(wǎng)平臺注冊一個設(shè)備。
- 進入阿里云官網(wǎng)搜索物聯(lián)網(wǎng)平臺,現(xiàn)在可以免費注冊一個。
-
點擊設(shè)備接入服務(wù)
在這里插入圖片描述 -
點擊創(chuàng)建產(chǎn)品在這里插入圖片描述
-
聯(lián)網(wǎng)方式要選擇蜂窩(4G)網(wǎng)絡(luò)在這里插入圖片描述
-
點擊添加設(shè)備輸入設(shè)備名稱在這里插入圖片描述
-
選中該設(shè)備之后,點擊查看DeviceSecret碼在這里插入圖片描述
-
記錄這三個碼后邊有用在這里插入圖片描述
-
在設(shè)備中查看要發(fā)布信息的地址(下邊的屬性上報)在這里插入圖片描述
-
查看信息的標(biāo)識符,既傳送信息的頭部在這里插入圖片描述
- 阿里云物聯(lián)網(wǎng)平臺接受的是json格式,所以數(shù)據(jù)發(fā)送的格式為:
AT+QMTPUB=0,0,0,0,"/sys/a1Xi4HdVogd/mzh001/thing/event/property/post","
{"id":"26","version":"1.0","params": { "CurrentTemperature":{"value":32},"GeoLocation":{"E":123,"W":234} }, "method":"thing.event.property.post"}"
NB-IOT(BC26)模塊
先用USB轉(zhuǎn)TTL,用串口助手,用AT指令進行調(diào)整
這是用到的AT指令
在這里插入圖片描述
硬件連接:BC26的VIN接TTL的5V,BC26的GND接TTL的地,BC26的RX接TTL的TX,BC26的TX接TTL的RX,跳線帽短接BC26的PWR和3.3V
注意地和電千萬不能接錯,會燒壞器件?。。?br> 接好后插電腦上,連接串口助手(我用原子哥的XCOME)。
| 指令 | 返回 | 說明 |
|---|---|---|
| AT | OK | 模塊正常,可正常實現(xiàn)收發(fā) |
| AT+CIMI | 460043331505555 | 查詢是否有卡 |
| AT+CSQ | 1~31 | 信號強度 |
| AT+CGATT? | +CGATT: 1 | 查詢網(wǎng)絡(luò)注冊情況 |
| AT+CGPADDR=1 | +CGPADDR: 1,10.68.55.555 | 查詢是否分配IP地址 |
| AT+QMTCFG="aliauth",0,"a1Xi4HdV4gd","mz4001","c538f1eb6deb2020c83579bac4444405" | OK | 配置 MQTT 可選參數(shù) |
| AT+QMTOPEN=0,"iot-as-mqtt.cn-shanghai.aliyuncs.com",1883 | +QMTOPEN: 0,0 | 打開 MQTT 客戶端網(wǎng)絡(luò) |
| AT+QMTCONN=0,"test21115" | +QMTCONN: 0,0,0 | 連接客戶端至 MQTT 服務(wù)器 |
| AT+QMTPUB=0,0,0,0,"/sys/a1Xi4HdVogd/mzh001/thing/event/property/post","{"id":"26","version":"1.0","params":{"Temperature":{"value":32}},"method":"thing.event.property.post"}" | +QMTPUB: 0,0,0 | 發(fā)布消息 |
接著用串口助手發(fā)送這些指令進行調(diào)試。
在這里插入圖片描述

在這里插入圖片描述
說明:
- 數(shù)據(jù)5要結(jié)合你的阿里云物聯(lián)平臺中的7的三個碼
ProductKey、DeviceName和DeviceSecret。 - 數(shù)據(jù)6要結(jié)合阿里云地址和端口,一般設(shè)置這個就可以。
- 數(shù)據(jù)7是登陸請求,這個名字一般沒什么要求,只要不重復(fù)即可。
- 數(shù)據(jù)8要注意中間那個地址就是阿里云物聯(lián)網(wǎng)平臺8中那個屬性上報的topic地址。后邊的params要結(jié)合json數(shù)據(jù)格式以及阿里云物聯(lián)網(wǎng)平臺9中的標(biāo)識符,數(shù)據(jù)要注意阿里云物聯(lián)網(wǎng)平臺9中的數(shù)據(jù)格式。
- 最后返回
+QMTPUB: 0,0,0表示發(fā)送成功。 -
到阿里云物聯(lián)網(wǎng)平臺查看數(shù)據(jù)。點擊設(shè)備點擊查看,點擊物聯(lián)網(wǎng)數(shù)據(jù),可以打開實時更新。在這里插入圖片描述
-
數(shù)據(jù)出現(xiàn)問題,可以到日志中查看問題原因。在這里插入圖片描述
- 設(shè)備物聯(lián)網(wǎng)模型中出現(xiàn)我們上傳的數(shù)據(jù)就表示成功了。
這樣USB轉(zhuǎn)TTL單獨調(diào)試就成功了。
接下來將這些放到板子中實現(xiàn)自動化。
板載上傳數(shù)據(jù)
移植墨子號STM32F103RC的例程
- 首先在DHT11例程的基礎(chǔ)上,將
printf函數(shù)改為串口2,方便連接。初始化串口2。
//重定義fputc函數(shù)
int fputc(int ch, FILE *f)
{
while((USART2->SR&0X40)==0);//串口2輸出,循環(huán)發(fā)送直到發(fā)送完畢
USART2->DR = (u8) ch;
return ch;
}
- 移植BC26初始化以及連接函數(shù)。
void OPEN_BC26(void)
{
char *strx;
printf("AT\r\n");
delay_ms(300);
strx=strstr((const char*)USART_RX_BUF,(const char*)"OK");//返回OK
printf("AT\r\n");
delay_ms(300);
strx=strstr((const char*)USART_RX_BUF,(const char*)"OK");//返回OK
if(strx==NULL)
{
delay_ms(300);
delay_ms(300);
delay_ms(300);
delay_ms(300);
}
printf("AT\r\n");
delay_ms(300);
strx=strstr((const char*)USART_RX_BUF,(const char*)"OK");//返回OK
printf("ATE0&W\r\n"); //關(guān)閉回顯
delay_ms(300);
LED0=0;
printf("AT+QMTDISC=0\r\n");//關(guān)閉連接
delay_ms(300);
printf("AT+QMTCLOSE=0\r\n");
delay_ms(300);
}
3.main()函數(shù)中初始化
OPEN_BC26();//對BC26開機
BC26_Init();//對BC26初始化
MQTT_Init();//連接阿里云
板子串口返回+QMTOPEN: 0,0表示連接成功。
- 將需要傳送的值通過
aliyunMQTT_PUBdata(temp,humi);函數(shù)發(fā)送到MTQQ準(zhǔn)備函數(shù)中。 - 接收之后通過
//訪問阿里云需要提交的數(shù)據(jù)
u8 Mqttaliyun_Savedata_tm(u8 *t_payload,u8 temp,u8 humi)
{
char json[]="{\"id\":\"26\",\"version\":\"1.0\",\"params\":{\"CurrentTemperature\":{\"value\":%d},\"CurrentHumidity\":{\"value\":%d}},\"method\":\"thing.event.property.post\"}";
char t_json[200];
unsigned short json_len;
sprintf(t_json, json, temp, humi);
json_len = strlen(t_json)/sizeof(char);
memcpy(t_payload, t_json, json_len);
return json_len;
}
函數(shù)包裝成需要提交的數(shù)據(jù)JSON格式。
- 發(fā)送數(shù)據(jù)并查看返回值
void aliyunMQTT_PUBdata(u8 temp,u8 humi)
{
u8 t_payload[200],len,t_payload_1[200],len_1;;
printf("AT+QMTPUB=0,0,0,0,%s\r\n",PubTopic);//發(fā)布主題
delay_ms(300);
len=Mqttaliyun_Savedata_tm(t_payload,temp,humi);
t_payload[len]=0;
printf("%s",t_payload);
while((USART2->SR&0X40)==0){}//循環(huán)發(fā)送知道發(fā)送完畢
USART2->DR = (u8) 0x1A;
delay_ms(100);
strx=strstr((const char*)RxBuffer,(const char*)"+QMTPUB: 0,0,0");//看下返回狀態(tài)
while(strx==NULL)
{
strx=strstr((const char*)RxBuffer,(const char*)"+QMTPUB: 0,0,0");//看下返回狀態(tài)
}
Clear_Buffer();
}
- 查看串口助手返回
+QMTPUB: 0,0,0
:0.0},"HoldingTemperature":13,"Diu":0},"method":"thing.event.property.post"}
OK這個表示成功。 -
到阿里云物聯(lián)網(wǎng)平臺查看設(shè)備。打開設(shè)備實時更新,可以看到數(shù)據(jù)更新正常。在這里插入圖片描述
最后附上完整的項目文件。自行下載。
這個項目到這里就算完了。
還有很多不足的地方,希望大佬可以指正。也希望和愛好者交流學(xué)習(xí)。
禁止轉(zhuǎn)載?。?!
QQ:2039723308
VX:Shiboven