一、智慧路燈簡(jiǎn)介
我們平時(shí)看到的傳統(tǒng)路燈基本是通過定時(shí)開啟、定時(shí)關(guān)閉來控制路燈亮滅,在夏天白晝時(shí)間長(zhǎng),路燈過早開啟,造成能源浪費(fèi);在冬天白晝時(shí)間短,往往經(jīng)常是天已經(jīng)黑了,路燈卻未開啟,給人們的出行帶來了諸多不便;也有的路燈通過專人手動(dòng)開啟關(guān)閉,這種方式雖較定時(shí)方式靈活,但也存在需要人為操作的局限性。隨著社會(huì)的發(fā)展進(jìn)步,智慧路燈應(yīng)運(yùn)而生,智慧路燈通過自身攜帶的光線傳感器,通過傳感器采集的的光線數(shù)據(jù)判斷天黑情況,可以根據(jù)預(yù)置的閾值來實(shí)現(xiàn)路燈開啟關(guān)閉;同時(shí)智慧路燈的光線數(shù)據(jù)也可以同步上傳云端,通過云端可以查詢到智慧路燈的光線數(shù)據(jù)、路燈開啟關(guān)閉狀態(tài),同時(shí)也可以設(shè)置智慧路燈開啟關(guān)閉的閾值,實(shí)現(xiàn)云管理。
本文基于OpenHarmony系統(tǒng),使用小凌派RK2206開發(fā)板搭載智慧路燈模塊,模擬實(shí)現(xiàn)智慧路燈應(yīng)用,智慧路燈模塊本身自帶光線傳感器,通過傳感器采集的光線數(shù)據(jù)判斷天黑情況,根據(jù)預(yù)設(shè)的閾值來實(shí)現(xiàn)路燈的開關(guān);搭載OpenHarmony系統(tǒng)的小凌派RK2206開發(fā)板支持連接華為云服務(wù)器,后續(xù)文章將更新智慧路燈在華為云的應(yīng)用實(shí)現(xiàn)。
智慧路燈模塊硬件電路如圖1所示,電路中包含了E53接口連接器、EEPROM存儲(chǔ)器、光線傳感器BH1750、大功率LED燈驅(qū)動(dòng)電路。本文主要使用光線傳感器BH1750和LED燈驅(qū)動(dòng)電路,其中光線傳感器為數(shù)字接口芯片,使用I2C總線控制;LED燈驅(qū)動(dòng)電路通過PWD_LED口控制LED燈開啟、關(guān)閉,PWD_LED輸出高電平點(diǎn)亮LED燈,PWD_LED輸出低電平熄滅LED燈。模塊硬件電路簡(jiǎn)單,這里就不對(duì)此進(jìn)行多余的說明。
圖1 智慧路燈模塊硬件電路圖
小凌派RK2206開發(fā)板與智慧路燈模塊均帶有防呆設(shè)計(jì),能夠很容易區(qū)分安裝方向,直接將模塊插入到小凌派RK2206開發(fā)板的E53母座接口上即可,安裝如圖2所示。
圖2 硬件連接圖
三、軟件設(shè)計(jì)
1、主程序設(shè)計(jì)
小凌派RK2206開發(fā)板上電后,OpenHarmony系統(tǒng)開始運(yùn)行,LiteOS系統(tǒng)初始化后,創(chuàng)建一個(gè)線程用于實(shí)現(xiàn)智慧路燈主程序。進(jìn)入主程序先初始化智慧路燈模塊,程序進(jìn)入主循環(huán),2秒獲取一次光線傳感器BH1750的光線強(qiáng)度值,當(dāng)光線強(qiáng)度值小于20時(shí),打開LED路燈;當(dāng)光線強(qiáng)度值大于20時(shí),關(guān)閉LED路燈。
void e53_isl_thread()
{
float lum = 0;
e53_isl_init();
while (1)
{
lum = e53_isl_read_data();
printf("luminance value is %.2f ", lum);
if (lum < 20)
{
isl_light_set_status(ON);
printf("light on ");
}
else
{
isl_light_set_status(OFF);
printf("light off ");
}
LOS_Msleep(2000);
}
(左右移動(dòng)查看全部?jī)?nèi)容)
2、智慧路燈初始化程序設(shè)計(jì)
智慧路燈初始化程序主要分為硬件IO初始化和BH1750傳感器的初始化兩部分。
{
e53_isl_io_init();
init_bh1750();
}
(左右移動(dòng)查看全部?jī)?nèi)容)
硬件IO初始化程序主要配置GPIO0_PA5為輸出模式,作為L(zhǎng)ED燈控制IO;初始化I2C0用于讀寫B(tài)H1750傳感器,配置I2C時(shí)鐘頻率400K。
{
LzGpioInit(GPIO0_PA5);
LzGpioSetDir(GPIO0_PA5, LZGPIO_DIR_OUT);
if (I2cIoInit(m_isl_i2c0m2) != LZ_HARDWARE_SUCCESS)
{
printf("init I2C I2C0 io failed ");
}
if (LzI2cInit(ISL_I2C0, 400000) != LZ_HARDWARE_SUCCESS)
{
printf("init I2C I2C0 failed ");
}
}
(左右移動(dòng)查看全部?jī)?nèi)容)
BH1750傳感器初始化程序通過I2C0向BH1750傳感器寫入通電命令0x1,開始等待測(cè)量命令,如圖3為BH1750傳感器的命令集。
圖3 BH1750指令
{
uint8_t send_data[1] = {0x01};
uint32_t send_len = 1;
LzI2cWrite(ISL_I2C0, BH1750_ADDR, send_data, send_len);
}
(左右移動(dòng)查看全部?jī)?nèi)容)
3、獲取傳感器數(shù)據(jù)程序設(shè)計(jì)
獲取傳感器數(shù)據(jù)程序通過I2C下發(fā)命令開始測(cè)量,延時(shí)一定時(shí)間后,開始讀取BH1750傳感器的寄存器值,讀取兩個(gè)字節(jié)數(shù)據(jù),其中第一個(gè)字節(jié)數(shù)據(jù)為高8位,第二字節(jié)數(shù)據(jù)為低8位數(shù)據(jù),亮度值為高8位和低8位數(shù)據(jù)合并為16字節(jié)數(shù)據(jù)除以1.2。
{
float lum = 0;
start_bh1750();
LOS_Msleep(180);
uint8_t recv_data[2] = {0};
uint32_t receive_len = 2;
LzI2cRead(ISL_I2C0, BH1750_ADDR, recv_data, receive_len);
lum = (float)(((recv_data[0]<<8) + recv_data[1])/1.2);
return lum;
}
(左右移動(dòng)查看全部?jī)?nèi)容)
程序通過I2C0向BH1750傳感器寫入連續(xù)H分辨率模式命令0x10,開始測(cè)量命令,測(cè)量時(shí)間一般為120ms。
{
uint8_t send_data[1] = {0x10};
uint32_t send_len = 1;
LzI2cWrite(ISL_I2C0, BH1750_ADDR, send_data, send_len);
}
(左右移動(dòng)查看全部?jī)?nèi)容)
四、測(cè)試結(jié)果
程序編譯燒寫到小凌派RK2206開發(fā)板后,按下開發(fā)板的RESET按鍵,通過串口軟件查看日志如下所示;通過遮擋智慧路燈模塊上的光線傳感器,從而來改變光線強(qiáng)度值,當(dāng)光線強(qiáng)度值小于20時(shí),LED燈打開;當(dāng)光線強(qiáng)度值大于20時(shí),LED燈關(guān)閉。
luminance value is 45.83
light off
luminance value is 4.17
light on
(左右移動(dòng)查看全部?jī)?nèi)容)
原文標(biāo)題:基于 OpenHarmony 的智慧路燈實(shí)現(xiàn)
文章出處:【微信公眾號(hào):HarmonyOS官方合作社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
電路設(shè)計(jì)
+關(guān)注
關(guān)注
6659文章
2420瀏覽量
202814 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
4896瀏覽量
97058 -
智慧路燈
+關(guān)注
關(guān)注
2文章
735瀏覽量
17037 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3635瀏覽量
16061
原文標(biāo)題:基于 OpenHarmony 的智慧路燈實(shí)現(xiàn)
文章出處:【微信號(hào):HarmonyOS_Community,微信公眾號(hào):電子發(fā)燒友開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論