STM32单片机+BH1750光照强度传感器+OLED屏幕+蜂鸣器报警+光强数据发送到串口调试助手+源代码

158 阅读4分钟

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、小体积,广泛应用于室内光照检测、蔬菜、苗圃、温室大棚

image.png

image.png

2、具体参数

采用ROHM原装BH1750FVI芯片 供电电源: 3-5v 数据范围: 0-65535lx 传感器内置16bitAD转换器 直接数字输出,省略复杂的计算,省略标定 不区分环境光源,接近于视觉灵敏度的分光特性 可对广泛的亮度进行1勒克斯的高精度测定 标准NXP 1IC通信协议 模块内部包含通信电平转换,与5v单片机IO直接连接

image.png

3、光强驱动代码

BH1750.文件

#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 "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.串口打印数据

image.png