闲来无事,用手头STM32做个项目。
成品功能:STM32采集温度、湿度数据,显示在屏幕上,通过NB-IOT(BC26)模块连接阿里云物联网平台接受数据并实时监控。
开始制作。
首先从板子测温湿度开始
原子哥有DHT11例程,所以直接在此基础上进行开发
下载上之后这是效果。
先到阿里云物联网平台注册一个设备。
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"}"
先用USB转TTL,用串口助手,用AT指令进行调整
硬件连接:BC26的VIN接TTL的5V,BC26的GND接TTL的地,BC26的RX接TTL的TX,BC26的TX接TTL的RX,跳线帽短接BC26的PWR和3.3V
注意地和电千万不能接错,会烧坏器件!!!
接好后插电脑上,连接串口助手(我用原子哥的XCOME)。
指令 | 返回 | 说明 |
---|---|---|
AT | OK | 模块正常,可正常实现收发 |
AT+CIMI | 460043331505555 | 查询是否有卡 |
AT+CSQ | 1~31 | 信号强度 |
AT+CGATT? | +CGATT: 1 | 查询网络注册情况 |
AT+CGPADDR=1 | +CGPADDR: 1,10.68.55.555 | 查询是否分配IP地址 |
AT+QMTCFG=“aliauth”,0,“a1Xi4HdV4gd”,“mz4001”,“c538f1eb6deb2020c83579bac4444405” | OK | 配置 MQTT 可选参数 |
AT+QMTOPEN=0,“iot-as-mqtt.cn-shanghai.aliyuncs.com”,1883 | +QMTOPEN: 0,0 | 打开 MQTT 客户端网络 |
AT+QMTCONN=0,“test21115” | +QMTCONN: 0,0,0 | 连接客户端至 MQTT 服务器 |
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 | 发布消息 |
ProductKey
、DeviceName
和DeviceSecret
。+QMTPUB: 0,0,0
表示发送成功。这样USB转TTL单独调试就成功了。
接下来将这些放到板子中实现自动化。
移植墨子号STM32F103RC的例程
printf
函数改为串口2,方便连接。初始化串口2。//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART2->SR&0X40)==0);//串口2输出,循环发送直到发送完毕
USART2->DR = (u8) ch;
return ch;
}
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"); //关闭回显
delay_ms(300);
LED0=0;
printf("AT+QMTDISC=0\r\n");//关闭连接
delay_ms(300);
printf("AT+QMTCLOSE=0\r\n");
delay_ms(300);
}
3.main()
函数中初始化
OPEN_BC26();//对BC26开机
BC26_Init();//对BC26初始化
MQTT_Init();//连接阿里云
板子串口返回+QMTOPEN: 0,0
表示连接成功。
4. 将需要传送的值通过aliyunMQTT_PUBdata(temp,humi);
函数发送到MTQQ准备函数中。
5. 接收之后通过
//访问阿里云需要提交的数据
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;
}
函数包装成需要提交的数据JSON格式。
6. 发送数据并查看返回值
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);//发布主题
delay_ms(300);
len=Mqttaliyun_Savedata_tm(t_payload,temp,humi);
t_payload[len]=0;
printf("%s",t_payload);
while((USART2->SR&0X40)==0){
}//循环发送知道发送完毕
USART2->DR = (u8) 0x1A;
delay_ms(100);
strx=strstr((const char*)RxBuffer,(const char*)"+QMTPUB: 0,0,0");//看下返回状态
while(strx==NULL)
{
strx=strstr((const char*)RxBuffer,(const char*)"+QMTPUB: 0,0,0");//看下返回状态
}
Clear_Buffer();
}
+QMTPUB: 0,0,0
:0.0},"HoldingTemperature":13,"Diu":0},"method":"thing.event.property.post"}
OK
这个表示成功。最后附上完整的项目文件。自行下载。
这个项目到这里就算完了。
还有很多不足的地方,希望大佬可以指正。也希望和爱好者交流学习。
禁止转载!!!
QQ:2039723308
VX:Shiboven