本文正在参加星光计划3.0–夏日挑战赛
1.前言
伴随着网络技术,各种通讯技术,传感器技术的飞速发展,物联网技术成为了当今技术领域发展为迅速的技术。而物联网技术的核心仍然是以互联网技术为基础的,物联网是新一代信息技术的重要组成部分,也是信息化时代的重要发展阶段。物联网通过智能感知、识别技术与普适计算等通信感知技术,广泛应用于网络的融合中,也因此被称为继计算机、互联网之后世界信息产业发展的第三次浪潮。
本设计的模型来源于物流、矿山、高速公路等场合,车辆称重地螃的智能化升级要求,设计基于物联网的智能在线称重方案,开发智能称重控制器,合理选择部署多个重量传感器和必要的算法、通过WIFF通信模块、GPS定位模块,采集车辆重数据一地理位置信息,并通过网络发送至云平台,设计图形化UI界面展示称重、地图位置等重要信息,实现对称重系统的远程监测。
随着物联网技术的逐步发展和日趋成熟,物联网技术是一个大而广的应用技术,并非仅仅局限于延伸应用。相信对地磅来说必然会有更多创新的应用实践。总的来说,地磅现代化、信息化、智能化一定紧随物联网技术的发展,而物联网技术的发展也必将促使地磅兴起新的技术革命。
设计的技术与硬件选项总结:
(1)云端通信模块采用ESP8266-WIFI
(2)联网通信模块采用:ESP8266
(3)GPS模块:采用ATGM336H双模GPS模块
(4)电子秤模块:用于称重
(5)物联网云平台:采用华为云物联网平台
设计总结:
(1)采用ESP8266连接华为云上传称重数据和GPS数据到云端(采用MQTT协议)
云端上显示2个数据:GPS定位数据–地图显示,称重传感器的数据值
(2)3个称重传感器接一个秤面称重计算平均值
(3)本地OLED显示屏显示GPS经纬度数据、称重传感器的数据值。
(4)OLED设计一个页面显示并设置当前的报警上限。通过按键进行加减
当称重的阀值超出了设置阀值,蜂鸣器报警。




2. 硬件选型
2.1 STM32F103C8T6
STM32F103C8T6是一款基于ARM Cortex-M 内核STM32系列的32位的微控制器,程序存储器容量是64KB,需要电压2V~3.6V,工作温度为-40°C ~ 85°C。

2.2 电子秤传感器

HX711 是一款专为高精度称重传感器而设计的24位A/D 转换器芯片。
2.3 ESP8266-wifi

2.4 GPS模块

2.5 蜂鸣器

3. 创建云端产品与设备
3.1 创建产品
地址:https://www.huaweicloud.com/?locale=zh-cn




3.2 创建设备
地址: https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/device/all-device


3.3 自定义模型数据
链接:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-dev/all-product/7211833377cf435c8c0580de390eedbe/product-detail/6277d70223aaf461a0f72a56
这个模型数据就是设备要上传的数据。





3.4 MQTT密匙生成
创建完产品、设备之后,接下来就需要知道如何通过MQTT协议登陆华为云服务器。
官方的详细介绍在这里:
https://support.huaweicloud.com/devg-iothub/iot_01_2127.html#ZH-CN_TOPIC_0240834853__zh-cn_topic_0251997880_li365284516112
属性上报格式:
https://support.huaweicloud.com/api-iothub/iot_06_v5_3010.html


MQTT设备登陆密匙生成地址: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/


华为云物联网平台的域名是: 161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
华为云物联网平台的IP地址是:121.36.42.100
在软件里参数填充正确之后,就看到设备已经连接成功了。
接下来打开设备页面,可以看到设备已经在线了。


3.5 主题订阅与发布
通过MQTT客户端软件模拟上报测试:

查看控制台页面,数据已经上传成功了。

3.6 应用侧开发
为了更方便的展示设备数据,与设备完成交互,还需要开发一个配套的上位机,官方提供了应用侧开发的API接口、SDK接口,为了方便通用一点,我这里采用了API接口完成数据交互,上位机软件采用QT开发。
帮助文档地址: https://support.huaweicloud.com/api-iothub/iot_06_v5_0034.html
设备属性就是设备上传的传感器状态数据信息,应用侧提供了API接口,可以主动向设备端下发请求指令;设备端收到指令之后需要按照约定的数据格式上报数据;所以,要实现应用层与设备端的数据交互,需要应用层与设备端配合才能完成。


在使用接口时,最好先使用华为自己的调试接口测试。
https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=ListProperties

