当前位置:网站首页>基于STM32+华为云IOT设计的智能路灯
基于STM32+华为云IOT设计的智能路灯
2022-07-06 09:39:00 【InfoQ】
1. 前言
2. 具体实现的功能以及相关的硬件
3. 硬件选型
3.1 STM32F103C8T6
3.2 太阳能板
3.3 锂电池充电模块
3.4 功率检测模块
3.5 BH1750光敏传感器
3.6 LED灯
3.7 BC20-NBIOT模块
型号: BC20+BD+GPS
品牌: 创思
产地: 中国大陆
接口类型: TTL
适用场景: NBIOT
尺寸: 40x40x12mm
工作电流: 0.5A
支持TCP/IP协议:
支持传输速率: 115200Kbps
工作电压: 5V
是否支持语音电话: 否
模块类型: 其他
是否支持短信: 否
支持制式标准: GSM/GPRS(2G)
是否支持电话簿: 否
4. 创建产品与设备
4.1 创建产品
4.2 自定义模型
4.3 创建设备
{
"device_id": "6276134223aaf461a0f6e515_1126626497",
"secret": "12345678"
}
4.4 MQTT密匙生成
DeviceId 6276134223aaf461a0f6e515_1126626497
DeviceSecret 12345678
ClientId 6276134223aaf461a0f6e515_1126626497_0_0_2022050706
Username 6276134223aaf461a0f6e515_1126626497
Password 73ebe0779dbd5b2e2fd3db8ab8f642b78d7a532576f2e14d2799d4f78d37bcc8
161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
121.36.42.100
4.5 主题订阅与发布
//订阅主题: 平台下发消息给设备
$oc/devices/6276134223aaf461a0f6e515_1126626497/sys/messages/down
//设备上报数据
$oc/devices/6276134223aaf461a0f6e515_1126626497/sys/properties/report
//上报的属性消息 (一次可以上报多个属性,在json里增加就行了)
{"services": [{"service_id": "led","properties":{"GPS":"lat:12.345,lng:45.678"}}]}
4.6 应用侧开发
5. STM32程序设计
5.1 BC20连接华为云物联网服务器-调试
连接MQTT服务器
AT+QMTOPEN=0,"a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com",1883
OK
+QMTOPEN: 0,0
登录MQTT服务器
命令格式: AT+QMTCONN=<tcpconnectID>,<clientID>,<username>,<password>
AT+QMTCONN=0,"6210e8acde9933029be8facf_dev1_0_0_2022021913","6210e8acde9933029be8facf_dev1","6cea55404b463e666cd7a6060daba745bbaa17fe7078dfef45f8151cdf19673d"
OK
+QMTCONN: 0,0,0
订阅主题
命令格式: AT+QMTSUB=<tcpconnectID>,<msgID>,"<topic1>”,<qos1>[,"<topic2>”,<qos2>…]
AT+QMTSUB=0,1,"$oc/devices/6210e8acde9933029be8facf_dev1/sys/messages/down",2
OK
+QMTSUB: 0,1,0,2
发布主题
命令格式:AT+QMTPUB=<tcpconnectID>,<msgID>,<qos>,<retain>,"<topic>","<msg>"
先发送指令:
AT+QMTPUB=0,0,0,0,"$oc/devices/6210e8acde9933029be8facf_dev1/sys/properties/repor"
等待返回 ">"
接着发送数据.不需要加回车。
"{"services": [{"service_id": "gps","properties":{"longitude":12.345,"latitude":33.345}}]}"
数据发送完毕,再发送结束符。 十六进制的值--0x1a 。某些串口调试助手可以适应ctrl+z 快捷键输入0xA
等待模块返回"OK",到此数据发送完成。
OK
+QMTPUB: 0,0,0
5.2 测试模块
AT
OK
查询模块是否正常
AT
OK
获取卡号,查询卡是否插好
AT+CIMI
460041052911195
OK
激活网络
AT+CGATT=1
OK
获取网络激活状态
AT+CGATT?
+CGATT: 1
OK
查询网络质量
AT+CSQ
+CSQ: 26,0
OK
AT+CEREG=? //检查网络状态
+CEREG: 0,1 //找网成功
OK
5.3 keil工程代码
5.4 功率检测
#include "INA226.h"
#include "delay.h"
// 接线说明:
// 模拟IIC:
//IIC_SCL -- 时钟线PB6(推挽、开漏输出)
//IIC_SDA -- 双向数据线PB7
INA226 ina226_data;
//初始化INA226
void INA226_Init(void)
{
IIC_Init();
INA226_SendData(INA226_ADDR1,CFG_REG,0x8000); //重新启动
INA226_SendData(INA226_ADDR1,CFG_REG,0x484f); //设置转换时间204us,求平均值次数128,采样时间为204*128,设置模式为分流和总线连续模式
INA226_SendData(INA226_ADDR1,CAL_REG,CAL); //设置分辨率
//INA226_SendData(INA226_ADDR1,CAL_REG,0x0012);//设置分流电压转电流转换参数
INA226_Get_ID(INA226_ADDR1); //获取ina226的id
}
//设置寄存器指针
void INA226_SetRegPointer(u8 addr,u8 reg)
{
IIC_Start();
IIC_Send_Byte(addr);
IIC_Wait_Ack();
IIC_Send_Byte(reg);
IIC_Wait_Ack();
IIC_Stop();
}
//发送,写入数据
void INA226_SendData(u8 addr,u8 reg,u16 data)
{
u8 temp=0;
IIC_Start();
IIC_Send_Byte(addr);
IIC_Wait_Ack();
IIC_Send_Byte(reg);
IIC_Wait_Ack();
temp = (u8)(data>>8);
IIC_Send_Byte(temp);
IIC_Wait_Ack();
temp = (u8)(data&0x00FF);
IIC_Send_Byte(temp);
IIC_Wait_Ack();
IIC_Stop();
}
//读取数据
u16 INA226_ReadData(u8 addr)
{
u16 temp=0;
IIC_Start();
IIC_Send_Byte(addr+1);
IIC_Wait_Ack();
temp = IIC_Read_Byte(1);
temp<<=8;
temp |= IIC_Read_Byte(0);
IIC_Stop();
return temp;
}
//1mA/bit
u16 INA226_GetShunt_Current(u8 addr)
{
u16 temp=0;
INA226_SetRegPointer(addr,CUR_REG);
temp = INA226_ReadData(addr);
if(temp&0x8000) temp = ~(temp - 1);
return temp;
}
//获取id
void INA226_Get_ID(u8 addr)
{
u32 temp=0;
INA226_SetRegPointer(addr,INA226_GET_ADDR);
temp = INA226_ReadData(addr);
ina226_data.ina226_id = temp;
}
//获取校准值
u16 INA226_GET_CAL_REG(u8 addr)
{
u32 temp=0;
INA226_SetRegPointer(addr,CAL_REG);
temp = INA226_ReadData(addr);
return (u16)temp;
}
//1.25mV/bit
u16 INA226_GetVoltage(u8 addr)
{
u32 temp = 0;
INA226_SetRegPointer(addr,BV_REG);
temp = INA226_ReadData(addr);
return (u16)temp;
}
//2.5uV/bit
u16 INA226_GetShuntVoltage(u8 addr)
{
int16_t temp = 0;
INA226_SetRegPointer(addr,SV_REG);
temp = INA226_ReadData(addr);
if(temp&0x8000) temp = ~(temp - 1);
return (u16)temp;
}
//获取电压
void GetVoltage(float *Voltage)//mV
{
*Voltage = INA226_GetVoltage(INA226_ADDR1)*Voltage_LSB;
}
//获取分流电压
void Get_Shunt_voltage(float *Voltage)//uV
{
*Voltage = (INA226_GetShuntVoltage(INA226_ADDR1)*INA226_VAL_LSB);//如需矫正电流分流参数请将这里改为2.5
}
//获取电流
void Get_Shunt_Current(float *Current)//mA
{
*Current = (INA226_GetShunt_Current(INA226_ADDR1)* CURRENT_LSB);
}
//获取功率= 总线电压 * 电流
void get_power()//W
{
GetVoltage(&ina226_data.voltageVal); //mV
Get_Shunt_voltage(&ina226_data.Shunt_voltage); //uV
Get_Shunt_Current(&ina226_data.Shunt_Current); //mA
Get_Power(&ina226_data.Power);
ina226_data.Power_Val = ina226_data.voltageVal*0.001f * ina226_data.Shunt_Current*0.001f; //mV*mA
}
//获取功率装载值,ina226内部计算的的功率,由于未经校准,故不采用
u16 INA226_Get_Power(u8 addr)
{
int16_t temp=0;
INA226_SetRegPointer(addr,PWR_REG);
temp = INA226_ReadData(addr);
return (u16)temp;
}
//获取功率,ina226内部计算,不准确,不采用
void Get_Power(float *Power)//W
{
*Power = (INA226_Get_Power(INA226_ADDR1)*POWER_LSB);
}
//不设置报警,舍弃
/*
u8 INA226_AlertAddr()
{
u8 temp;
IIC_Start();
IIC_Send_Byte(INA226_GETALADDR);
IIC_Wait_Ack();
temp = IIC_Read_Byte(1);
IIC_Stop();
return temp;
}
*/
5.5 BH1750环境光强度
#include "bh1750.h"
float Read_BH1750_Data()
{
unsigned char t0;
unsigned char t1;
float t;
u8 r_s=0;
IIC_Start(); //发送起始信号
IIC_WriteOneByteData(0x46);
r_s=IIC_GetACK();//获取应答
if(r_s)printf("error:1\r\n");
IIC_WriteOneByteData(0x01);
r_s=IIC_GetACK();//获取应答
if(r_s)printf("error:2\r\n");
IIC_Stop(); //停止信号
IIC_Start(); //发送起始信号
IIC_WriteOneByteData(0x46);
r_s=IIC_GetACK();//获取应答
if(r_s)printf("error:3\r\n");
IIC_WriteOneByteData(0x01);
r_s=IIC_GetACK();//获取应答
if(r_s)printf("error:4\r\n");
IIC_Stop(); //停止信号
IIC_Start(); //发送起始信号
IIC_WriteOneByteData(0x46);
r_s=IIC_GetACK();//获取应答
if(r_s)printf("error:5\r\n");
IIC_WriteOneByteData(0x10);
r_s=IIC_GetACK();//获取应答
if(r_s)printf("error:6\r\n");
IIC_Stop(); //停止信号
DelayMs(100); //等待
IIC_Start(); //发送起始信号
IIC_WriteOneByteData(0x47);
r_s=IIC_GetACK();//获取应答
if(r_s)printf("error:7\r\n");
t0=IIC_ReadOneByteData(); //接收数据
IIC_SendACK(0); //发送应答信号
t1=IIC_ReadOneByteData(); //接收数据
IIC_SendACK(1); //发送非应答信号
IIC_Stop(); //停止信号
t=(((t0<<8)|t1)/1.2);
return t;
}
边栏推荐
- Flink parsing (IV): recovery mechanism
- Chrome prompts the solution of "your company management" (the startup page is bound to the company's official website and cannot be modified)
- EasyCVR接入设备开启音频后,视频无法正常播放是什么原因?
- 07 personal R & D products and promotion - human resources information management system
- Flink analysis (II): analysis of backpressure mechanism
- List set data removal (list.sublist.clear)
- The NTFS format converter (convert.exe) is missing from the current system
- Start job: operation returned an invalid status code 'badrequst' or 'forbidden‘
- 学 SQL 必须了解的 10 个高级概念
- Example of batch update statement combining update and inner join in SQL Server
猜你喜欢
Unity小技巧 - 绘制瞄准准心
Grafana 9 is officially released, which is easier to use and more cool!
关于Selenium启动Chrome浏览器闪退问题
Wordcloud colormap color set and custom colors
The NTFS format converter (convert.exe) is missing from the current system
[reverse intermediate] eager to try
2022年大厂Android面试题汇总(二)(含答案)
Huawei certified cloud computing hica
03个人研发的产品及推广-计划服务配置器V3.0
Automatic operation and maintenance sharp weapon ansible Foundation
随机推荐
【ASM】字节码操作 ClassWriter 类介绍与使用
Interpretation of Flink source code (I): Interpretation of streamgraph source code
Hongmeng introduction and development environment construction
C# NanoFramework 点灯和按键 之 ESP32
应用服务配置器(定时,数据库备份,文件备份,异地备份)
Akamai anti confusion
虚拟机启动提示Probing EDD (edd=off to disable)错误
网络分层概念及基本知识
PyTorch 提取中间层特征?
Development and practice of lightweight planning service tools
BearPi-HM_ Nano development board "flower protector" case
Remote code execution penetration test - B module test
Solrcloud related commands
07 personal R & D products and promotion - human resources information management system
pip install pyodbc : ERROR: Command errored out with exit status 1
Interpretation of Flink source code (II): Interpretation of jobgraph source code
yarn : 无法加载文件 D:\ProgramFiles\nodejs\yarn.ps1,因为在此系统上禁止运行脚本
Binary search strategy
Pyspark operator processing spatial data full parsing (4): let's talk about spatial operations first
基于Infragistics.Document.Excel导出表格的类