本文分享自华为云社区《基于STM32+华为云IOT设计智能称重系统》,作者:DS小龙哥 。

伴随着网络技术,各种通讯技术,传感器技术的飞速发展,物联网技术成为了当今技术领域发展为迅速的技术。而物联网技术的核心仍然是以互联网技术为基础的,物联网是新一代信息技术的重要组成部分,也是信息化时代的重要发展阶段。物联网通过智能感知、识别技术与普适计算等通信感知技术,广泛应用于网络的融合中,也因此被称为继计算机、互联网之后世界信息产业发展的第三次浪潮。

本设计的模型来源于物流、矿山、高速公路等场合,车辆称重地螃的智能化升级要求,设计基于物联网的智能在线称重方案,开发智能称重控制器,合理选择部署多个重量传感器和必要的算法、通过WIFF通信模块、GPS定位模块,采集车辆重数据一地理位置信息,并通过网络发送至云平台,设计图形化UI界面展示称重、地图位置等重要信息,实现对称重系统的远程监测。

随着物联网技术的逐步发展和日趋成熟,物联网技术是一个大而广的应用技术,并非仅仅局限于延伸应用。相信对地磅来说必然会有更多创新的应用实践。总的来说,地磅现代化、信息化、智能化一定紧随物联网技术的发展,而物联网技术的发展也必将促使地磅兴起新的技术革命。

1.设计的技术与硬件选项总结:

(1)云端通信模块采用ESP8266-WIFI

(2)联网通信模块采用:ESP8266

(3)GPS模块:采用ATGM336H双模GPS模块

(4)电子秤模块:用于称重

(5)物联网云平台:采用华为云物联网平台

设计总结:

(1)采用ESP8266连接OneNet上传称重数据和GPS数据到云端(采用HTTP协议)

云端上显示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
这个模型数据就是设备要上传的数据。

{"device_id": "6277d70223aaf461a0f72a56_weigh","secret": "12345678"
}服务ID: weigh
属性名称    数据类型    访问方式    描述
weigh      int(整型)  可读     重量
GPS    string(字符串)  可读    GPS定位信息

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/

DeviceId         6277d70223aaf461a0f72a56_weigh
DeviceSecret    12345678
ClientId        6277d70223aaf461a0f72a56_weigh_0_0_2022050814
Username        6277d70223aaf461a0f72a56_weigh
Password       0a3d097c6449b8526a562006a74c8c5e61ce63d6c831ea291560736a3332cf77

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

3.5 主题订阅与发布

//订阅主题: 平台下发消息给设备
$oc/devices/6277d70223aaf461a0f72a56_weigh/sys/messages/down
//设备上报数据
$oc/devices/6277d70223aaf461a0f72a56_weigh/sys/properties/report
//上报的属性消息 (一次可以上报多个属性,在json里增加就行了)
{"services": [{"service_id": "weigh","properties":{"GPS":"lat:12.345,lng:45.678"}}]}

通过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 硬件接线

(1)OLED显示屏接线:
D0----(SCK)------------------->>PB14
D1----(MOSI)------------------>>PB13
RES—(复位脚低电平有效)-------->>PB12
DC--(数据和命令控制管脚)------>>PB1
CS--(片选引脚)---------------->>PA7
GND--------------------------->>GND
VCC--------------------------->>3.3V或者5V(2)ATK-ESP8266 WIFI接线
PA2(TX)--RXD 模块接收脚
PA3(RX)--TXD 模块发送脚
GND---GND 地
VCC---VCC 电源(3.3V~5.0V)(3)外接蜂鸣器模块: 高电平响
BEEP----->PB8(4)外接按键:
KEY1 -PB3 按下是低电平  清零
KEY2 -PB2 按下是低电平  翻页
KEY3 -PB6 按下是低电平  加
KEY4 -PB7 按下是低电平  减(5)外接LED灯模块:
LED1-PB4 低电平亮
LED2-PB5 低电平亮(6)称重传感器1
VCC--->5V
SCK--->PA4   时序控制脚--对STM32--输出模式
DT---->PA5   输出输出脚-对STM32--输入模式
GND--->GND(7)称重传感器2
VCC--->5V
SCK--->PA11   时序控制脚--对STM32--输出模式
DT---->PA12   输出输出脚-对STM32--输入模式
GND--->GND(8)称重传感器3
VCC--->5V
SCK--->PA6   时序控制脚--对STM32--输出模式
DT---->PA8   输出输出脚-对STM32--输入模式
GND--->GND(9)GPS模块接线说明
GND----GND
VCC---3.3V
PB11----GPS_TX
PB10----GPS_RX(--)板载LED灯:低电平亮
LED1--PC13
BEEP2--PC14(--)板载按键:
KEY1--PA0  按下为高电平

