前段时间给同学做了一个小项目。基于stm32103获取空气质量数据,温湿度等信息,然后利用nb-iot上传。之前一直听过这个nb模块,但一直没用过,借此机会来试一试,关于温湿度,pm2.5信息就不说了,这里主要介绍一下利用nb-iot怎么上传数据的。
我用的是 有人物联网的WH-NB75-B5,大家用的时候最好还是买根天线吧,一开始没有天线,都查找不到设备。
https://console.usr.cn/#/cloudV2/homePage/ViewHomePage
然后进入有人官网的透传云,注册一下账号。
有人官网教程已经给的很详细了,就如下图步骤一样
http://www.usr.cn/Down/NB-IoT_al_t_V1.0.5.pdf
这个是官方文档可以看一下,里面已经讲得非常详细了,这里我就不多说了
这里是我设置的数据模板
接下来就直接看代码了,也非常的简单。
#include "nbiot.h"
#include "sys.h"
#include "DHT11.h"
#include "usart.h"
#include "delay.h"
#include "crc.h"
#include "string.h"
/* 在串口文件中定义的全局变量 */
extern u8 REC_BUF_NBIOT[50];
extern u8 flag;
u8 send_buf[50];
/* 数据的初始值 */
u8 data[] = {0x01, 0x46, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
/* 发送数据至服务器 */
void send(u8 humi, u8 temp, u8 pm_25, u8 pm_10)
{
u8 high, low;
data[8] = humi;
data[10] = temp;
data[12] = pm_25;
data[14] = pm_10;
/* CRC16校验码 */
high = usMBCRC16(data, sizeof(data)) & 0xff;
low = (usMBCRC16(data, sizeof(data))>>8) & 0xff;
sprintf(send_buf,"AT+NMGS=17,0146000000040800%02x00%02x00%02x00%02x%02x%02x\r\n",humi, temp, pm_25, pm_10, high, low);
send_str(send_buf);
delay_ms(1000);
}
/* 等待NBIOT初始,返回connect时表示与服务器连接成功*/
unsigned int NBIOT_init(void)
{
if (flag == 1)
{
if (!strncmp("Connected", REC_BUF_NBIOT, 9))
{
flag = 0;
return 0;
}
else
{
flag = 0;
return 1;
}
}
flag = 0;
return 1;
}
/*设置NBIOT为AT指令模式 */
void AT_MODEL(void)
{
u8 buf[10];
sprintf(buf,"+++");
send_str(buf);
delay_ms(500);
sprintf(buf,"a");
send_str(buf);
delay_ms(500);
}
u8 rec_buf[50];
u8 flag;
void USART1_IRQHandler(void)
{
static int i = 0;
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE)
rec_buf[i++] = USART_ReceiveData(USART1);
}
if (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
USART1->DR;
USART1->SR;
i = 0;
flag = 1;
}
}
void send_str(unsigned char *buf1)
{
u8 i=0;
while(1)
{
if(buf1[i] != 0)
{
USART_SendData(USART1,buf1[i]);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET){};
i++;
}
else
{
return ;
}
}
}
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "DHT11.h"
#include "crc.h"
#include "nbiot.h"
#include "string.h"
int main(void)
{
u8 temp, humi;
float pm_25, pm_10;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(9600);
uart2_init(9600);
while(NBIOT_init());
AT_MODEL();
while(DHT11_Init());
while(1)
{
pm_25 = PM_25();
pm_10 = PM_10();
DHT11_Read_Data(&temp, &humi);
send(humi, temp, pm_25, pm_10);
HMI(humi, temp, pm_25, pm_10);
}
}
首先我等待nbiot初始化,由于之前我用了nbiot的透传,所以现在默认状态不是AT指令状态,所以接下来还要设置为AT模式。
然后就是将数据上传了,最好循环上传,然后在网页的调试界面查看数据进来了没,如果进来了,代表至少发送上去了,但如果格式不正确,数据模板里并不能正常显示。下面是我收到的数据。
是不是非常简单!他还有报警功能,需要的可以自己添加进去,包括根据自己的需要也可以自行二次开发。
才疏学浅,有什么不对的地方欢迎大神指点,也欢迎讨论,接下来还会玩一下esp8266的sdk与ZigBee二次开发,有兴趣的后续可以关注一下哦。