基于OpenHarmony的智慧路灯实现 原创 精华

发布于 2022-4-22 14:04
浏览
1收藏

一、智慧路灯简介
我们平时看到的传统路灯基本是通过定时开启、定时关闭来控制路灯亮灭,在夏天白昼时间长,路灯过早开启,造成能源浪费;在冬天白昼时间短,往往经常是天已经黑了,路灯却未开启,给人们的出行带来了诸多不便;也有的路灯通过专人手动开启关闭,这种方式虽较定时方式灵活,但也存在需要人为操作的局限性。随着社会的发展进步,智慧路灯应运而生,智慧路灯通过自身携带的光线传感器,通过传感器采集的的光线数据判断天黑情况,可以根据预置的阈值来实现路灯开启关闭;同时智慧路灯的光线数据也可以同步上传云端,通过云端可以查询到智慧路灯的光线数据、路灯开启关闭状态,同时也可以设置智慧路灯开启关闭的阈值,实现云管理。
本文基于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

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
4
收藏 1
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