(二十九)树莓派3B+ 获取BH1750FVI光强度传感器数据
这个模块是几年前淘宝买的,找出来,发现还能使用,就找找资料玩了一下。
产品介绍
BH1750FVI 是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化。(1lx-65535lx)
产品特点
-
支持 I2C BUS 接口(f/s Mode Support)。
-
接近视觉灵敏度的光谱灵敏度特性(峰值灵敏度波长典型值:560nm)。
-
输出对应亮度的数字值。
-
对应广泛的输入光范围(相当于 1-65535lx)。
-
通过降低功率功能,实现低电流化。
-
通过 50Hz/60Hz 除光噪音功能实现稳定的测定7. 支持 1.8V 逻辑输入接口。
-
无需其他外部件。
-
光源依赖性弱(白炽灯,荧光灯,卤素灯,白光 LED,日光灯)。
-
有两种可选的 I2C slave 地址。
-
可调的测量结果影响较大的因素为光入口大小。
-
使用这种功能能计算 1.1 lx 到 100000 lx 马克斯/分钟的范围。
-
最小误差变动在±20%。
-
受红外线影响很小。
产品应用
移动电话,液晶电视,笔记本电脑,便携式游戏机,数码相机,数码摄像机,汽车定位系统,液晶显示器。
芯片框图
描述:
・PD 接近人眼反应的光敏二极管。(Photo diode with approximately human eye response.)
・AMP 集成运算放大器:将 PD 电流转换为 PD 电压。
・ADC 模数转换获取 16 位数字数据。
・Logic + IC Interface(逻辑+ IC 界面)光强度计算和 I2C 总线接口,包括下列寄存器:数据寄存器→光强度数据寄存。初始值是:“0000_0000_0000_0000”。测量时间寄存器→时间测量数据寄存。初始值是:“0100_0101”。
・OSC 内部振荡器(时钟频率典型值:320kHz)。该时钟为内部逻辑时钟。
从这个框图也可以看出这个芯片的内部模块比较简单,实际使用也不复杂。
测量程序步骤
指令集合结构
从“写指示”到“读出测量结果”的测量时序实例
测量程序
let i2c = require('i2c-bus');
let rpio = require('rpio');
// 寄存器说明
let BH1750_SlaveAddress = 0x23, // 设备地址
BS1750_DOWN = 0x00, // 断电指令
BH1750_ON = 0x01, // 通电指令
BH1750_RESEET = 0x07, // 通电指令
BH1750_CON_H = 0x10, // 连续分辨率模式, 1lx, 120ms
BH1750_CON_H2 = 0x11, // 连续分辨率模式, 0.5lx, 120ms
BH1750_CON_L = 0x13, // 连续低分辨率模式,4lx, 16ms
BH1750_ONE_H = 0x20, // 一次高分辨率模式,1lx, 120ms
BH1750_ONE_H2 = 0x21, // 一次高分辨率模式,0.5lx, 120ms
BH1750_ONE_L = 0x23; // 一次低分辨率模式,4lx, 16ms
function bh1750fvi(i2cbus, bh1750fvi_address) {
if (!(this instanceof bh1750fvi)) {
return new bh1750fvi(i2cbus, bh1750fvi_address);
}
this.address = bh1750fvi_address;
this.bus = i2c.openSync(i2cbus);
}
// 读取光强lux
bh1750fvi.prototype.get_bh1750fvi = function() {
this.bus.sendByteSync(this.address, BS1750_DOWN);
rpio.usleep(100);
this.bus.sendByteSync(this.address, BH1750_ON);
rpio.usleep(100);
let buffer = Buffer.alloc(2);
this.bus.readI2cBlockSync(this.address,BH1750_CON_H,2,buffer);
return convertToLux(buffer);
}
// 十六进制数据转换成lux
function convertToLux(data){
return Math.round((data[1] + (256 * data[0])) / 1.2);
}
module.exports = bh1750fvi;
// 显示
let bh1750fvi = require('../bh1750fvi/index');
function main(){
lcd_init();
while(1){
lcd_show_string(0, 0,'LUX: ' + bh1750fviModel.get_bh1750fvi());
rpio.msleep(200);
}
}
这里显示程序需要结合上一篇一起查看:
显示效果图
下一篇: python3 数据库的常用操作