1. 前言
	隨著工業(yè)和城市的快速發(fā)展,道路照明系統(tǒng)的產(chǎn)業(yè)也在迅速發(fā)展,并趨于復(fù)雜化,為了更經(jīng)濟(jì)地控制和維護(hù)復(fù)雜的路燈系統(tǒng),市面上各大科技公司開發(fā)了各種路燈控制系統(tǒng),并且路燈都連上物聯(lián)網(wǎng)云端,連上了政府網(wǎng)絡(luò),可以遠(yuǎn)程了解路燈的工作情況,運(yùn)行情況。
	為了方便了解物聯(lián)網(wǎng)平臺(tái),學(xué)習(xí)物聯(lián)網(wǎng)開發(fā),了解智慧路燈的開發(fā),本文就采用華為云IOT物聯(lián)網(wǎng)平臺(tái),選擇STM32作為主控芯片,再配合相關(guān)的傳感器完成智慧路燈開發(fā)。
2. 具體實(shí)現(xiàn)的功能以及相關(guān)的硬件
當(dāng)前設(shè)計(jì)的智慧路燈采用NBIOT模塊-BC20連接華為云物聯(lián)網(wǎng)服務(wù)器,上傳路燈的各種參數(shù)信息:環(huán)境光強(qiáng)度、太陽(yáng)能充電板電壓、鋰電池電量等信息。設(shè)計(jì)了一款手機(jī)APP,可以通過(guò)華為云物聯(lián)網(wǎng)平臺(tái)的應(yīng)用側(cè)提供的開發(fā)接口,獲取路燈上傳的參數(shù)信息,并且可以在手機(jī)APP上遠(yuǎn)程手動(dòng)控制路燈開關(guān),設(shè)置路燈的開啟和關(guān)閉時(shí)間等。 智慧路燈的的主控芯片采用STM32F103C8T6、NBIOT聯(lián)網(wǎng)模塊采用BC20,BC20內(nèi)置了MQTT協(xié)議,可以通過(guò)AT指令連接物聯(lián)網(wǎng)平臺(tái)實(shí)現(xiàn)通信。智慧路燈采用鋰電池供電,并且配有太陽(yáng)能充電板,可以使用太陽(yáng)進(jìn)行充電補(bǔ)償電量。使用了功率監(jiān)控器,電池電量檢測(cè)芯片,可以檢測(cè)充電效率、電流、電壓、電池電量等信息。BC20帶了GPS功能,可以上報(bào)路燈的GPS位置到云端服務(wù)器,手機(jī)APP獲取之后,可以調(diào)用百度地圖顯示出路燈的位置。

	
	

	
	

3. 硬件選型
3.1 STM32F103C8T6

	
	

3.2 太陽(yáng)能板

3.3 鋰電池充電模塊

3.4 功率檢測(cè)模塊

3.5 BH1750光敏傳感器

3.6 LED燈

3.7 BC20-NBIOT模塊
型號(hào): BC20+BD+GPS
品牌: 創(chuàng)思
產(chǎn)地: 中國(guó)大陸
接口類型: TTL
適用場(chǎng)景: NBIOT
尺寸: 40x40x12mm
工作電流: 0.5A
支持TCP/IP協(xié)議: 
支持傳輸速率: 115200Kbps
工作電壓: 5V
是否支持語(yǔ)音電話: 否
模塊類型: 其他
是否支持短信: 否
支持制式標(biāo)準(zhǔn): GSM/GPRS(2G)
是否支持電話簿: 否

4. 創(chuàng)建產(chǎn)品與設(shè)備
4.1 創(chuàng)建產(chǎn)品
	地址:https://www.huaweicloud.com/?locale=zh-cn
	

	
	

	
	

	
	

4.2 自定義模型
地址: https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-dev/all-product/7211833377cf435c8c0580de390eedbe/product-detail/6276134223aaf461a0f6e515

	
	

	
	

	
	

	
	

	
	

	
	

	
	

	
	

4.3 創(chuàng)建設(shè)備

	
	