4.4 MQTT连接代码

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include <string.h>
#include "timer.h"
#include "bluetooth.h"
#include "esp8266.h"
#include "mqtt.h"//华为物联网服务器的设备信息
#define MQTT_ClientID "61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510"
#define MQTT_UserName "61b9ba3a2b2aa20288c1e7f1_QQ1126626497"
#define MQTT_PassWord "385ce91dfe7da5b7431868d5d87e7998163c493344040935d5a00024d6324242"//订阅与发布的主题
#define SET_TOPIC  "$oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510/sys/messages/down"  //订阅
#define POST_TOPIC "$oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510/sys/properties/report"  //发布char mqtt_message[200];//上报数据缓存区int main()
{u32 time_cnt=0;u32 i;u8 key;LED_Init();BEEP_Init();KEY_Init();USART1_Init(115200);TIMER1_Init(72,20000); //超时时间20msUSART2_Init(9600);//串口-蓝牙TIMER2_Init(72,20000); //超时时间20msUSART3_Init(115200);//串口-WIFITIMER3_Init(72,20000); //超时时间20msUSART1_Printf("正在初始化WIFI请稍等.\n");if(ESP8266_Init()){USART1_Printf("ESP8266硬件检测错误.\n");  }else{//非加密端口USART1_Printf("WIFI:%d\n",ESP8266_STA_TCP_Client_Mode("CMCC-Cqvn","99pu58cb","121.36.42.100",1883,1));}//2. MQTT协议初始化 MQTT_Init(); //3. 连接华为服务器        while(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord)){USART1_Printf("服务器连接失败,正在重试...\n");delay_ms(500);}USART1_Printf("服务器连接成功.\n");//3. 订阅主题if(MQTT_SubscribeTopic(SET_TOPIC,0,1)){USART1_Printf("主题订阅失败.\n");}else{USART1_Printf("主题订阅成功.\n");}        .........

4.5 ESP8266代码

#include "esp8266.h"
u8 ESP8266_IP_ADDR[16]; //255.255.255.255
u8 ESP8266_MAC_ADDR[18]; //硬件地址
/*
函数功能: ESP8266命令发送函数
函数返回值:0表示成功  1表示失败
*/
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;
}/*
函数功能: ESP8266硬件初始化检测函数
函数返回值:0表示成功  1表示失败
*/
u8 ESP8266_Init(void)
{//退出透传模式USARTx_StringSend(USART3,"+++");delay_ms(50);return ESP8266_SendCmd("AT\r\n");
}/*
函数功能: 一键配置WIFI为AP+TCP服务器模式
函数参数:
char *ssid  创建的热点名称
char *pass  创建的热点密码 (最少8位)
u16 port    创建的服务器端口号
函数返回值: 0表示成功 其他值表示对应错误值
*/
u8 ESP8266_AP_TCP_Server_Mode(char *ssid,char *pass,u16 port)
{char *p;u8 i;char ESP8266_SendCMD[100]; //组合发送过程中的命令/*1. 测试硬件*/if(ESP8266_SendCmd("AT\r\n"))return 1;/*2. 关闭回显*/if(ESP8266_SendCmd("ATE0\r\n"))return 2;/*3. 设置WIFI模式*/if(ESP8266_SendCmd("AT+CWMODE=2\r\n"))return 3;/*4. 复位*/ESP8266_SendCmd("AT+RST\r\n");delay_ms(1000);delay_ms(1000);delay_ms(1000);/*5. 关闭回显*/if(ESP8266_SendCmd("ATE0\r\n"))return 5;/*6. 设置WIFI的AP模式参数*/sprintf(ESP8266_SendCMD,"AT+CWSAP=\"%s\",\"%s\",1,4\r\n",ssid,pass);if(ESP8266_SendCmd(ESP8266_SendCMD))return 6;/*7. 开启多连接*/if(ESP8266_SendCmd("AT+CIPMUX=1\r\n"))return 7;/*8. 设置服务器端口号*/sprintf(ESP8266_SendCMD,"AT+CIPSERVER=1,%d\r\n",port);if(ESP8266_SendCmd(ESP8266_SendCMD))return 8;/*9. 查询本地IP地址*/if(ESP8266_SendCmd("AT+CIFSR\r\n"))return 9;//提取IP地址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';}//提取MAC地址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;
}/*
函数功能: TCP服务器模式下的发送函数
发送指令:
*/
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;
}/*
函数功能: 配置WIFI为STA模式+TCP客户端模式
函数参数:
char *ssid  创建的热点名称
char *pass  创建的热点密码 (最少8位)
char *p     将要连接的服务器IP地址
u16 port    将要连接的服务器端口号
u8 flag     1表示开启透传模式 0表示关闭透传模式
函数返回值:0表示成功  其他值表示对应的错误
*/
u8 ESP8266_STA_TCP_Client_Mode(char *ssid,char *pass,char *ip,u16 port,u8 flag)
{char ESP8266_SendCMD[100]; //组合发送过程中的命令//退出透传模式//USARTx_StringSend(USART3,"+++");//delay_ms(50);/*1. 测试硬件*/if(ESP8266_SendCmd("AT\r\n"))return 1;/*2. 关闭回显*/if(ESP8266_SendCmd("ATE0\r\n"))return 2;/*3. 设置WIFI模式*/if(ESP8266_SendCmd("AT+CWMODE=1\r\n"))return 3;/*4. 复位*/ESP8266_SendCmd("AT+RST\r\n");delay_ms(1000);delay_ms(1000);delay_ms(1000);/*5. 关闭回显*/if(ESP8266_SendCmd("ATE0\r\n"))return 5;/*6. 配置将要连接的WIFI热点信息*/sprintf(ESP8266_SendCMD,"AT+CWJAP=\"%s\",\"%s\"\r\n",ssid,pass);if(ESP8266_SendCmd(ESP8266_SendCMD))return 6;/*7. 设置单连接*/if(ESP8266_SendCmd("AT+CIPMUX=0\r\n"))return 7;/*8. 配置要连接的TCP服务器信息*/sprintf(ESP8266_SendCMD,"AT+CIPSTART=\"TCP\",\"%s\",%d\r\n",ip,port);if(ESP8266_SendCmd(ESP8266_SendCMD))return 8;/*9. 开启透传模式*/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;
}
/*
函数功能: TCP客户端模式下的发送函数
发送指令:
*/
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;
}

