基于OpenHarmony的智慧路灯实现 原创 精华
一、智慧路灯简介
我们平时看到的传统路灯基本是通过定时开启、定时关闭来控制路灯亮灭,在夏天白昼时间长,路灯过早开启,造成能源浪费;在冬天白昼时间短,往往经常是天已经黑了,路灯却未开启,给人们的出行带来了诸多不便;也有的路灯通过专人手动开启关闭,这种方式虽较定时方式灵活,但也存在需要人为操作的局限性。随着社会的发展进步,智慧路灯应运而生,智慧路灯通过自身携带的光线传感器,通过传感器采集的的光线数据判断天黑情况,可以根据预置的阈值来实现路灯开启关闭;同时智慧路灯的光线数据也可以同步上传云端,通过云端可以查询到智慧路灯的光线数据、路灯开启关闭状态,同时也可以设置智慧路灯开启关闭的阈值,实现云管理。
本文基于OpenHarmony系统,使用小凌派RK2206开发板搭载智慧路灯模块,模拟实现智慧路灯应用,智慧路灯模块本身自带光线传感器,通过传感器采集的光线数据判断天黑情况,根据预设的阈值来实现路灯的开关;搭载OpenHarmony系统的小凌派RK2206开发板支持连接华为云服务器,后续文章将更新智慧路灯在华为云的应用实现。
二、硬件电路设计
智慧路灯模块硬件电路如图1所示,电路中包含了E53接口连接器、EEPROM存储器、光线传感器BH1750、大功率LED灯驱动电路。本文主要使用光线传感器BH1750和LED灯驱动电路,其中光线传感器为数字接口芯片,使用I2C总线控制;LED灯驱动电路通过PWD_LED口控制LED灯开启、关闭,PWD_LED输出高电平点亮LED灯,PWD_LED输出低电平熄灭LED灯。模块硬件电路简单,这里就不对此进行多余的说明。
图1 智慧路灯模块硬件电路图
小凌派RK2206开发板与智慧路灯模块均带有防呆设计,能够很容易区分安装方向,直接将模块插入到小凌派RK2206开发板的E53母座接口上即可,安装如图2所示.
图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传感器的命令集。
图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
666