BH1750模块
一,简介
BH1750通过I2C总线进行通信
BH1750指令集
实践
0100011 指的是0x23的一次L分辨率
0
是 I2C 写操作标志位 01000110 就是0x46
I2C 总线完成 “起始→发地址(写)→应答→发模式指令→应答→停止” 的标准写流程,核心是向 BH1750 写入工作模式指令,为后续的光照度测量做准备。
void BH1750_WriteReg(u8 RegAddress)
{MyI2C_Start();MyI2C_SendByte(BHAddWrite);MyI2C_ReceiveAck();MyI2C_SendByte(BHModeH1);MyI2C_ReceiveAck();MyI2C_Stop();
}
如果不先执行写操作,传感器处于未激活状态,内部无测量数据,读操作会返回无效值。
0100011指的是0x23的一次L分辨率 1 是 I2C 读操作标志位 01000111 就是0x47
- 调用写函数配置 BH1750 为高分辨率模式 1
- 延时 120ms 等待测量完成
- 发送 I2C 起始信号
- 发送 BH1750 读地址 (0x47) 并等待应答
- 读取高 8 位数据,发送应答 (0)
- 读取低 8 位数据,发送非应答 (1)
- 发送停止信号
- 拼接高低字节数据并返回
uint16_t BH1750_ReadReg(void)
{uint16_t Data;uint8_t DataH,DataL;BH1750_WriteReg(BHModeH1);Delay_ms(120);MyI2C_Start();MyI2C_SendByte(BHAddRead);//0x47MyI2C_ReceiveAck();DataH=MyI2C_ReceiveByte();MyI2C_SendAck(0);DataL=MyI2C_ReceiveByte();MyI2C_SendAck(1);MyI2C_Stop();Data=(DataH<<8)|DataL;return Data;
}
BH1750上电初始化
启动流程(从断电→通电→测量)
① 从「断电」→「通电」
- 需通过
I²C 写指令
(如代码里的BH1750_WriteReg(BHPowOn)
),主动发送 “通电指令”,让传感器退出断电模式、进入通电待机。 - (特殊情况:若直接发 “测量指令”,可*跳过单独通电步骤,传感器自动从断电切到通电*)
② 从「通电」→「测量」
传感器通电后,再发 I²C 写指令
选测量模式:
- 一次测量:发指令(如
BHModeSingle
),传感器启动单次测量 → 测完自动回断电 / 通电待机(依指令定)。 - 连续测量:发指令(如
BHModeH1
),传感器持续测量,周期性更新数据,需主动发停止指令才退出。
状态切换逻辑
- 断电 ↔ 通电:靠
I²C 写指令
触发,或被 “测量指令” 自动触发(跳过通电指令时)。 - 通电 → 一次测量 / 连续测量:完全由
I²C 写指令
决定模式。 - 测量结束(一次测量):自动回断电 / 通电(看指令);连续测量需主动停。
- 初始化 I2C 通信总线(
MyI2C_Init()
) - 发送上电指令(
BHPowOn
),唤醒传感器 - 发送复位指令(
BHReset
),清除内部寄存器状态 - 发送高分辨率模式 2 指令(
BHModeH2
),设置测量模式
void BH1750_Init(void)
{MyI2C_Init();BH1750_WriteReg(BHPowOn);BH1750_WriteReg(BHReset);BH1750_WriteReg(BHModeH2);}