- 1、BH1750简介
- 2、具体参数
- 3、原理图
- 4、引脚连接
- 5、代码实现
- 6、结果显示
- 7、备注:
BH1750是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化。BH1750的内部由光敏二极管、运算放大器、ADC采集、晶振等组成。对应广泛的输入光范围(相当于1-65535lx),最小误差变动在土20%,而且受红外线影响很小。
1、采用ROHM原装BH1750FVI芯片
2、光照度范围: 0-655351x,传感器内置16bitAD转换器直接数字输出,省略复杂计算)省略标定
3、内部包含通信电平转换,与5V单片机I0连接,支持STM32/51/ardunio
4、XH2.54接口连接线,方便客户DIY
5、小体积,广泛应用于室内光照检测、蔬菜、苗圃、温室大棚
- 采用ROHM原装BH1750FVI芯片
- 供电电源: 3-5v
- 数据范围: 0-65535lx
- 传感器内置16bitAD转换器
- 直接数字输出,省略复杂的计算,省略标定
- 不区分环境光源,接近于视觉灵敏度的分光特性
- 可对广泛的亮度进行1勒克斯的高精度测定
- 标准NXP 1IC通信协议
- 模块内部包含通信电平转换,与5v单片机IO直接连接
| 名称 | 注释 |
|---|---|
| GND | 电源地 |
| VCC | 电源(3.3v~5v) |
| SCL | 时钟线 |
| SDA | 数据线 |
| ADDR | 设备地址引脚 |
通讯方式为IIC具体可见OLED模块那里的具体介绍
5、代码实现函数bh1750.c
#include "bh1750.h"
#include "sys.h"
static void I2C_BH1750_GPIOConfig(void);
static void i2c_Delay(void)
{
uint8_t i;
for (i = 0; i < 10; i++);
}
void i2c_Start(void)
{
BH1750_I2C_SDA_1();
BH1750_I2C_SCL_1();
i2c_Delay();
BH1750_I2C_SDA_0();
i2c_Delay();
BH1750_I2C_SCL_0();
i2c_Delay();
}
void i2c_Stop(void)
{
BH1750_I2C_SDA_0();
BH1750_I2C_SCL_1();
i2c_Delay();
BH1750_I2C_SDA_1();
}
void i2c_SendByte(uint8_t _ucByte)
{
uint8_t i;
for (i = 0; i < 8; i++)
{
if (_ucByte & 0x80)
{
BH1750_I2C_SDA_1();
}
else
{
BH1750_I2C_SDA_0();
}
i2c_Delay();
BH1750_I2C_SCL_1();
i2c_Delay();
BH1750_I2C_SCL_0();
if (i == 7)
{
BH1750_I2C_SDA_1(); // 释放总线
}
_ucByte <<= 1;
i2c_Delay();
}
}
uint8_t i2c_ReadByte(void)
{
uint8_t i;
uint8_t value;
value = 0;
for (i = 0; i < 8; i++)
{
value <<= 1;
BH1750_I2C_SCL_1();
i2c_Delay();
if (BH1750_I2C_SDA_READ())
{
value++;
}
BH1750_I2C_SCL_0();
i2c_Delay();
}
return value;
}
uint8_t i2c_WaitAck(void)
{
uint8_t re;
BH1750_I2C_SDA_1();
i2c_Delay();
BH1750_I2C_SCL_1();
i2c_Delay();
if (BH1750_I2C_SDA_READ())
re = 1;
else
re = 0;
BH1750_I2C_SCL_0();
i2c_Delay();
return re;
}
void i2c_Ack(void)
{
BH1750_I2C_SDA_0();
i2c_Delay();
BH1750_I2C_SCL_1();
i2c_Delay();
BH1750_I2C_SCL_0();
i2c_Delay();
BH1750_I2C_SDA_1();
}
void i2c_NAck(void)
{
BH1750_I2C_SDA_1();
i2c_Delay();
BH1750_I2C_SCL_1();
i2c_Delay();
BH1750_I2C_SCL_0();
i2c_Delay();
}
static void I2C_BH1750_GPIOConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(BH1750_RCC_I2C_PORT, ENABLE);
GPIO_InitStructure.GPIO_Pin = BH1750_I2C_SCL_PIN | BH1750_I2C_SDA_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(BH1750_GPIO_PORT_I2C, &GPIO_InitStructure);
i2c_Stop();
}
uint8_t i2c_CheckDevice(uint8_t _Address)
{
uint8_t ucAck;
i2c_Start();
i2c_SendByte(_Address | BH1750_I2C_WR);
ucAck = i2c_WaitAck();
i2c_Stop();
return ucAck;
}
//BH1750写一个字节
//返回值 成功:0 失败:非0
uint8_t BH1750_Byte_Write(uint8_t data)
{
i2c_Start();
//发送写地址
i2c_SendByte(BH1750_Addr|0);
if(i2c_WaitAck()==1)
return 1;
//发送控制命令
i2c_SendByte(data);
if(i2c_WaitAck()==1)
return 2;
i2c_Stop();
return 0;
}
//BH1750读取测量数据
//返回值 成功:返回光照强度 失败:返回0
uint16_t BH1750_Read_Measure(void)
{
uint16_t receive_data=0;
i2c_Start();
//发送读地址
i2c_SendByte(BH1750_Addr|1);
if(i2c_WaitAck()==1)
return 0;
//读取高八位
receive_data=i2c_ReadByte();
i2c_Ack();
//读取低八位
receive_data=(receive_data<<8)+i2c_ReadByte();
i2c_NAck();
i2c_Stop();
return receive_data; //返回读取到的数据
}
//BH1750s上电
void BH1750_Power_ON(void)
{
BH1750_Byte_Write(POWER_ON);
}
//BH1750s断电
void BH1750_Power_OFF(void)
{
BH1750_Byte_Write(POWER_OFF);
}
//BH1750复位 仅在上电时有效
void BH1750_RESET(void)
{
BH1750_Byte_Write(MODULE_RESET);
}
//BH1750初始化
void BH1750_Init(void)
{
I2C_BH1750_GPIOConfig();
BH1750_Power_ON(); //BH1750s上电
//BH1750_RESET(); //BH1750复位
BH1750_Byte_Write(Measure_Mode);
//SysTick_Delay_ms(120);
}
//获取光照强度
float LIght_Intensity(void)
{
return (float)(BH1750_Read_Measure()/1.1f*Resolurtion);
}
函数bh1750.h
#ifndef __BH1750_H #define __BH1750_H #include "sys.h" //BH1750的地址 #define BH1750_Addr 0x46 //BH1750指令码 #define POWER_OFF 0x00 #define POWER_ON 0x01 #define MODULE_RESET 0x07 #define CONTINUE_H_MODE 0x10 #define CONTINUE_H_MODE2 0x11 #define CONTINUE_L_MODE 0x13 #define ONE_TIME_H_MODE 0x20 #define ONE_TIME_H_MODE2 0x21 #define ONE_TIME_L_MODE 0x23 //测量模式 #define Measure_Mode CONTINUE_H_MODE //分辨率 光照强度(单位lx)=(High Byte + Low Byte)/ 1.2 * 测量精度 #if ((Measure_Mode==CONTINUE_H_MODE2)|(Measure_Mode==ONE_TIME_H_MODE2)) #define Resolurtion 0.5 #elif ((Measure_Mode==CONTINUE_H_MODE)|(Measure_Mode==ONE_TIME_H_MODE)) #define Resolurtion 1 #elif ((Measure_Mode==CONTINUE_L_MODE)|(Measure_Mode==ONE_TIME_L_MODE)) #define Resolurtion 4 #endif #define BH1750_I2C_WR 0 #define BH1750_I2C_RD 1 #define BH1750_GPIO_PORT_I2C GPIOB #define BH1750_RCC_I2C_PORT RCC_APB2Periph_GPIOB #define BH1750_I2C_SCL_PIN GPIO_Pin_10 #define BH1750_I2C_SDA_PIN GPIO_Pin_11 #if 0 #define BH1750_I2C_SCL_1() GPIO_SetBits(BH1750_GPIO_PORT_I2C, BH1750_I2C_SCL_PIN) #define BH1750_I2C_SCL_0() GPIO_ResetBits(BH1750_GPIO_PORT_I2C, BH1750_I2C_SCL_PIN) #define BH1750_I2C_SDA_1() GPIO_SetBits(BH1750_GPIO_PORT_I2C, BH1750_I2C_SDA_PIN) #define BH1750_I2C_SDA_0() GPIO_ResetBits(BH1750_GPIO_PORT_I2C, BH1750_I2C_SDA_PIN) #define BH1750_I2C_SDA_READ() GPIO_ReadInputDataBit(BH1750_GPIO_PORT_I2C, BH1750_I2C_SDA_PIN) #else #define BH1750_I2C_SCL_1() BH1750_GPIO_PORT_I2C->BSRR = BH1750_I2C_SCL_PIN #define BH1750_I2C_SCL_0() BH1750_GPIO_PORT_I2C->BRR = BH1750_I2C_SCL_PIN #define BH1750_I2C_SDA_1() BH1750_GPIO_PORT_I2C->BSRR = BH1750_I2C_SDA_PIN #define BH1750_I2C_SDA_0() BH1750_GPIO_PORT_I2C->BRR = BH1750_I2C_SDA_PIN #define BH1750_I2C_SDA_READ() ((BH1750_GPIO_PORT_I2C->IDR & BH1750_I2C_SDA_PIN) != 0) #endif void i2c_Start(void); void i2c_Stop(void); void i2c_SendByte(uint8_t _ucByte); uint8_t i2c_ReadByte(void); uint8_t i2c_WaitAck(void); void i2c_Ack(void); void i2c_NAck(void); uint8_t i2c_CheckDevice(uint8_t _Address); void BH1750_Init(void); //未包含IIC初始化 float LIght_Intensity(void); //读取光照强度的值 uint8_t BH1750_Byte_Write(uint8_t data); uint16_t BH1750_Read_Measure(void); void BH1750_Power_ON(void); void BH1750_Power_OFF(void); void BH1750_RESET(void); #endif
主函数main.c
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "oled.h"
#include "bmp.h"
#include "dht11.h"
#include "bh1750.h"
u8 temperature =0;
u8 humidity = 0;
float Light = 0; //光照度
int main(void)
{
u8 t =0;
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化与按键连接的硬件接口
OLED_Init(); //初始化与OLED显示屏
OLED_Clear(); //清楚屏幕
DHT11_Init(); //初始化DHT11
BH1750_Init(); //初始化BH1750
while(1)
{
if(t%10==0) //每100ms读取一次
{
DHT11_Read_Data(&temperature,&humidity); //读取温湿度值
if (!i2c_CheckDevice(BH1750_Addr))
{
Light = LIght_Intensity(); //获取光照强度
}
}
delay_ms(10);
t++;
//OLED显示文字 "温度:"
OLED_ShowCHinese(0,3,7);//温
OLED_ShowCHinese(18,3,8);//度
OLED_ShowString(40,4,":",26);//:
OLED_ShowNum(50,3,temperature,2,16);//显示ASCII字符的码值
//OLED显示文字 "湿度:"
OLED_ShowCHinese(0,6,9);//湿
OLED_ShowCHinese(18,6,8);//度
OLED_ShowString(40,7,":",26);//:
OLED_ShowNum(50,6,humidity,2,16);//显示ASCII字符的码值
//OLED显示文字 "光照强度"
OLED_ShowCHinese(0,0,10);//光
OLED_ShowCHinese(15,0,11);//照
OLED_ShowCHinese(30,0,12);//强
OLED_ShowCHinese(45,0,13);//度
OLED_ShowString(60,1,":",36);//:
OLED_ShowNum(75,0,Light,2,16);//显示ASCII字符的码值
if(Light<50)//光照强度小于50,LED1灯亮
{
LED1 = 0;
}
else
{
LED1=1;
}
}
}
6、结果显示
7、备注:
- 本文章是个人总结,如有错误请指正;
- 部分资料来源于网络和开发手册,如有侵权请联系我删除;
- 如需上方资料,请与我联系。



