BH1750是一款环境光照强度检测器件,它是以I2C接口来工作。相较于I2C接口的OLED屏驱动来说,它会稍微复杂些。因为OLED屏的显示驱动,只是以输出模式来发送数据,而BH1750则是既要发送数据,又要接收数据,需在不同的时段进行相应的模式切换。
BH1750所使用的引脚为:
GPIO11---SCK
GPIO13---SIN
#define IIC_SDA_IN gpio_get_level(SDA1_GPIO)
设置BH1750为输入模式的函数为:
staticvoid IIC_INPUT_MODE(void)
{
gpio_reset_pin(SDA1_GPIO);
gpio_set_direction(SDA1_GPIO, GPIO_MODE_OUTPUT);
}
设置BH1750为输出模式的函数为:
staticvoid IIC_OUTPUT_MODE(void)
{
gpio_reset_pin(SDA1_GPIO);
gpio_set_direction(SDA1_GPIO, GPIO_MODE_INPUT);
}
BH1750发送字节数据的函数为:
void BH1750_SendByte(char data)
{
char i;
IIC_OUTPUT_MODE();
SCL1_low;
del_us(5);
for (i=0;i<8;i++)
{
if(data&0x80) SDA1_high;
else SDA1_low;
data <<= 1;
SCL1_high;
del_us(5);
SCL1_low;
del_us(5);
}
}
BH1750接收字节数据的函数为:
char BH1750_RecvByte(void)
{
char i;
char data = 0;
IIC_INPUT_MODE();
for (i=0;i<8;i++)
{
SCL1_low;
del_us(5);
SCL1_high;
data <<= 1;
SCL1_high;
if(IIC_SDA_IN) data|=0x01;
del_us(5);
}
SCL1_low;
return data;
}
实现光强显示的函数为:
void Get_Sunlight_Value(void)
{
int dis_data=0;
float temp;
unsigned int sd;
Single_Write_BH1750(0x01);
Single_Write_BH1750(0x10);
vTaskDelay(20);
Multiple_Read_BH1750();
dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1];
temp=(float) dis_data/1.2;
sd=temp;
OLED_ShowNum(0,6,sd,5,16);
}
环境光照强度检测的主程序为:
void app_main(void)
{
configure_led();
configure_Oled();
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"ESP32-S2-Kaluga",16);
OLED_ShowString(16,2,"OLED & BH1750",16);
OLED_ShowString(0,4,"Sunlight=",16);
OLED_ShowString(48,6,"lx",16);
BH1750_Init();
while (1) {
blink_led();
s_led_state = !s_led_state;
vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);
Get_Sunlight_Value();
}
}
经程序的编译和下载,其检测效果如图1和图2所示。
图1 常规检测
图2 遮光检测
|