{
    "device_id": "6276134223aaf461a0f6e515_1126626497",
    "secret": "12345678"
}
4.4 MQTT密匙生成
	創(chuàng)建完產(chǎn)品、設(shè)備之后,接下來(lái)就需要知道如何通過(guò)MQTT協(xié)議登陸華為云服務(wù)器。
	官方的詳細(xì)介紹在這里:
	https://support.huaweicloud.com/devg-iothub/iot_01_2127.html#ZH-CN_TOPIC_0240834853__zh-cn_topic_0251997880_li365284516112
	屬性上報(bào)格式:
	https://support.huaweicloud.com/api-iothub/iot_06_v5_3010.html
	


	MQTT設(shè)備登陸密匙生成地址: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
	

	
	

DeviceId      	6276134223aaf461a0f6e515_1126626497
DeviceSecret 	12345678
ClientId  		6276134223aaf461a0f6e515_1126626497_0_0_2022050706
Username  		6276134223aaf461a0f6e515_1126626497
Password  		73ebe0779dbd5b2e2fd3db8ab8f642b78d7a532576f2e14d2799d4f78d37bcc8
	華為云物聯(lián)網(wǎng)平臺(tái)的域名是: 161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
	華為云物聯(lián)網(wǎng)平臺(tái)的IP地址是:121.36.42.100
	在軟件里參數(shù)填充正確之后,就看到設(shè)備已經(jīng)連接成功了。
	接下來(lái)打開設(shè)備頁(yè)面,可以看到設(shè)備已經(jīng)在線了。
	

	
	

4.5 主題訂閱與發(fā)布
//訂閱主題: 平臺(tái)下發(fā)消息給設(shè)備
$oc/devices/6276134223aaf461a0f6e515_1126626497/sys/messages/down
//設(shè)備上報(bào)數(shù)據(jù)
$oc/devices/6276134223aaf461a0f6e515_1126626497/sys/properties/report
//上報(bào)的屬性消息 (一次可以上報(bào)多個(gè)屬性,在json里增加就行了)
{"services": [{"service_id": "led","properties":{"GPS":"lat:12.345,lng:45.678"}}]}
	通過(guò)MQTT客戶端軟件模擬上報(bào)測(cè)試:
	

	
	

4.6 應(yīng)用側(cè)開發(fā)
為了更方便的展示設(shè)備數(shù)據(jù),與設(shè)備完成交互,還需要開發(fā)一個(gè)配套的上位機(jī),官方提供了應(yīng)用側(cè)開發(fā)的API接口、SDK接口,為了方便通用一點(diǎn),我這里采用了API接口完成數(shù)據(jù)交互,上位機(jī)軟件采用QT開發(fā)。
幫助文檔地址: ttps://support.huaweicloud.com/api-iothub/iot_06_v5_0034.html
設(shè)備屬性就是設(shè)備上傳的傳感器狀態(tài)數(shù)據(jù)信息,應(yīng)用側(cè)提供了API接口,可以主動(dòng)向設(shè)備端下發(fā)請(qǐng)求指令;設(shè)備端收到指令之后需要按照約定的數(shù)據(jù)格式上報(bào)數(shù)據(jù);所以,要實(shí)現(xiàn)應(yīng)用層與設(shè)備端的數(shù)據(jù)交互,需要應(yīng)用層與設(shè)備端配合才能完成。

	
	

5. STM32程序設(shè)計(jì)
	STM32連接華為云IOT的工程案例: https://download.csdn.net/download/xiaolong1126626497/81993720
	

5.1 BC20連接華為云物聯(lián)網(wǎng)服務(wù)器-調(diào)試

