BH1750 是一种采用I2C串行总线接口的数字型光强度传感器集成电路。它的高分辨率可以探测较大范围的光强度变化。它的输出结果为光强单位:勒克斯lx。
本次学习使用现成的模块,
实验中,使用面包板组建相关模块电路
为了方便测试,依旧使用ESP8266模块在Arduino开发环境下进行开发、测试。ESP8266提供了一组以D1(GPIO5)和D2(GPIO4)为I2C的接口,因为系统中使用这个接口兼顾OLED显示以及BH1750的数据采集,所以使用TCA9548A拓展了这个I2C接口。为了完成快速测试,直接使用了库支持,
源代码如下:
/* * ESP8266通过TCA9548A驱动OLED和BH1750 */ #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include "TCA9548A.h" #include <BH1750.h> #define TCA9548_ADDR 0x70 #define TCA9548_RESET 16 #define OLED_ADDR 0x3C #define BH1750_ADDR 0x23 TCA9548A I2CMux; BH1750 bh1750; // 声明光检测用变量:TEMT6000用 // ADC的输入口,ESP8266只有一个ADC输入口:A0 int sensorPin = A0; // ADC转换结果 int sensorValue = 0; // 接线备注:SCL(GPIO5---D1), SDA(GPIO4---D2) // 分辨率: 128 * 32 像素单位 // 使用Wire默认总线:SCL(D1) - GPIO5 ; SDA(D2) - GPIO4 Adafruit_SSD1306 oled(128, 32, &Wire, -1); uint8_t cnt = 0; // BH1750的监测数据 uint16_t bh1750Value=0; void setup() { // 初始化串口 Serial.begin(115200); // 实际悬空,不接也没问题 pinMode(TCA9548_RESET, OUTPUT); // 初始化TCA9548A I2CMux.begin(Wire); I2CMux.closeAll(); // 初始化OLED,第2通道 I2CMux.openChannel(2); oled.begin(SSD1306_SWITCHCAPVCC,0x3C); oled.setTextColor(WHITE);//开像素点发光 oled.setTextSize(1);//设置字体大小 oled.clearDisplay();//清屏 oled.display(); // 开显示 I2CMux.closeChannel(2); // 初始化BH1750,第7通道 I2CMux.openChannel(7); bh1750.begin(); I2CMux.closeChannel(7); delay(200); } void loop() { // 获得ADC转换结果(TEMT6000) sensorValue = analogRead(sensorPin); // 选择第7通道,读取BH1750的测试数据 I2CMux.openChannel(7); bh1750Value = bh1750.readLightLevel(); I2CMux.closeChannel(7); // 选择第2通道 I2CMux.openChannel(2); oled.clearDisplay();//清屏 oled.setCursor(0, 0);//设置显示位置 oled.print("TEMT6000 : "); oled.print(sensorValue); oled.setCursor(0, 8);//设置显示位置 oled.print("BH1750 : "); oled.print(bh1750Value); oled.print(" LX"); oled.display(); // 开显示 I2CMux.closeChannel(2); delay(100); }
作为对比,电路中引入了TEMT6000光传感器。实际测试中,当用强光手电筒照射时,TEMT6000轻易就到达了上限,ADC结果为1024;而BH1750的数据则显示为54612,不知道是不是已经达到上限,这个数据使用的是BH1750库默认的设置。从效果上看,BH1750比TEMT6000的测量效果更好,精度更高。