点击关注,第一时间了解华为云新鲜技术~​

基于STM32+华为云IOT设计智能称重系统相关推荐

  1. 基于华为云 IOT 设计智能称重系统 (STM32)【一】

    1.前言 伴随着网络技术,各种通讯技术,传感器技术的飞速发展,物联网技术成为了当今技术领域发展为迅速的技术.而物联网技术的核心仍然是以互联网技术为基础的,物联网是新一代信息技术的重要组成部分,也是信息 ...

  2. 基于华为云 IOT 设计智能称重系统 (STM32)【二】结尾有资料

    3.5 主题订阅与发布 通过 MQTT 客户端软件模拟上报测试: 查看控制台页面,数据已经上传成功了. 3.6 应用侧开发 为了更方便的展示设备数据,与设备完成交互,还需要开发一个配套的上位机,官方提 ...

  3. 基于STM32+华为云IOT设计的酒驾监控系统

    1. 前言 随着人们生活水平的提高,为了减少和杜绝车的现象越来越多,所引发的交通事故也引起了人们的重视,为了减少和杜绝酒后驾车导致事故发生,当前设计了一种安装在驾驶室内,能根据具体功能进行鉴别酒精浓度 ...

  4. 基于STM32+华为云IOT设计的智能浇花系统

    一.前言 随着社会的不断发展和人们生活水平的逐渐提高,人们逐渐追求高质量的生活,很多人都会选择在家里或办公室种植一些花卉以净化家庭空气,陶冶情操,但是很多人忙于工作.学习.出差.旅游或者一些其他的原因 ...

  5. 手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖

    摘要:本文介绍基于STM32微控制器.BC26 NBIOT模组和华为云IOT平台,实现了一款智能井盖系统. 本文分享自华为云社区<基于STM32+NBIOT+华为云IOT设计的智能井盖>, ...

  6. 基于STM32设计智能称重系统(华为云IOT)

    伴随着网络技术,各种通讯技术,传感器技术的飞速发展,物联网技术成为了当今技术领域发展为迅速的技术.而物联网技术的核心仍然是以互联网技术为基础的,物联网是新一代信息技术的重要组成部分,也是信息化时代的重 ...

  7. STM32+华为云IOT制作酒驾监控系统:上车就监控

    本文分享自华为云社区<基于STM32+华为云IOT设计的酒驾监控系统[玩转华为云]>,作者:  DS小龙哥. 1. 前言 随着人们生活水平的提高,为了减少和杜绝车的现象越来越多,所引发的交 ...

  8. 基于EasyDarwin流媒体云平台的智能视频监控系统框架

    基于EasyDarwin流媒体云平台的智能视频监控系统框架 EasyDarwin云平台作为国内较有影响力的开源流媒体平台,集流媒体分发,录像,信令交互为一体,目前已经被广泛应用到监控互联网各个领域:从 ...

  9. 铨顺宏RFID:车辆运输管理途中怎么监控?RFID智能称重系统有用吗

    一.项目概述 在国内一些大型公共企业事业单位,如电厂.煤场.垃圾场等,每天都会有大量的物资运输车辆进出,在业务处理过程中需要停车.登记.称重等程序.目前,这些单位主要依靠操作人员将数据手动输入计算机. ...

  10. 远距离识别超高频RFID读卡器在无人值守车辆称重系统|地磅智能称重系统硬件解决方案中的应用

    随着RFID技术的普及与低成本化的推进,各行各业能尽量减少人工干预的项目,更可能的实现RFID自动识别,数据自动交回,比如我们生活中,不起眼的车辆称重行业,也逐渐实现无人值守,自动识别运作.以往通常运 ...

