目录
一、模块介绍
(一)基本信息
(二)运行条件
(三)内部介绍
(四)模块工作流程
(五)指令集
(六)模块地址
(七)IIC通信举例
(1)连续读H分辨率模式1 、ADDR=0
(2)单次L分辨率模式1 、ADDR=1
(八)结果计算公式
二、程序设计
(一)bh1750.h文件宏定义
(二)bh1750.c文件
①初始化函数
②读数据函数
(三)主函数
三、演示效果
(一)黑暗处
(二)对着我的台灯
四、补充
(一)硬件连接
(二)模块图
(三)原理图
程序:
51版本:
32版本:
链接:https://pan.baidu.com/s/1SASv3GejlO8cs43fcHTQfw 提取码:9534
一、模块介绍
(一)基本信息
BH1750FVI 是一款用于 I2C 总线接口的数字环境光传感器 IC。该IC最适合获得环境光,用于调整手机LCD和Keypad背光功率的数据。
- IIC总线接口
- 光谱责任近似于人眼反应
- 照度数字转换器
- 宽范围和高分辨率。 ( 1 - 65535 lx )
- 通过断电功能实现低电流
- 50Hz / 60Hz 光噪声抑制功能
- 1.8V 逻辑输入接口
- 无需任何外部零件
- 光源依赖性小。 (例如白炽灯、荧光灯、卤素灯、白光 LED、太阳灯)
- 可以选择 2 种 I2C 从地址。
- 光学窗口影响的可调测量结果(使用此功能可以检测最小 0.11 lx,最大 100000 lx。)
- 小的测量变化 (+/- 20%)
- 红外线的影响很小。
(二)运行条件
①VCC 电压 Vcc 最小2.4 最大3.6 V
②IIC参考电压为VCC电压
(三)内部介绍
①PD:具有近似人眼响应的光电二极管。
②AMP:用于将 PD 电流转换为电压的集成运算放大器。
③ADC:用于获得数字 16 位数据的 AD 转换器。
④Logic+I2C Interface:逻辑+ I2C接口
⑤OSC:内部振荡器(典型值 320kHz)。它是内部逻辑的 CLK
(四)模块工作流程
注:实线箭头表示自动执行,虚线箭头表示通过IIC指令执行。
首先是给模块上电,模块会自动进入掉电模式,当需要测量时,通过IIC发送指令使模块进入上电模式,此时模块会等待IIC发送测量命令,当选择单次测量时,模块测量完成会会自动进入掉电模式,若下次测量需要发送上电指令;若选择持续测量,模块不会自动进入掉电模式。
(五)指令集
操作说明 | 操作码(十六进制) | 指令描述 |
掉电模式 | 0x00 | 无 |
上电模式 | 0x01 | 等待测量命令。 |
复位 | 0x07 | 重置数据寄存器值。复位命令在掉电模式下不可使用。 |
连续H分辨率模式1 | 0x10 | 以 1lx 分辨率开始测量。 测量时间通常为 120 毫秒。 |
连续H分辨率模式2 | 0x11 | 以 0.5lx 分辨率开始测量。 测量时间通常为 120 毫秒。 |
连续L分辨率模式 | 0x13 | 以 4lx 分辨率开始测量。 测量时间通常为 16 毫秒。 |
单次 H 分辨率模式1 | 0x20 | 以 1lx 分辨率开始测量。 测量时间通常为 120 毫秒。 测量后,它会自动设置为掉电模式 |
单次 H 分辨率模式2 | 0x21 | 以 0.5lx 分辨率开始测量。 测量时间通常为 120 毫秒。 测量后,它会自动设置为掉电模式 |
单次 L 分辨率模式 | 0x23 | 以 4lx 分辨率开始测量。 测量时间通常为 16 毫秒。 测量后,它会自动设置为掉电模式 |
更改测量时间(高3位) | 01000_xxx | 改变测量时间 |
更改测量时间(低5位) | 011_xxxxx | 改变测量时间 |
官方推荐使用H分辨率模式1,由于H分辨率模式1测量时间长(积分时间长),可以过滤频率在50-60Hz的噪声信号,并且H分辨率模式1的分辨率为1lx,适用于黑夜测量;同样H分辨率模式2也适用于黑夜。
(六)模块地址
当ADDR = ‘L’时,地址为 0x46
当ADDR = ‘H’时,地址为 0xb8
(七)IIC通信举例
(1)连续读H分辨率模式1 、ADDR=0
这就是我们的IIC协议,首先发送一的ST起始信号,然后发送地址信号(0100011)和写方向(0),等待设备应答,在发送指令0001 0000(连续H分辨率模式1),然后进入等待(最长等待时间为180ms),再对模块读取测量结果,测量结果由高字节和低字节组成,分两个字节发送。
(2)单次L分辨率模式1 、ADDR=1
我就不解释啦,和上面是一样的。
(八)结果计算公式
若接收到的高字节为:0000 0011,低字节为0000 0001,则结果为:
二、程序设计
这里演示的是 连续读H分辨率模式1 ADDR=0 的程序,这里不涉及IIC的具体时序,只介绍关于模块如何读写数据。
(一)bh1750.h文件宏定义
ADDR=0,模块地址为0x46;
共读取5次数据(每个数据包含高位字节数据和低位字节数据);
#define BH1750_ADDRESS 0x46 //模块地址
#define BH1750_DATA_NUM 5 //从模块中读取数据个数
(二)bh1750.c文件
①初始化函数
/*
*********************************************************************************************************
* 函 数 名: BH1750_Config
* 功能说明: 初始化BH1750模块
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void BH1750_Config(void)
{
BH1750_WriteByte(0x01);//设置为上电模式,等待读取数据指令
BH1750_WriteByte(0x10); // H- resolution mode
delay_ms(180);//延时,180ms
}
②读数据函数
uint8_t BH1750_Source_Data[2*BH1750_DATA_NUM]={0};//用于存放原始数据
float BH1750_Convert_Data[BH1750_DATA_NUM]={0};//存放转换后的数据
float BH1750_Average_Data = 0;//平均值=取样值之和/取样次数
/*
*********************************************************************************************************
* 函 数 名: BH1750_ReadByte
* 功能说明: 单字节读取BH1750数据
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void BH1750_ReadByte(void)
{
uint8_t i=0;
uint16_t temp=0;
float data_sum=0;
for(i=0;i<BH1750_DATA_NUM;i++)
{
BH1750_IIC_Start(); //主机打开IIC通讯
BH1750_IIC_SendByte(BH1750_ADDRESS|0x01); //发送BH1750地址+读信号
BH1750_IIC_WaitAck(); //等待从机应答
BH1750_Source_Data[2*i] = BH1750_IIC_ReadByte();//存储高字节数据
BH1750_IIC_Ack(); //回应ACK
BH1750_Source_Data[2*i+1] = BH1750_IIC_ReadByte();//存储低字节数据
BH1750_IIC_NAck();
BH1750_IIC_Stop(); //发送停止信号,释放总线
}
printf("BH1750共读取 %d 次数据\r\n",BH1750_DATA_NUM);
for(i=0;i<BH1750_DATA_NUM;i++)
{
temp = (BH1750_Source_Data[2*i]<<8)| BH1750_Source_Data[2*i+1];//将高字节数据 和低字节数据合并成16位数据
BH1750_Convert_Data[i] = (float)temp / 1.2;//转换成最终数据
data_sum += BH1750_Convert_Data[i];
printf("BH1750第%d次的数据: %.2f lx \r\n",i,BH1750_Convert_Data[i]);
}
BH1750_Average_Data = data_sum/BH1750_DATA_NUM;
printf("BH1750平均数据: %.2f lx \r\n",BH1750_Average_Data);
}
(三)主函数
void Init(void)
{
USART_Config();//串口初始化
BH1750_Config();//BH1750初始化
}
int main(void)
{
Init();
BH1750_ReadByte();
while(1)
{
}
}
三、演示效果
(一)黑暗处
(二)对着我的台灯
四、补充
(一)硬件连接
①SCL-------PB5
②SDA-------PB6
③ADDR----GND(或者3.3V)
④VCC-------VCC(5V或3.3V,模块上有3.3V稳压芯片)
⑤GND------GND
(二)模块图
(三)原理图
以上就是光敏传感器的全部内容了,有理解不对的地方麻烦大家指出,万分感谢!程序和资料熊同学以后会更新在文章的开始......程序有51版本和32版本。