当前位置:网站首页>基于华为云IOT设计智能称重系统(STM32)
基于华为云IOT设计智能称重系统(STM32)
2022-07-07 09:09:00 【InfoQ】
1.前言




2. 硬件选型
2.1 STM32F103C8T6

2.2 电子秤传感器

2.3 ESP8266-wifi

2.4 GPS模块

2.5 蜂鸣器

3. 创建云端产品与设备
3.1 创建产品




3.2 创建设备


3.3 自定义模型数据





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




DeviceId 6277d70223aaf461a0f72a56_weigh
DeviceSecret 12345678
ClientId 6277d70223aaf461a0f72a56_weigh_0_0_2022050814
Username 6277d70223aaf461a0f72a56_weigh
Password 0a3d097c6449b8526a562006a74c8c5e61ce63d6c831ea291560736a3332cf77
161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com121.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"}}]}


3.6 应用侧开发




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); //超时时间20ms
USART2_Init(9600);//串口-蓝牙
TIMER2_Init(72,20000); //超时时间20ms
USART3_Init(115200);//串口-WIFI
TIMER3_Init(72,20000); //超时时间20ms
USART1_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;
}
边栏推荐
- Galaxy Kirin desktop operating system installation postgresql13 (source code installation)
- 在线硬核工具
- 解决VSCode只能开两个标签页的问题
- Bookmarking - common website navigation for programmers
- 数据库同步工具 DBSync 新增对MongoDB、ES的支持
- Vscode 尝试在目标目录创建文件时发生一个错误:拒绝访问【已解决】
- Kitex 重试机制
- Project ERROR: Unknown module(s) in QT: core gui
- shardingsphere分库分表示例(逻辑表,真实表,绑定表,广播表,单表)
- 软件设计之——“高内聚低耦合”
猜你喜欢

Seata 1.3.0 four modes to solve distributed transactions (at, TCC, Saga, XA)

Transaction rolled back because it has been marked as rollback-only解决

【pyqt】tableWidget里的cellWidget使用信号与槽机制
![[OneNote] can't connect to the network and can't sync the problem](/img/28/9a02b1da0f43889989a9539c9fb6b6.png)
[OneNote] can't connect to the network and can't sync the problem

Transaction rolled back because it has been marked as rollback only

“梦想杯”2017 年江苏省信息与未来小学生夏令营 IT 小能手 PK 之程序设计试题

Unity script generates configurable files and loads

Ping tool ICMP message learning

Wallhaven wallpaper desktop version

How to use cherry pick?
随机推荐
Hash / (understanding, implementation and application)
2021-04-08
Introduction to shell programming
[untitled]
使用引用
vim 的各种用法,很实用哦,都是本人是在工作中学习和总结的
Online hard core tools
“梦想杯”2017 年江苏省信息与未来小学生夏令营 IT 小能手 PK 之程序设计试题
[installation system] U disk installation system tutorial, using UltraISO to make U disk startup disk
Ping tool ICMP message learning
Antd select selector drop-down box follows the scroll bar to scroll through the solution
Transaction rolled back because it has been marked as rollback only
[pro test feasible] error while loading shared libraries solution
When initializing 'float', what is the difference between converting to 'float' and adding 'f' as a suffix?
【STM32】实战3.1—用STM32与TB6600驱动器驱动42步进电机(一)
After the uniapp jumps to the page in onlaunch, click the event failure solution
The use of list and Its Simulation Implementation
Deep understanding of Apache Hudi asynchronous indexing mechanism
RationalDMIS2022 高级编程宏程序
【安装系统】U盘安装系统教程,使用UltraISO制作U盘启动盘