Firefly开源社区

标题: ROC-RK3308-CC开发实例总结--BH1750-GY30数字光照传感器模块调试 [打印本页]

作者: lisd    时间: 2019-2-14 16:12
标题: ROC-RK3308-CC开发实例总结--BH1750-GY30数字光照传感器模块调试
本帖最后由 lisd 于 2019-2-15 15:11 编辑

传感器介绍
BH1750FVI是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化(1lx-65535lx)。

产品可应用于移动电话,液晶电视,笔记本电脑,便携式游戏机,数码相机,数码摄像机,汽车定位系统,液晶显示器等

设备树编写
  1. &i2c1 {
  2.     clock-frequency = <400000>;
  3.     status = "okay";
  4.     ...
  5.     bh1750: bh1750@23 {
  6.             status = "okay";                                                      
  7.             compatible = "bh1750-sensor";
  8.             reg = <0x23>;                     //slave地址
  9.     };
  10. };
复制代码
在i2c1中声明设备节点,设备有两种可选的slave地址,由ADDR端口决定:ADDR为低电平时,slave地址是0x23;ADDR为高电平时,slave地址是0x5c。这里选择了前者。

驱动编写
附上写寄存器时序图,下图以发送“连续高分辨率模式”指令为例:

PS:图中,0100011(即0x23)为slave地址;00010000为“连续高分辨率模式”指令码。
下面代码根据写寄存器时序图封装了写寄存器函数,参数opecode是所要写的指令。

  1. static int bh1750_write_reg(struct i2c_client *client, unsigned char opecode)
  2. {
  3.     unsigned char buf[1] = {opecode};         //所要写的指令
  4.     int ret;
  5.     ret = i2c_master_send(client,buf,1);
  6.     if(ret < 0) {
  7.         printk("write_reg failed! ret = %d\n",ret);
  8.     }

  9.     return ret;
  10. }
复制代码

附上读寄存器时序图:

下面代码根据读寄存器时序图封装了读寄存器函数,一次读操作会得到两个字节的数据,保存在buf中
  1. static int bh1750_read_reg(struct i2c_client *client, char *buf)
  2. {
  3.     int ret;
  4.     ret = i2c_master_recv(client,buf,2);              //接收两个字节数据,先接收高八位,后接收低八位
  5.     if(ret < 0) {
  6.         printk("read_reg: recv failed! ret = %d\n",ret);
  7.         return ret;
  8.     }
  9.     return ret;
  10. }
复制代码

有了上面两个函数之后,就可以操作传感器使其工作并获得数据,先附上一张传感器工作流程图,如下:

  1. static int bh1750_read_raw(struct iio_dev *indio_dev,
  2.             struct iio_chan_spec const *chan,
  3.             int *val,
  4.             int *val2,
  5.             long mask)
  6. {
  7.     char *data = kmalloc(2,GFP_KERNEL);
  8.     int ret;

  9.     bh1750_write_reg(bh1750.client,POWERON);           //发送 通电 指令
  10.     bh1750_write_reg(bh1750.client,H_RESOLUTION_MODE);           //发送“连续高分辨率模式”指令
  11.     mdelay(120);             //等待传感器测量完成(该模式下测量时间一般为120ms,不同模式的测量时间不同,需调整延时的时间)
  12.     bh1750_read_reg(bh1750.client,data);           //读取测量结果

  13.     ret = IIO_VAL_INT;
  14.     if(chan->type == IIO_TEMP){
  15.         *val = *data;
  16.         *val = (*val << 8) + *(data + 1);          //数据合成
  17.     } else{
  18.         ret = -EINVAL;
  19.     }

  20.     kfree(data);
  21.     return ret;
  22. }
复制代码

测试结果
笔者编写了一个测试程序,在串口调试终端中运行可执行程序,测试结果如下:
  1. /********用手遮挡********/
  2. # /usr/bin/bh1750demo
  3. light data = 0.83(lx)

  4. /********正常光照********/
  5. # /usr/bin/bh1750demo
  6. light data = 227.50(lx)

  7. /********高强光照********/
  8. # /usr/bin/bh1750demo
  9. light data = 39234.17(lx)
复制代码
附上驱动,测试程序附件:

bh1750demo.tar

10 KB, 下载次数: 42, 下载积分: 灯泡 -1 , 经验 -1


作者: qq1715497152    时间: 2019-2-21 18:34
谢谢分享
作者: humhh575    时间: 2019-7-17 10:31

谢谢分享
作者: hquhjq    时间: 2019-11-19 15:29
谢谢分享!!!
作者: 辛晓宇    时间: 2020-10-31 20:44
新来的下不了
作者: kenanhcf    时间: 2021-11-2 20:07
谢谢分享!!!
作者: 黄晨    时间: 2021-11-23 00:03
新来的下不了
作者: fjptcym    时间: 2022-3-27 17:46
感谢分享




欢迎光临 Firefly开源社区 (https://dev.t-firefly.com/) Powered by Discuz! X3.1