[文章]基于OpenHarmony的智慧路灯实现

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

本文基于OpenHarmony系统,使用小凌派RK2206开发板搭载智慧路灯模块,模拟实现智慧路灯应用,智慧路灯模块本身自带光线传感器,通过传感器采集的光线数据判断天黑情况,根据预设的阈值来实现路灯的开关;搭载OpenHarmony系统的小凌派RK2206开发板支持连接华为云服务器,后续文章将更新智慧路灯在华为云的应用实现。

二、硬件电路设计
智慧路灯模块硬件电路如图1所示,电路中包含了E53接口连接器、EEPROM存储器、光线传感器BH1750、大功率LED灯驱动电路。本文主要使用光线传感器BH1750和LED灯驱动电路,其中光线传感器为数字接口芯片,使用I2C总线控制;LED灯驱动电路通过PWD_LED口控制LED灯开启、关闭,PWD_LED输出高电平点亮LED灯,PWD_LED输出低电平熄灭LED灯。模块硬件电路简单,这里就不对此进行多余的说明。

   
图片1.png
图1 智慧路灯模块硬件电路图

小凌派RK2206开发板与智慧路灯模块均带有防呆设计,能够很容易区分安装方向,直接将模块插入到小凌派RK2206开发板的E53母座接口上即可,安装如图2所示.
                           
图片2.png
                                              图2 硬件连接图
三、软件设计
1、主程序设计
小凌派RK2206开发板上电后,OpenHarmony系统开始运行,LiteOS系统初始化后,创建一个线程用于实现智慧路灯主程序。进入主程序先初始化智慧路灯模块,程序进入主循环,2秒获取一次光线传感器BH1750的光线强度值,当光线强度值小于20时,打开LED路灯;当光线强度值大于20时,关闭LED路灯。
  1. void e53_isl_thread()
  2. {
  3.     float lum = 0;

  4.     e53_isl_init();

  5.     while (1)
  6.     {
  7.         lum = e53_isl_read_data();

  8.         printf("luminance value is %.2fn", lum);

  9.         if (lum < 20)
  10.         {
  11.             isl_light_set_status(ON);
  12.             printf("light onn");
  13.         }
  14.         else
  15.         {
  16.             isl_light_set_status(OFF);
  17.             printf("light offn");
  18.         }

  19.         LOS_Msleep(2000);
  20.     }
复制代码

2、智慧路灯初始化程序设计
智慧路灯初始化程序主要分为硬件IO初始化和BH1750传感器的初始化两部分。
  1. {
  2.     e53_isl_io_init();
  3.     init_bh1750();
  4. }
复制代码
硬件IO初始化程序主要配置GPIO0_PA5为输出模式,作为LED灯控制IO;初始化I2C0用于读写BH1750传感器,配置I2C时钟频率400K。
  1. {
  2.     LzGpioInit(GPIO0_PA5);
  3.     LzGpioSetDir(GPIO0_PA5, LZGPIO_DIR_OUT);

  4.     if (I2cIoInit(m_isl_i2c0m2) != LZ_HARDWARE_SUCCESS)
  5.     {
  6.         printf("init I2C I2C0 io failedn");
  7.     }
  8.     if (LzI2cInit(ISL_I2C0, 400000) != LZ_HARDWARE_SUCCESS)
  9.     {
  10.         printf("init I2C I2C0 failedn");
  11.     }
  12. }
复制代码
BH1750传感器初始化程序通过I2C0向BH1750传感器写入通电命令0x1,开始等待测量命令,如图3为BH1750传感器的命令集。
                        
图片3.png
                                                        图3 BH1750指令
  1. {
  2.     uint8_t send_data[1] = {0x01};
  3.     uint32_t send_len = 1;

  4.     LzI2cWrite(ISL_I2C0, BH1750_ADDR, send_data, send_len);
  5. }
复制代码

3、获取传感器数据程序设计
获取传感器数据程序通过I2C下发命令开始测量,延时一定时间后,开始读取BH1750传感器的寄存器值,读取两个字节数据,其中第一个字节数据为高8位,第二字节数据为低8位数据,亮度值为高8位和低8位数据合并为16字节数据除以1.2。
  1. {
  2.     float lum = 0;

  3.     start_bh1750();
  4.     LOS_Msleep(180);

  5.     uint8_t recv_data[2] = {0};
  6.     uint32_t receive_len = 2;
  7.     LzI2cRead(ISL_I2C0, BH1750_ADDR, recv_data, receive_len);
  8.     lum = (float)(((recv_data[0]<<8) + recv_data[1])/1.2);

  9.     return lum;
  10. }
复制代码
程序通过I2C0向BH1750传感器写入连续H分辨率模式命令0x10,开始测量命令,测量时间一般为120ms。
  1. {
  2.     uint8_t send_data[1] = {0x10};
  3.     uint32_t send_len = 1;

  4.     LzI2cWrite(ISL_I2C0, BH1750_ADDR, send_data, send_len);
  5. }
复制代码

四、测试结果
程序编译烧写到小凌派RK2206开发板后,按下开发板的RESET按键,通过串口软件查看日志如下所示;通过遮挡智慧路灯模块上的光线传感器,从而来改变光线强度值,当光线强度值小于20时,LED灯打开;当光线强度值大于20时,LED灯关闭。
  1. luminance value is 45.83
  2. light off
  3. luminance value is 4.17
  4. light on
复制代码

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友