这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 进阶任务1、设计图形菜单实现通过按键进入不同的测光模式

共3条 1/1 1 跳转至

进阶任务1、设计图形菜单实现通过按键进入不同的测光模式

菜鸟
2024-11-02 19:55:40     打赏

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/





关键词: 电子     测光     测光模式    

专家
2024-11-03 04:19:00     打赏
2楼

看看


专家
2024-11-03 20:21:24     打赏
3楼

感谢分享


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]