連接MQTT服務(wù)器
AT+QMTOPEN=0,"a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com",1883
OK
+QMTOPEN: 0,0
登錄MQTT服務(wù)器
命令格式: AT+QMTCONN=,,,
AT+QMTCONN=0,"6210e8acde9933029be8facf_dev1_0_0_2022021913","6210e8acde9933029be8facf_dev1","6cea55404b463e666cd7a6060daba745bbaa17fe7078dfef45f8151cdf19673d"
OK
+QMTCONN: 0,0,0
訂閱主題
命令格式: AT+QMTSUB=,,"”,[,"”,…]
AT+QMTSUB=0,1,"$oc/devices/6210e8acde9933029be8facf_dev1/sys/messages/down",2
OK
+QMTSUB: 0,1,0,2
發(fā)布主題
命令格式:AT+QMTPUB=,,,,"",""
先發(fā)送指令: 
AT+QMTPUB=0,0,0,0,"$oc/devices/6210e8acde9933029be8facf_dev1/sys/properties/repor"
等待返回 ">" 
接著發(fā)送數(shù)據(jù).不需要加回車。
"{"services": [{"service_id": "gps","properties":{"longitude":12.345,"latitude":33.345}}]}"
數(shù)據(jù)發(fā)送完畢,再發(fā)送結(jié)束符。 十六進(jìn)制的值--0x1a  。某些串口調(diào)試助手可以適應(yīng)ctrl+z 快捷鍵輸入0xA
等待模塊返回"OK",到此數(shù)據(jù)發(fā)送完成。    
OK
+QMTPUB: 0,0,0
5.2 測(cè)試模塊
	第一步接上之后,串口調(diào)試助手選擇波特率為115200,勾選軟件上的發(fā)送新行選項(xiàng)。發(fā)送AT過(guò)去,正常模塊會(huì)返回OK。
查詢模塊是否正常
AT
OK
獲取卡號(hào),查詢卡是否插好
AT+CIMI
460041052911195
OK
激活網(wǎng)絡(luò)
AT+CGATT=1
OK
獲取網(wǎng)絡(luò)激活狀態(tài)
AT+CGATT?
+CGATT: 1
OK
查詢網(wǎng)絡(luò)質(zhì)量
AT+CSQ
+CSQ: 26,0
OK
    
AT+CEREG=? //檢查網(wǎng)絡(luò)狀態(tài)
+CEREG: 0,1 //找網(wǎng)成功
OK
5.3 keil工程代碼

	
	

	
	

