这里用到的是BH1750
https://docs.m5stack.com/en/hat/hat_dlight
本文分三部分,1、介绍BH1750,2、ESP32 读取BH1750数据串口打印。3、ESP32 读取BH1750数据屏幕显示。
一、BH1750介绍如下。
BH1750 是一种数字光强传感器,用于测量环境光的照度(Lux),广泛应用于智能照明、手机自动亮度调节、环境监测等领域。它由罗姆 (ROHM) 生产,具有高灵敏度和宽测量范围的特点,适用于不同的光照环境。
BH1750 可测量 1 到 65535 Lux 的光照强度,适应暗光和强光环境。这使其适用于室内外环境监测。
BH1750 提供多种工作模式,可以根据需要选择不同的分辨率和功耗:
连续高分辨率模式 (1lx 分辨率)
连续高分辨率模式 2 (0.5lx 分辨率)
连续低分辨率模式 (4lx 分辨率)
一次性高分辨率模式 (在测量一次后进入待机状态)
一次性高分辨率模式 2
一次性低分辨率模式


BH1750 使用 IIC 接口进行通信,支持标准的 SDA(数据)和 SCL(时钟)引脚。默认 I²C 地址为 0x23。
二、ESP32 -S3 读取BH1750数据
#include <M5Unified.h>
#include <M5_DLight.h>
M5GFX display;
M5_DLight sensor;
uint16_t lux;
void setup() {
auto cfg = M5.config();
cfg.output_power = false;
M5.begin(cfg);
Serial.begin(115200);
Serial.println("Sensor begin.....");
sensor.begin();
sensor.setMode(CONTINUOUSLY_H_RESOLUTION_MODE);
}
void loop() {
lux = sensor.getLUX();
Serial.print("lux: ");
Serial.println(lux);
delay(100);
}
三、屏幕显示光强度数据
#include <M5Unified.h>
#include <M5_DLight.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7789.h>
// 显示屏和传感器设置
#define TFT_CS 7 // CS 引脚
#define TFT_DC 39 // DC 引脚
#define TFT_RST 40 // RESET 引脚
#define TFT_BACKLIGHT 45 // 背光控制引脚
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
M5_DLight sensor;
const int buttonA_PIN = 12; // 按钮 A 引脚
const int buttonB_PIN = 13; // 按钮 B 引脚
uint16_t lux; // 光照强度变量
void setup() {
// 初始化 M5 和传感器
auto cfg = M5.config();
cfg.output_power = false;
M5.begin(cfg);
Serial.begin(115200);
Serial.println("Sensor begin.....");
sensor.begin();
sensor.setMode(CONTINUOUSLY_H_RESOLUTION_MODE);
// 初始化显示屏
pinMode(TFT_BACKLIGHT, OUTPUT);
digitalWrite(TFT_BACKLIGHT, HIGH); // 打开背光
tft.init(135, 240);
tft.setRotation(0);
tft.fillScreen(ST77XX_BLACK);
// 初始化按钮引脚
pinMode(buttonA_PIN, INPUT_PULLUP);
pinMode(buttonB_PIN, INPUT_PULLUP);
}
void loop() {
// 获取光照强度数据
lux = sensor.getLUX();
// 读取按钮状态
int buttonA_state = digitalRead(buttonA_PIN);
int buttonB_state = digitalRead(buttonB_PIN);
// 清空屏幕
tft.fillScreen(ST77XX_BLACK);
tft.setTextColor(ST77XX_WHITE);
tft.setCursor(10, 10);
tft.setTextSize(2);
// 显示按钮状态或光强数据
if (buttonA_state == LOW && buttonB_state == LOW) { // 同时按下
tft.print("Button 1 & 2 Pressed");
} else if (buttonA_state == LOW) { // 按下按钮 A
tft.print("Button 1 Pressed");
} else if (buttonB_state == LOW) { // 按下按钮 B
tft.print("Button 2 Pressed");
} else { // 没有按下时显示光照强度
tft.print("lux: ");
tft.print(lux);
Serial.print("lux: ");
Serial.println(lux);
}
delay(100); // 1 秒更新一次
}


最后两张图照片里面不明显,2380是强光手电筒强光模式。
564是弱光模式。
我要赚赏金
