1、BH1750有6种测光模式
#define CONTINUOUSLY_H_RESOLUTION_MODE B00010000 #define CONTINUOUSLY_H_RESOLUTION_MODE2 B00010001 #define CONTINUOUSLY_L_RESOLUTION_MODE B00010011 #define ONE_TIME_H_RESOLUTION_MODE B00100000 #define ONE_TIME_H_RESOLUTION_MODE2 B00100001 #define ONE_TIME_L_RESOLUTION_MODE B00100011
这里需要设计菜单,来选择进入不同的测光模式。看下面的代码
#include <Adafruit_GFX.h> #include <Adafruit_ST7789.h> #include <Wire.h> #include <M5_DLight.h> // 使用 DLight 传感器库 // 显示屏和传感器设置 #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 引脚 // 测光模式 const char* modeNames[] = { "C-H Res", // Continuous High Resolution "C-H Res 2", // Continuous High Resolution 2 "C-L Res", // Continuous Low Resolution "1-T H Res", // One Time High Resolution "1-T H Res 2",// One Time High Resolution 2 "1-T L Res" // One Time Low Resolution }; byte modeValues[] = { CONTINUOUSLY_H_RESOLUTION_MODE, CONTINUOUSLY_H_RESOLUTION_MODE2, CONTINUOUSLY_L_RESOLUTION_MODE, ONE_TIME_H_RESOLUTION_MODE, ONE_TIME_H_RESOLUTION_MODE2, ONE_TIME_L_RESOLUTION_MODE }; int modeIndex = 0; // 当前测光模式索引 bool measuring = false; // 测光功能状态 // ISO 级别 int isoLevels[] = {100, 200, 300, 400, 500, 600}; int isoIndex = 0; int currentISO = isoLevels[isoIndex]; // EV 相关变量 float F; // 光圈 float T; // 快门速度 uint16_t lux; // 光照强度 void setup() { Serial.begin(115200); pinMode(TFT_BACKLIGHT, OUTPUT); digitalWrite(TFT_BACKLIGHT, HIGH); // 打开背光 // 初始化屏幕 tft.init(135, 240); // 根据屏幕分辨率初始化 tft.setRotation(3); // 设置屏幕方向 tft.fillScreen(ST77XX_BLACK); // 背景色设为黑色 // 按钮引脚设置为输入 pinMode(buttonA_PIN, INPUT_PULLUP); pinMode(buttonB_PIN, INPUT_PULLUP); // 初始化传感器 sensor.begin(); sensor.setMode(modeValues[modeIndex]); // 设置初始测光模式 } void loop() { // 更新按钮状态 if (digitalRead(buttonA_PIN) == LOW) { // 按下按钮 A 切换测光模式 modeIndex = (modeIndex + 1) % (sizeof(modeNames) / sizeof(modeNames[0])); sensor.setMode(modeValues[modeIndex]); // 更新测光模式 delay(200); // 防抖延时 } if (digitalRead(buttonB_PIN) == LOW) { // 按下按钮 B 进入/退出测光功能 measuring = !measuring; // 切换测光状态 delay(200); // 防抖延时 } // 如果处于测光状态,获取光照强度并计算参数 if (measuring) { lux = sensor.getLUX(); // 获取光照强度 float ev = 2 + log10(lux / 10.0); // 计算 EV 值 float evWithISO = ev - log2(currentISO / 100.0); // 根据 ISO 调整 EV 值 // 计算光圈和快门速度 T = pow(2, evWithISO - 2); // 初始光圈为 2.8,可根据需要调整 F = sqrt(pow(2, evWithISO) * T); } // 显示信息 tft.fillScreen(ST77XX_BLACK); tft.setTextColor(ST77XX_WHITE); tft.setCursor(10, 10); tft.setTextSize(2); if (measuring) { // 显示测光信息 tft.print("ISO: "); tft.println(currentISO); tft.setCursor(10, 40); tft.print("Lux: "); tft.println(lux); tft.setCursor(10, 70); tft.print("F: "); tft.println(F, 2); tft.setCursor(10, 100); tft.print("T: "); tft.println(T, 4); } else { // 显示菜单 tft.print("Mode: "); tft.println(modeNames[modeIndex]); tft.setCursor(10, 40); tft.print("Press B to start"); } delay(1000); // 1 秒更新一次 }
我设计的是通过2个按键,按键A切换测光模式,按键B进入测光模式和退出测光模式。
具体结果看下面的链接
https://www.bilibili.com/video/BV1oBSBYNE7o/