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的测量效果更好,精度更高。
我要赚赏金
