https://mp.weixin.qq.com/s/id9sVd_uRSxIEgwgwlw31A
在最后一篇文章中,我们介绍了它IIC驱动OLED显示屏。这篇文章是IIC驱动BH1750FVI光强传感器。事实上,它也写在以前的覆盆子系列中BH1750FVI17.树莓派3B 驱动BH1750FVI光强传感器
这里是一个IIC两个挂载在总线上IIC从设备。
产品介绍
BH1750FVI它是一种用于两线串行总线接口的数字光强度传感器集成电路。该集成电路可根据收集的光强数据调整液晶或键盘背景灯的亮度。利用其高分辨率,可以探测到大范围的光强度变化。lx-65535lx)
产品特点
1.支持I2C BUS接口(f/s Mode Support)。
2.光谱灵敏度特征(峰值灵敏度波长典型值:560nm)。
3.输出相应亮度的数字值。
4.相当于广泛的输入光范围(相当于1-65535lx)。
5.通过降低功率功能,实现低电流。
6.通过50Hz/60Hz实现除光噪声功能测定7.支持1.8V逻辑输入接口。
8.没有其他外部部件。
9.光源依赖性弱(白炽灯、荧光灯、卤素灯、白光LED,日光灯)。
10.有两种选择I2C slave地址。
11.影响可调测量结果的因素是光入口大小。
12.使用此功能计算1.1 lx到100000 lx马克斯/分钟范围。
13.最小误差变化在±20%。
14.红外线的影响很小。
产品应用
手机、液晶电视、笔记本电脑、便携式游戏机、数码相机、数码相机、汽车定位系统、液晶显示器。
描述:
?PD 光敏二极管接近人眼反应。(Photo diode with approximately human eye response.)
?AMP 集成操作放大器:将 PD 电流转换为 PD 电压。
?ADC 获取模数转换 16 位数数据。
?Logic IC Interface(逻辑 IC 光强度计算和界面) I2C 总线接口包括以下寄存器:数据寄存器→存储光强数据。初始值为:万万_0000_0000_一万。测量时间寄存器→存储时间测量数据。初始值为:0100_0101”。
?OSC 内部振荡器(典型时钟频率值:320kHz)。该时钟为内部逻辑时钟。
从这个框图也可以看出,芯片的内部模块相对简单,实际使用并不复杂。
测量程序步骤
指令集合结构
测量时序实例从写指示到读出测量结果
#define IIC_SCL P10 // 时钟 #define IIC_SDA P11 // 数据
这个是IIC和单片机IO口的连接。
驱动代码
#include "bh1750fvi.h" #include "iic.h" #define BH1750FVI_SlaveAddress 0x46 // 设备地址 #define BH1750FVI_DOWN 0x00 // 断电指令 #define BH1750FVI_ON 0x01 // 通电指令 #define BH1750FVI_RESEET 0x07 // 复位 #define BH1750FVI_CON_H 0x10 // 连续分辨率模式, 1lx, 120ms #define BH1750FVI_CON_H2 0x11 // 连续分辨率模式, 0.5lx, 120ms #define BH1750FVI_CON_L 0x13 // 连续低分辨率模式,4lx, 16ms #define BH1750FVI_ONE_H 0x20 // 高分辨率模式,1lx, 120ms #define BH1750FVI_ONE_H2 0x21 // 高分辨率模式,0.5lx, 120ms #define BH1750FVI_ONE_L 0x23 // 低分辨率模式,4lx, 16ms // 往BH1750FVI写数据 void BH1750FVI_Write_Reg(u8 reg) { IIC_Start(); IIC_Write_Byte(BH1750FVI_SlaveAddress); IIC_Write_Byte(reg); IIC_Stop(); } // 读取1字节数据 u8 BH1750FVI_Read_Reg(u8 reg) { u8 dat; IIC_Start(); IIC_Write_Byte(BH1750FVI_SlaveAddress); IIC_Write_Byte(reg); IIC_Start(); IIC_Write_Byte(BH1750FVI_SlaveAddress 1); dat = IIC_Read_Byte(); IIC_Stop(); return dat; } u16 BH1750FVI_Read_all() { u8 i; u8 BUF[8]; u16 dat; IIC_Start(); IIC_Write_Byte(BH1750FVI_SlaveAddress 1); for(i = 0; i < 2; i ) { BUF[i] = IIC_Read_Byte(); if(i == 2){ IIC_Send_Ack(1); }else{ IIC_Send_Ack(0); } } IIC_Stop(); dat = BUF[0]<<8 BUF[1]; return dat; } u16 BH1750FVI_Measure() { BH1750FVI_Write_Reg(BH1750FVI_ON); BH1750FVI_Write_Reg(BH1750FVI_CON_H); return BH1750FVI_Read_all(); } void BH1750FVI_Init() { BH1750FVI_Write_Reg(BH1750FVI_DOWN); BH1750FVI_Write_Reg(BH1750FVI_ON); }
main.c
#include "stc15.h" #include "delay.h" #include "bh1750fvi.h" #include "oled.h" u8 num[] = 0,1,2,3,4,5'9'}; void main() { u16 result; BH1750FVI_Init(); OLED_Init(); //初始化OLED OLED_Clear() ; while (1) { result = BH1750FVI_Measure(); OLED_ShowChar(0,0,num[result/10000],1); // 万 OLED_ShowChar(10,0,num[result000/1000],1); // 千 OLED_ShowChar(20,0,num[result00000/100],1); // 百 OLED_ShowChar(30,0,num[result000001);//// 十 OLED_ShowChar(40,0,num[result],1); // 个 delayms(2000); } }
显示效果图