BH1750是一种光照强度传感器,它是以I2C接口进行工作,可以精确的数值来指示光照强度,其单位为lx。
相对于FireBeetle 2 ESP32-C5开发板来说,它有2个I2C接口可供使用,见图1所示。

图1 引脚排列及功能
为此,可将一组分配给OLED屏,一组分配给光照强度传感器,具体的硬件分配为:
OLED_SCLK----7
OLED_SDIN----6
BH1750_SCLK----10
BH1750_SDIN----9
为便于功能的实现,这里的OLED屏显示采用硬件方式,而光照强度传感器是采用软件模拟的方式。
对光照强度传感器的初识参数定义为:
#define SCLK_Pin 10
#define SDIN_Pin 9
#define SCL_Set digitalWrite(SCLK_Pin, HIGH)
#define SCL_Clr digitalWrite(SCLK_Pin, LOW)
#define SDA_Set digitalWrite(SDIN_Pin, HIGH)
#define SDA_Clr digitalWrite(SDIN_Pin, LOW)
#define IIC_SDA_IN digitalRead(SDIN_Pin)
#define IIC_WRITE 0
#define IIC_READ 1
#define SlaveAddress 0x46
unsigned char BUF[3];
对传感器所用引脚的配置函数为:
void BH1750_Init(void){
pinMode(SCLK_Pin, OUTPUT);
pinMode(SDIN_Pin, OUTPUT);
}将数据引脚配置为输入模式的函数为:
void IIC_INPUT_MODE_SET(){
pinMode(SDIN_Pin, INPUT);
}将数据引脚配置为输出模式的函数为:
void IIC_OUTPUT_MODE_SET(){
pinMode(SDIN_Pin, OUTPUT);
}实现字节数据方式的函数为:
void BH1750_SendACK(char ack){
IIC_OUTPUT_MODE_SET();
SCL_Clr;
if(ack)
{
SDA_Set;
}
else
{
SDA_Clr;
}
delayMicroseconds(2);
SCL_Set;
delayMicroseconds(2);
SCL_Clr;
}在连接OLED屏的情况下,实现光照强度检测及显示的函数为:
void Get_Sunlight_Value(){
int dis_data=0;
float temp;
char i=0;
unsigned int sd;
Single_Write_BH1750(0x01);
Single_Write_BH1750(0x10);
delay(180);
Multiple_Read_BH1750();
for(i=0;i<3;i++) dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1];
temp=(float)dis_data/1.2;
sd=temp;
Serial.println(sd);
display.clear();
display.drawString(0, 20, "light=");
display.drawString(60, 20, String(sd));
display.display();
}进行检测的主程序为:
void setup() {
BH1750_Init();
display.init();
display.flipScreenVertically();
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_16);
}
void loop() {
Get_Sunlight_Value();
delay(1000);
}经程序的上传,其测试效果如图2所示。

图2 显示效果
上面介绍了以模拟I2C的方式进行光照强度检测,由于在Arduino IDE环境下,是有BH1750库支持的,故可以在库的支持下进行光照强度检测。
首先是搜寻和下载该支持库,然后在串口通讯功能的配合下来输出测试结果,其测试程序为:

经程序的上传,其测试结果如下图所示,说明测试成功。
要指出的是,从检测数据看似乎数据的一致性不高,其实正相反这恰恰说明了它的精准性,因为光照强度是在不断变换的,它则完全捕捉到了这个变换过程。

图3 测试结果
21

