天天看點

基于OpenHarmony的智慧路燈實作

一、智慧路燈簡介

我們平時看到的傳統路燈基本是通過定時開啟、定時關閉來控制路燈亮滅,在夏天白晝時間長,路燈過早開啟,造成能源浪費;在冬天白晝時間短,往往經常是天已經黑了,路燈卻未開啟,給人們的出行帶來了諸多不便;也有的路燈通過專人手動開啟關閉,這種方式雖較定時方式靈活,但也存在需要人為操作的局限性。随着社會的發展進步,智慧路燈應運而生,智慧路燈通過自身攜帶的光線傳感器,通過傳感器采集的的光線資料判斷天黑情況,可以根據預置的門檻值來實作路燈開啟關閉;同時智慧路燈的光線資料也可以同步上傳雲端,通過雲端可以查詢到智慧路燈的光線資料、路燈開啟關閉狀态,同時也可以設定智慧路燈開啟關閉的門檻值,實作雲管理。

本文基于OpenHarmony系統,使用小淩派RK2206開發闆搭載智慧路燈子產品,模拟實作智慧路燈應用,智慧路燈子產品本身自帶光線傳感器,通過傳感器采集的光線資料判斷天黑情況,根據預設的門檻值來實作路燈的開關;搭載OpenHarmony系統的小淩派RK2206開發闆支援連接配接華為雲伺服器,後續文章将更新智慧路燈在華為雲的應用實作。

二、硬體電路設計

智慧路燈子產品硬體電路如圖1所示,電路中包含了E53接口連接配接器、EEPROM存儲器、光線傳感器BH1750、大功率LED燈驅動電路。本文主要使用光線傳感器BH1750和LED燈驅動電路,其中光線傳感器為數字接口晶片,使用I2C總線控制;LED燈驅動電路通過PWD_LED口控制LED燈開啟、關閉,PWD_LED輸出高電平點亮LED燈,PWD_LED輸出低電平熄滅LED燈。子產品硬體電路簡單,這裡就不對此進行多餘的說明。

基于OpenHarmony的智慧路燈實作

圖1 智慧路燈子產品硬體電路圖

小淩派RK2206開發闆與智慧路燈子產品均帶有防呆設計,能夠很容易區分安裝方向,直接将子產品插入到小淩派RK2206開發闆的E53母座接口上即可,安裝如圖2所示.

基于OpenHarmony的智慧路燈實作

圖2 硬體連接配接圖

三、軟體設計

1、主程式設計

小淩派RK2206開發闆上電後,OpenHarmony系統開始運作,LiteOS系統初始化後,建立一個線程用于實作智慧路燈主程式。進入主程式先初始化智慧路燈子產品,程式進入主循環,2秒擷取一次光線傳感器BH1750的光線強度值,當光線強度值小于20時,打開LED路燈;當光線強度值大于20時,關閉LED路燈

{
    float lum = 0;

    e53_isl_init();

    while (1)
    {
        lum = e53_isl_read_data();

        printf("luminance value is %.2f\n", lum);

        if (lum < 20)
        {
            isl_light_set_status(ON);
            printf("light on\n");
        }
        else
        {
            isl_light_set_status(OFF);
            printf("light off\n");
        }

        LOS_Msleep(2000);
    }
}
           

2、智慧路燈初始化程式設計

智慧路燈初始化程式主要分為硬體IO初始化和BH1750傳感器的初始化兩部分。

    e53_isl_io_init();
    init_bh1750();
}
           

硬體IO初始化程式主要配置GPIO0_PA5為輸出模式,作為LED燈控制IO;初始化I2C0用于讀寫BH1750傳感器,配置I2C時鐘頻率400K。

    LzGpioInit(GPIO0_PA5);
    LzGpioSetDir(GPIO0_PA5, LZGPIO_DIR_OUT);

    if (I2cIoInit(m_isl_i2c0m2) != LZ_HARDWARE_SUCCESS)
    {
        printf("init I2C I2C0 io failed\n");
    }
    if (LzI2cInit(ISL_I2C0, 400000) != LZ_HARDWARE_SUCCESS)
    {
        printf("init I2C I2C0 failed\n");
    }
}
           

BH1750傳感器初始化程式通過I2C0向BH1750傳感器寫入通電指令0x1,開始等待測量指令,如圖3為BH1750傳感器的指令集。

基于OpenHarmony的智慧路燈實作

圖3 BH1750指令

    uint8_t send_data[1] = {0x01};
    uint32_t send_len = 1;

    LzI2cWrite(ISL_I2C0, BH1750_ADDR, send_data, send_len); 
}
           

3、擷取傳感器資料程式設計

  擷取傳感器資料程式通過I2C下發指令開始測量,延時一定時間後,開始讀取BH1750傳感器的寄存器值,讀取兩個位元組資料,其中第一個位元組資料為高8位,第二位元組資料為低8位資料,亮度值為高8位和低8位資料合并為16位元組資料除以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;
}
           
程式通過I2C0向BH1750傳感器寫入連續H分辨率模式指令0x10,開始測量指令,測量時間一般為120ms。  
           
    uint8_t send_data[1] = {0x10};
    uint32_t send_len = 1;

    LzI2cWrite(ISL_I2C0, BH1750_ADDR, send_data, send_len);
}
           

四、測試結果

  程式編譯燒寫到小淩派RK2206開發闆後,按下開發闆的RESET按鍵,通過序列槽軟體檢視日志如下所示;通過遮擋智慧路燈子產品上的光線傳感器,進而來改變光線強度值,當光線強度值小于20時,LED燈打開;當光線強度值大于20時,LED燈關閉。

light off
luminance value is 4.17
light on
           

想了解更多關于鴻蒙的内容,請通路:

51CTO OpenHarmony技術社群

https://ost.51cto.com/#bkwz

繼續閱讀