上位机软件采用Qt框架设计,Qt是一个跨平台的C图形用户界面应用程序框架。Qt是一个1991年由Qt Company开发的跨平台C图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。简单来说,QT可以很轻松的帮你做带界面的软件,甚至不需要你投入很大精力。
QT官网: https://www.qt.io/

4. STM32设备端开发
4.1 程序下载

4.2 原理图

4.3 硬件接线
4.4 MQTT连接代码
4.5 ESP8266代码
#include "esp8266.h"
u8 ESP8266_IP_ADDR[16];
u8 ESP8266_MAC_ADDR[18];
u8 ESP8266_SendCmd(char *cmd)
{
u8 i,j;
for(i=0;i<10;i++)
{
USARTx_StringSend(USART3,cmd);
for(j=0;j<100;j++)
{
delay_ms(50);
if(USART3_RX_FLAG)
{
USART3_RX_BUFFER[USART3_RX_CNT]='\0';
USART3_RX_FLAG=0;
USART3_RX_CNT=0;
if(strstr((char*)USART3_RX_BUFFER,"OK"))
{
return 0;
}
}
}
}
return 1;
}
u8 ESP8266_Init(void)
{
USARTx_StringSend(USART3,"+++");
delay_ms(50);
return ESP8266_SendCmd("AT\r\n");
}
u8 ESP8266_AP_TCP_Server_Mode(char *ssid,char *pass,u16 port)
{
char *p;
u8 i;
char ESP8266_SendCMD[100];
if(ESP8266_SendCmd("AT\r\n"))return 1;
if(ESP8266_SendCmd("ATE0\r\n"))return 2;
if(ESP8266_SendCmd("AT+CWMODE=2\r\n"))return 3;
ESP8266_SendCmd("AT+RST\r\n");
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
if(ESP8266_SendCmd("ATE0\r\n"))return 5;
sprintf(ESP8266_SendCMD,"AT+CWSAP=\"%s\",\"%s\",1,4\r\n",ssid,pass);
if(ESP8266_SendCmd(ESP8266_SendCMD))return 6;
if(ESP8266_SendCmd("AT+CIPMUX=1\r\n"))return 7;
sprintf(ESP8266_SendCMD,"AT+CIPSERVER=1,%d\r\n",port);
if(ESP8266_SendCmd(ESP8266_SendCMD))return 8;
if(ESP8266_SendCmd("AT+CIFSR\r\n"))return 9;
p=strstr((char*)USART3_RX_BUFFER,"APIP");
if(p)
{
p+=6;
for(i=0;*p!='"';i++)
{
ESP8266_IP_ADDR[i]=*p++;
}
ESP8266_IP_ADDR[i]='\0';
}
p=strstr((char*)USART3_RX_BUFFER,"APMAC");
if(p)
{
p+=7;
for(i=0;*p!='"';i++)
{
ESP8266_MAC_ADDR[i]=*p++;
}
ESP8266_MAC_ADDR[i]='\0';
}
USART1_Printf("当前WIFI模式:AP+TCP服务器\n");
USART1_Printf("当前WIFI热点名称:%s\n",ssid);
USART1_Printf("当前WIFI热点密码:%s\n",pass);
USART1_Printf("当前TCP服务器端口号:%d\n",port);
USART1_Printf("当前TCP服务器IP地址:%s\n",ESP8266_IP_ADDR);
USART1_Printf("当前TCP服务器MAC地址:%s\n",ESP8266_MAC_ADDR);
return 0;
}
u8 ESP8266_ServerSendData(u8 id,u8 *data,u16 len)
{
u8 i,j,n;
char ESP8266_SendCMD[100];
for(i=0;i<10;i++)
{
sprintf(ESP8266_SendCMD,"AT+CIPSEND=%d,%d\r\n",id,len);
USARTx_StringSend(USART3,ESP8266_SendCMD);
for(j=0;j<10;j++)
{
delay_ms(50);
if(USART3_RX_FLAG)
{
USART3_RX_BUFFER[USART3_RX_CNT]='\0';
USART3_RX_FLAG=0;
USART3_RX_CNT=0;
if(strstr((char*)USART3_RX_BUFFER,">"))
{
USARTx_DataSend(USART3,data,len);
for(n=0;n<200;n++)
{
delay_ms(50);
if(USART3_RX_FLAG)
{
USART3_RX_BUFFER[USART3_RX_CNT]='\0';
USART3_RX_FLAG=0;
USART3_RX_CNT=0;
if(strstr((char*)USART3_RX_BUFFER,"SEND OK"))
{
return 0;
}
}
}
}
}
}
}
return 1;
}
u8 ESP8266_STA_TCP_Client_Mode(char *ssid,char *pass,char *ip,u16 port,u8 flag)
{
char ESP8266_SendCMD[100];
if(ESP8266_SendCmd("AT\r\n"))return 1;
if(ESP8266_SendCmd("ATE0\r\n"))return 2;
if(ESP8266_SendCmd("AT+CWMODE=1\r\n"))return 3;
ESP8266_SendCmd("AT+RST\r\n");
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
if(ESP8266_SendCmd("ATE0\r\n"))return 5;
sprintf(ESP8266_SendCMD,"AT+CWJAP=\"%s\",\"%s\"\r\n",ssid,pass);
if(ESP8266_SendCmd(ESP8266_SendCMD))return 6;
if(ESP8266_SendCmd("AT+CIPMUX=0\r\n"))return 7;
sprintf(ESP8266_SendCMD,"AT+CIPSTART=\"TCP\",\"%s\",%d\r\n",ip,port);
if(ESP8266_SendCmd(ESP8266_SendCMD))return 8;
if(flag)
{
if(ESP8266_SendCmd("AT+CIPMODE=1\r\n"))return 9;
if(ESP8266_SendCmd("AT+CIPSEND\r\n"))return 10;
if(!(strstr((char*)USART3_RX_BUFFER,">")))
{
return 11;
}
}
USART1_Printf("当前WIFI模式:STA+TCP客户端\n");
USART1_Printf("当前连接的WIFI热点名称:%s\n",ssid);
USART1_Printf("当前连接的WIFI热点密码:%s\n",pass);
USART1_Printf("当前连接的TCP服务器端口号:%d\n",port);
USART1_Printf("当前连接的TCP服务器IP地址:%s\n",ip);
return 0;
}
u8 ESP8266_ClientSendData(u8 *data,u16 len)
{
u8 i,j,n;
char ESP8266_SendCMD[100];
for(i=0;i<10;i++)
{
sprintf(ESP8266_SendCMD,"AT+CIPSEND=%d\r\n",len);
USARTx_StringSend(USART3,ESP8266_SendCMD);
for(j=0;j<10;j++)
{
delay_ms(50);
if(USART3_RX_FLAG)
{
USART3_RX_BUFFER[USART3_RX_CNT]='\0';
USART3_RX_FLAG=0;
USART3_RX_CNT=0;
if(strstr((char*)USART3_RX_BUFFER,">"))
{
USARTx_DataSend(USART3,data,len);
for(n=0;n<200;n++)
{
delay_ms(50);
if(USART3_RX_FLAG)
{
USART3_RX_BUFFER[USART3_RX_CNT]='\0';
USART3_RX_FLAG=0;
USART3_RX_CNT=0;
if(strstr((char*)USART3_RX_BUFFER,"SEND OK"))
{
return 0;
}
}
}
}
}
}
}
return 1;
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
- 133.
- 134.
- 135.
- 136.
- 137.
- 138.
- 139.
- 140.
- 141.
- 142.
- 143.
- 144.
- 145.
- 146.
- 147.
- 148.
- 149.
- 150.
- 151.
- 152.
- 153.
- 154.
- 155.
- 156.
- 157.
- 158.
- 159.
- 160.
- 161.
- 162.
- 163.
- 164.
- 165.
- 166.
- 167.
- 168.
- 169.
- 170.
- 171.
- 172.
- 173.
- 174.
- 175.
- 176.
- 177.
- 178.
- 179.
- 180.
- 181.
- 182.
- 183.
- 184.
- 185.
- 186.
- 187.
- 188.
- 189.
- 190.
- 191.
- 192.
- 193.
- 194.
- 195.
- 196.
- 197.
- 198.
- 199.
- 200.
- 201.
- 202.
- 203.
- 204.
- 205.
- 206.
- 207.
- 208.
- 209.
- 210.
- 211.
- 212.
- 213.
- 214.
- 215.
- 216.
- 217.
- 218.
- 219.
- 220.
- 221.
- 222.
- 223.
- 224.
- 225.
- 226.
- 227.
- 228.
- 229.
- 230.
- 231.
- 232.
- 233.
- 234.
- 235.
- 236.
- 237.
- 238.
- 239.
- 240.
- 241.
- 242.
- 243.
- 244.
- 245.
- 246.
- 247.
- 248.
- 249.
- 250.
- 251.
- 252.
- 253.
- 254.
- 255.
- 256.
- 257.
- 258.
- 259.
- 260.
- 261.
- 262.
如果需要整个工程源码的话,评论区留下邮箱即可。
建议上个gitee链接。
另外,如果最终产品化的话,收集用户定位信息是不是有点.......
好的,后面准备上传Git仓库。
小龙哥,还可以要这个程序的源代码吗?
1701516796@qq.com,小龙哥,还可以要这个程序的源代码吗?谢谢