目录
1、BH1750简介
BH1750是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化。BH1750的内部由光敏二极管、运算放大器、ADC采集、晶振等组成。对应广泛的输入光范围(相当于1-65535lx),最小误差变动在土20%,而且受红外线影响很小。
1、采用ROHM原装BH1750FVI芯片
2、光照度范围: 0-655351x,传感器内置16bitAD转换器直接数字输出,省略复杂计算)省略标定
3、内部包含通信电平转换,与5V单片机I0连接,支持STM32/51/ardunio
4、XH2.54接口连接线,方便客户DIY
5、小体积,广泛应用于室内光照检测、蔬菜、苗圃、温室大棚
2、具体参数
采用ROHM原装BH1750FVI芯片
供电电源: 3-5v
数据范围: 0-65535lx
传感器内置16bitAD转换器
直接数字输出,省略复杂的计算,省略标定
不区分环境光源,接近于视觉灵敏度的分光特性
可对广泛的亮度进行1勒克斯的高精度测定
标准NXP 1IC通信协议
模块内部包含通信电平转换,与5v单片机IO直接连接
3、光强驱动代码
BH1750.文件
#include "BH1750.h"
#include "delay.h"
uint8_t BH1750_Buf[8];
int dis_data;
//*********************************************************
//
//lѸׁԶBH1750Śҿ˽ߝ
//
//*********************************************************
void Multiple_read_BH1750(void)
{
uint8_t i;
BH1750_IIC_start();
BH1750_IIC_write_byte(BH1750_Rd);
for (i=0; i<3; i++)
{
BH1750_Buf[i] = BH1750_IIC_read_byte();
if (i == 3)
{
BH1750_IIC_NACK();
}
else
{
BH1750_IIC_ACK();
}
}
BH1750_IIC_stop();
Delay_ms(5);
}
//*********************************
void Single_Write_BH1750(uint8_t REG_Address)
{
BH1750_IIC_start();
BH1750_IIC_write_byte(BH1750_Wr);
BH1750_IIC_write_byte(REG_Address);
// BH1750_SendByte(REG_data);
BH1750_IIC_stop();
}
//Եʼۯ
void BH1750_Init(void)
{
Single_Write_BH1750(0x01);
}
//ׁȡ˽ߝҢԦmܘ
float BH1750_Read_Data(void)
{ //}ɧς2251,Ϊ22.51ʣˏìʪ30211ìΪ30.211%
Single_Write_BH1750(0x01);
Single_Write_BH1750(0x10);
Delay_ms(180);
Multiple_read_BH1750();
dis_data=BH1750_Buf[0];
dis_data=(dis_data<<8)+BH1750_Buf[1];
BH1750_temp=(float)dis_data/1.2;
return BH1750_temp;
}
BH1750_IIC.c文件
#include "BH1750_IIC.h"
#include "delay.h"
#define IIC_D 6
void BH1750_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN | IIC_SCL_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void SDA_Pin_IN(void) //SDA
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void SDA_Pin_Output(void) //
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void BH1750_IIC_Delay()
{
Delay_us(IIC_D);
}
/*
*@brief IICПԵʼۯگ˽
*@param[in] NULL
*@author MrWeng
*@date 2020-8-10
*/
void BH1750_IIC_Init(void)
{
IIC_SDA_H;
IIC_SCL_H;
BH1750_IIC_Delay();
}
void BH1750_IIC_start(void)
{
IIC_SDA_H;//-ٟ
IIC_SCL_H;
BH1750_IIC_Delay();
IIC_SDA_L;
IIC_SCL_L;
BH1750_IIC_Delay();
}
void BH1750_IIC_stop(void)
{
IIC_SCL_H;
IIC_SDA_L;
BH1750_IIC_Delay();
IIC_SDA_H;
IIC_SCL_L;
BH1750_IIC_Delay();
}
uint8_t BH1750_IIC_Get_ack(void)
{
uint16_t CNT;
SDA_Pin_IN();
IIC_SCL_L;
IIC_SCL_H;
BH1750_IIC_Delay();
while((IIC_SDA_Read) && (CNT < 100) )
{
CNT++;
if(CNT == 100)
{
return 0;
}
}
IIC_SCL_L;
BH1750_IIC_Delay();
SDA_Pin_Output();
return 1;
}
void BH1750_IIC_ACK(void)
{
IIC_SDA_L;
IIC_SCL_H;
BH1750_IIC_Delay();
IIC_SCL_L;
BH1750_IIC_Delay();
}
void BH1750_IIC_NACK(void)
{
IIC_SDA_H;
IIC_SCL_H;
BH1750_IIC_Delay();
IIC_SCL_L;
}
void BH1750_IIC_write_byte(uint8_t Data)
{
uint8_t i;
for(i=0;i<8;i++)
{
if((Data & 0x80) == 0x80)
{
IIC_SDA_H;
}
else
{
IIC_SDA_L;
}
IIC_SCL_H;
BH1750_IIC_Delay();
IIC_SCL_L;
BH1750_IIC_Delay();
Data = Data << 1;
}
IIC_SDA_L;
BH1750_IIC_Get_ack();
}
uint8_t BH1750_IIC_read_byte(void)
{
uint8_t i;
uint8_t Data = 0;
SDA_Pin_IN();
IIC_SCL_L; //Ј-֍ʱדП
IIC_SDA_H; //ՙ-ٟ˽ߝП
BH1750_IIC_Delay();
for(i = 0;i < 8;i++)
{
Data = Data<<1;
IIC_SCL_H;
BH1750_IIC_Delay();
if(IIC_SDA_Read)
{
Data = Data|0x01;
}
IIC_SCL_L;
BH1750_IIC_Delay();
}
SDA_Pin_Output();
return Data;
}
4.串口打印数据
5、源代码
《STM32单片机+BH1750光照强度传感器+OLED屏幕+蜂鸣器报警+光强数据发送到串口调试助手》源代码资源-CSDN文库