最新文章

  1. leetcode 782. Transform to Chessboard | 782. 变为棋盘(Java)
  2. (二)面试前的准备【要知己知彼,不打无准备之仗】
  3. 给定有权无向图的邻接矩阵如下,求其最小生成树的总权重,代码。
  4. 输入一个十进制数,转化为二进制
  5. leetcode 删除链表中的节点
  6. Firefox Javascript引擎变成单线程
  7. SQLPrompt 安装后sql上看不到菜单
  8. puml绘制思维导图_免费在线思维导图神器 简单又漂亮 比Wodrd好用很多
  9. 史上最全的微信小程序代码大全
  10. python中日期转换,python中常用到的时间日期格式转换!
  11. 转置矩阵(Transpose of a matrix)
  12. python手机价格预测论文_基于Python的微博发表意向预测研究
  13. ζ(2)的夹逼代数证明
  14. 京东供应商协同平台 客户评价数据导出python
  15. Nagios XI网络监控软件安装
  16. 搭建FTP服务器后访问时出现“FTP文件夹错误 无法与服务器建立连接”的解决办法
  17. 计算机毕业设计Javaweb实验室课表管理系统(源码+系统+mysql数据库+lw文档)
  18. 计算机制图作品答辩,教师资格证考试小学信息技术《认识画图》答辩
  19. Fama-French五因子模型
  20. 计算机桌面怎么能添加文字,怎么在电脑桌面上添加文字

热门文章

  1. 改进YOLOv7系列:21.添加ShuffleAttention注意力机制
  2. Java客户积分回馈怎么做,商家使用会员积分系统做好新老客户维护工作?
  3. 英语四级计算机二级成绩,计算机二级成绩查询
  4. Matplotlib之直方图绘制
  5. NEUQOJ 1999: 三角形or四边形?【搜索联通块/模拟】
  6. “数字人体”宫颈癌风险智能诊断大会小结
  7. (9)数据分析-相关性分析
  8. python转义字符\r的使用
  9. linux删除用户账户_如何在Linux中删除删除用户帐户?
  10. Docker从基础到企业生产应用学习笔记大总结