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 显示效果
我要赚赏金
