这里用到的是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是弱光模式。