5.4 功率檢測(cè)
#include "INA226.h"
#include "delay.h"
//	接線說(shuō)明:
//	模擬IIC:
//IIC_SCL -- 時(shí)鐘線PB6(推挽、開漏輸出)
//IIC_SDA -- 雙向數(shù)據(jù)線PB7
INA226 ina226_data;
//初始化INA226
void INA226_Init(void)
{	
	IIC_Init();
	INA226_SendData(INA226_ADDR1,CFG_REG,0x8000);	//重新啟動(dòng)
	
	INA226_SendData(INA226_ADDR1,CFG_REG,0x484f);	//設(shè)置轉(zhuǎn)換時(shí)間204us,求平均值次數(shù)128,采樣時(shí)間為204*128,設(shè)置模式為分流和總線連續(xù)模式
	INA226_SendData(INA226_ADDR1,CAL_REG,CAL);	//設(shè)置分辨率
	//INA226_SendData(INA226_ADDR1,CAL_REG,0x0012);//設(shè)置分流電壓轉(zhuǎn)電流轉(zhuǎn)換參數(shù)	
	INA226_Get_ID(INA226_ADDR1);					//獲取ina226的id
}
//設(shè)置寄存器指針
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();
}
//發(fā)送,寫入數(shù)據(jù)
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();
}
//讀取數(shù)據(jù)
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;
}
//獲取校準(zhǔn)值
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);//如需矯正電流分流參數(shù)請(qǐng)將這里改為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內(nèi)部計(jì)算的的功率,由于未經(jīng)校準(zhǔn),故不采用
u16 INA226_Get_Power(u8 addr)
{
	int16_t temp=0;
	INA226_SetRegPointer(addr,PWR_REG);
	temp = INA226_ReadData(addr);
	return (u16)temp;
}
//獲取功率,ina226內(nèi)部計(jì)算,不準(zhǔn)確,不采用
void Get_Power(float *Power)//W
{
	*Power = (INA226_Get_Power(INA226_ADDR1)*POWER_LSB);
}
//不設(shè)置報(bào)警,舍棄
/*
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環(huán)境光強(qiáng)度
#include "bh1750.h"
float Read_BH1750_Data()
{
    unsigned char t0;
    unsigned char t1;
    float t;
    u8 r_s=0;
    IIC_Start(); //發(fā)送起始信號(hào)
    IIC_WriteOneByteData(0x46);
    r_s=IIC_GetACK();//獲取應(yīng)答
    if(r_s)printf("error:1\r\n");
    IIC_WriteOneByteData(0x01);
    r_s=IIC_GetACK();//獲取應(yīng)答
     if(r_s)printf("error:2\r\n");
    IIC_Stop(); //停止信號(hào) 
    
    IIC_Start(); //發(fā)送起始信號(hào)
    IIC_WriteOneByteData(0x46);
    r_s=IIC_GetACK();//獲取應(yīng)答
    if(r_s)printf("error:3\r\n");
    IIC_WriteOneByteData(0x01);
    r_s=IIC_GetACK();//獲取應(yīng)答
    if(r_s)printf("error:4\r\n");
    IIC_Stop(); //停止信號(hào) 
    
    IIC_Start(); //發(fā)送起始信號(hào)
    IIC_WriteOneByteData(0x46);
    r_s=IIC_GetACK();//獲取應(yīng)答
    if(r_s)printf("error:5\r\n");
    IIC_WriteOneByteData(0x10);
    r_s=IIC_GetACK();//獲取應(yīng)答
    if(r_s)printf("error:6\r\n");
    IIC_Stop(); //停止信號(hào) 
    
    DelayMs(100); //等待
    
    IIC_Start(); //發(fā)送起始信號(hào)
    IIC_WriteOneByteData(0x47);
    r_s=IIC_GetACK();//獲取應(yīng)答
    if(r_s)printf("error:7\r\n");
    
    t0=IIC_ReadOneByteData(); //接收數(shù)據(jù)
    IIC_SendACK(0); //發(fā)送應(yīng)答信號(hào)
    t1=IIC_ReadOneByteData(); //接收數(shù)據(jù)
    IIC_SendACK(1); //發(fā)送非應(yīng)答信號(hào)
    IIC_Stop(); //停止信號(hào)
    
     t=(((t0<<8)|t1)/1.2);
     return t;  
}
審核編輯:湯梓紅
                                        - 
                                物聯(lián)網(wǎng)
                                +關(guān)注關(guān)注 2938文章 46991瀏覽量 403996
- 
                                STM32
                                +關(guān)注關(guān)注 2301文章 11096瀏覽量 370000
- 
                                智慧路燈
                                +關(guān)注關(guān)注 3文章 917瀏覽量 18287
- 
                                華為云
                                +關(guān)注關(guān)注 3文章 2799瀏覽量 19005
發(fā)布評(píng)論請(qǐng)先 登錄
基于STM32+華為云設(shè)計(jì)的智慧煙感系統(tǒng)
 
    
華為與德國(guó)聯(lián)合打造智慧城市
基于NB-IoT的智慧路燈監(jiān)控系統(tǒng)(NB-IoT專欄—實(shí)戰(zhàn)篇2:硬件開發(fā))精選資料分享
設(shè)計(jì)基于STM32+機(jī)智云的手機(jī)APP點(diǎn)燈遇到哪些問(wèn)題
如何實(shí)現(xiàn)基于小熊派的NB-IOT智慧路燈的設(shè)計(jì)?
基于OpenHarmony的智慧路燈實(shí)現(xiàn)
【小凌派RK2206開發(fā)板試用體驗(yàn)】連上華為云體驗(yàn)人體感應(yīng)
基于OpenHarmony的華為云IoT智慧路燈實(shí)現(xiàn)
每日推薦 | 小凌派RK2206開發(fā)板實(shí)現(xiàn)華為云IoT智慧路燈,電源模塊PCB布局方法
基于OpenHarmony的華為云IoT智慧路燈
【小凌派RK2206開發(fā)板試用體驗(yàn)】OpenHarmony華為云IoT應(yīng)用開發(fā)-智慧井蓋
OpenHarmony華為云IoT應(yīng)用開發(fā)-智慧井蓋
基于OpenHarmony的華為云IoT智慧路燈實(shí)現(xiàn)
 
    
基于OpenHarmony的華為云IoT智慧路燈實(shí)現(xiàn)
 
    
IoT畢業(yè)設(shè)計(jì) | STM32+機(jī)智云AIoT云平臺(tái)實(shí)現(xiàn)智能鴿籠控制
 
    
 
           
        
 
         基于STM32+華為云IOT設(shè)計(jì)的智慧路燈
基于STM32+華為云IOT設(shè)計(jì)的智慧路燈 
                 
  
            
             
             
                 
             工商網(wǎng)監(jiān)
工商網(wǎng)監(jiān)
        
評(píng)論