这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 电子测光表成果贴,视频展示

共7条 1/1 1 跳转至

电子测光表成果贴,视频展示

菜鸟
2024-12-10 10:31:18     打赏

一 、功能开发


1.1 按键功能


按下按键TFT屏幕显示反馈

购买的模块有两个按键,红色和蓝色

我们直接调用库文件驱动LCD

绘制两个圆形(红色-蓝色),默认情况下为绿色,按下翻转

使用串口将按键状态发出来,这样方便我们调试



#include <Adafruit_GFX.h>    // 核心图形库
#include <Adafruit_ST7789.h> // 针对ST7789的硬件特定库
#include <SPI.h>             // 包含SPI通信库
// 定义按键引脚
#define BUTTON1_PIN 18  // 按键1连接在GPIO 18
#define BUTTON2_PIN 17  // 按键2连接在GPIO 17
// 圆形位置和大小
#define CIRCLE1_X 70                  // 圆形1 X 坐标
#define CIRCLE1_Y 80                  // 圆形1 Y 坐标
#define CIRCLE2_X 170                 // 圆形2 X 坐标
#define CIRCLE2_Y 80                  // 圆形2 Y 坐标
#define RADIUS 30                     // 圆形半径
// 按键去抖动延迟时间(毫秒)
#define DEBOUNCE_DELAY 20
unsigned long lastDebounceTime1 = 0;  // 按键1去抖时间
unsigned long lastDebounceTime2 = 0;  // 按键2去抖时间
// 初始化显示屏对象
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
// 按键状态
int lastButton1State = HIGH;  // 按键1的上一次状态
int lastButton2State = HIGH;  // 按键2的上一次状态
// 圆形颜色状态标志
bool isCircle1Red = false;    // 圆形1颜色状态(红色/绿色)
bool isCircle2Blue = false;   // 圆形2颜色状态(蓝色/绿色)
void setup() {
  Serial.begin(115200);
  while (!Serial);
  // 初始化屏幕背光和电源
  pinMode(TFT_BACKLITE, OUTPUT);
  digitalWrite(TFT_BACKLITE, HIGH);
  pinMode(TFT_I2C_POWER, OUTPUT);
  digitalWrite(TFT_I2C_POWER, HIGH);
  delay(10);
  // 初始化屏幕
  tft.init(135, 240); // 确保分辨率与屏幕匹配
  tft.setRotation(3); // 根据需要调整屏幕方向
  tft.fillScreen(ST77XX_WHITE); // 清屏为白色
  // 绘制默认圆形
  drawDefaultCircles();
}
void loop() {
  // 按键1的去抖处理
  handleButtonState(BUTTON1_PIN, lastButton1State, lastDebounceTime1, toggleCircle1Color);
  // 按键2的去抖处理
  handleButtonState(BUTTON2_PIN, lastButton2State, lastDebounceTime2, toggleCircle2Color);
}
// 通用按键处理函数
void handleButtonState(int buttonPin, int &lastButtonState, unsigned long &lastDebounceTime, void (*toggleColor)()) {
  int buttonState = digitalRead(buttonPin);
  unsigned long currentTime = millis();
  if (buttonState == LOW && (currentTime - lastDebounceTime) > DEBOUNCE_DELAY) {
    if (lastButtonState == HIGH) {
      toggleColor(); // 触发对应的颜色切换函数
    }
    lastDebounceTime = currentTime;
  }
  lastButtonState = buttonState; // 保存当前按键状态
}
// 绘制默认的圆形
void drawDefaultCircles() {
  // 绘制圆形1
  tft.fillCircle(CIRCLE1_X, CIRCLE1_Y, RADIUS, isCircle1Red ? ST77XX_RED : ST77XX_GREEN);
  // 绘制圆形2
  tft.fillCircle(CIRCLE2_X, CIRCLE2_Y, RADIUS, isCircle2Blue ? ST77XX_BLUE : ST77XX_GREEN);
}
// 翻转圆形1的颜色
void toggleCircle1Color() {
  isCircle1Red = !isCircle1Red;
  tft.fillCircle(CIRCLE1_X, CIRCLE1_Y, RADIUS, isCircle1Red ? ST77XX_RED : ST77XX_GREEN);
  Serial.println("Circle 1 Color Toggled");
}
// 翻转圆形2的颜色
void toggleCircle2Color() {
  isCircle2Blue = !isCircle2Blue;
  tft.fillCircle(CIRCLE2_X, CIRCLE2_Y, RADIUS, isCircle2Blue ? ST77XX_BLUE : ST77XX_GREEN);
  Serial.println("Circle 2 Color Toggled");
}


串口效果


image-20241209233528040.png

1.2 板载 MAX17048 电池检测功能


将电池检测芯片检测到的电压以及电压百分比从串口发出来

#include <Wire.h>                 // 包含I2C通信库
#include "Adafruit_MAX1704X.h"    // 电池管理芯片MAX17048的库
// 初始化电池管理芯片对象
Adafruit_MAX17048 lipo;
// 电池信息更新时间间隔(1秒)
const unsigned long batteryRefreshInterval = 1000;
unsigned long lastBatteryRefreshTime = 0;
void setup() {
    Serial.begin(115200); // 初始化串口通信,波特率为115200
    while (!Serial);      // 等待串口连接
    // 初始化电池管理芯片
    if (!lipo.begin()) {
        Serial.println(F("Couldn't find Adafruit MAX17048!")); // 如果初始化失败,输出错误信息
        while (1); // 停止程序运行
    } else {
        Serial.println(F("MAX17048 found!")); // 初始化成功
    }
}
void loop() {
    // 检查是否超过刷新间隔
    if (millis() - lastBatteryRefreshTime >= batteryRefreshInterval) {
        lastBatteryRefreshTime = millis(); // 更新上次刷新时间
        // 获取电池信息
        float voltage = lipo.cellVoltage(); // 获取电池电压
        int percent = lipo.cellPercent();   // 获取电池电量百分比
        // 通过串口发送电池信息
        Serial.print("Voltage: ");
        Serial.print(voltage, 2);
        Serial.print(" V, Percent: ");
        Serial.print(percent);
        Serial.println(" %");
    }
}

实际效果

image-20241209230554607.png

1.3 BH1750光照传感器驱动


首先下载一个bh1750的库文件,如上面的方法一样

然后电路引脚接入ESP32的IIC排针

程序调用库

将数据拿出来

最后量化

#include <Adafruit_GFX.h>         // 核心图形库,用于处理图形绘制
#include <Adafruit_ST7789.h>      // 针对ST7789显示屏的硬件特定库
#include <SPI.h>                  // SPI通信库,用于与显示屏通信
#include <Wire.h>                 // I2C通信库,用于与传感器通信
#include "hp_BH1750.h"            // BH1750光照传感器的库
// 初始化ST7789显示屏对象,使用硬件SPI接口
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
// 初始化光照传感器
hp_BH1750 lightSensor;
// 放大模式标志
bool isMagnified = false; // 是否处于光照强度的放大显示模式
// 光照量化范围定义
const float luxMin = 0.0;      // 光照强度最小值
const float luxMax = 27306.2;  // 光照强度最大值
// 刷新时间间隔定义
const unsigned long luxRefreshInterval = 100;      // 光照信息刷新间隔(100毫秒)
unsigned long lastLuxRefreshTime = 0;              // 光照刷新上次时间
void setup() {
    Serial.begin(115200); // 初始化串口通信,波特率为115200
    while (!Serial);      // 等待串口连接
    // 设置TFT背光和I2C电源引脚,并将其置为高电平
    pinMode(TFT_BACKLITE, OUTPUT);
    digitalWrite(TFT_BACKLITE, HIGH);
    pinMode(TFT_I2C_POWER, OUTPUT);
    digitalWrite(TFT_I2C_POWER, HIGH);
    delay(10);
    // 初始化ST7789显示屏
    tft.init(135, 240);   // 设置分辨率为135x240
    tft.setRotation(3);   // 设置屏幕方向
    tft.fillScreen(ST77XX_WHITE); // 清屏为白色
    // 初始化光照传感器
    if (!lightSensor.begin(BH1750_TO_GROUND)) {
        Serial.println(F("Couldn't find BH1750 sensor!"));
        while (1); // 停止运行
    }
    drawLabels();         // 显示标签
}
void loop() {
    // 更新光照强度信息
    updateLightSensor();
}
// 光照信息更新函数
void updateLightSensor() {
    // 检查是否超过刷新间隔
    if (millis() - lastLuxRefreshTime >= luxRefreshInterval) {
        lastLuxRefreshTime = millis(); // 更新上次刷新时间
        if (lightSensor.hasValue()) {
            float lux = lightSensor.getLux(); // 获取光照强度
            float luxPercentage = mapLuxToPercentage(lux); // 将光照强度映射为百分比
            Serial.print("Lux: ");
            Serial.print(lux);
            Serial.println(" lx");
            // 如果光照强度高于阈值,进入放大模式
            if (lux > 273.062) {
                if (!isMagnified) {
                    clearScreenForMagnification(); // 清屏,准备放大模式
                    isMagnified = true;
                }
                tft.fillRect(80, 50, 120, 30, ST77XX_WHITE);
                tft.setCursor(80, 50);
                tft.setTextSize(3);
                tft.setTextColor(ST77XX_RED);
                tft.print(luxPercentage, 1);
                tft.print(F("%"));
            } else { // 光照强度低于阈值,恢复正常模式
                if (isMagnified) {
                    tft.fillScreen(ST77XX_WHITE); // 清屏
                    drawLabels();                 // 重新绘制标签
                    isMagnified = false;
                }
                tft.fillRect(120, 30, 60, 10, ST77XX_WHITE);
                tft.setCursor(120, 30);
                tft.setTextSize(1);
                tft.setTextColor(ST77XX_BLACK);
                tft.print(luxPercentage, 1);
                tft.print(F("%"));
            }
            lightSensor.start(); // 启动下一次光照测量
        }
    }
}
// 清屏并准备放大模式
void clearScreenForMagnification() {
    tft.fillScreen(ST77XX_WHITE); // 清空整个屏幕
}
// 光照强度映射为百分比
float mapLuxToPercentage(float lux) {
    return (lux <= luxMin) ? 0.0 : (lux >= luxMax ? 100.0 : (lux - luxMin) / (luxMax - luxMin) * 100.0);
}
// 绘制默认标签
void drawLabels() {
    tft.setTextColor(ST77XX_BLACK);
    tft.setTextSize(1);
    tft.setCursor(10, 30);
    tft.print(F("Light Intensity:"));
}


下图为使用光照去晃可以看到串口会有真实的数据变化

image-20241210091037702.png


二 、 功能代码结合


重新梳理代码结构

电池信息检测功能


#include "Adafruit_MAX1704X.h" // 电池管理芯片库
Adafruit_MAX17048 lipo;
void setup() {
    Serial.begin(115200);
    while (!Serial);
    // 初始化电池芯片
    if (!lipo.begin()) {
        Serial.println(F("Couldn't find Adafruit MAX17048!"));
    } else {
        Serial.println(F("Battery monitor initialized."));
    }
}
void loop() {
    float voltage = lipo.cellVoltage(); // 获取电池电压
    int percent = lipo.cellPercent();   // 获取电池电量百分比
    Serial.print("Voltage: ");
    Serial.print(voltage, 2);
    Serial.print(" V, Percent: ");
    Serial.print(percent);
    Serial.println(" %");
    delay(1000); // 每秒更新一次
}
```
- 光照传感器功能
```C
#include <Wire.h>              // I2C通信库
#include "hp_BH1750.h"         // BH1750光照传感器库
hp_BH1750 lightSensor;
void setup() {
    Serial.begin(115200);
    while (!Serial);
    // 初始化光照传感器
    if (!lightSensor.begin(BH1750_TO_GROUND)) {
        Serial.println(F("Couldn't find BH1750 sensor!"));
    } else {
        Serial.println(F("Light sensor initialized."));
    }
}
void loop() {
    if (lightSensor.hasValue()) {
        float lux = lightSensor.getLux(); // 获取光照强度
        Serial.print("Lux: ");
        Serial.print(lux, 2);
        Serial.println(" lx");
    }
    delay(500); // 每半秒更新一次
}
```
- 按键交互功能
```C
#define BUTTON1_PIN 18 // 按键1引脚
#define BUTTON2_PIN 17 // 按键2引脚
int lastButton1State = HIGH, lastButton2State = HIGH;
void setup() {
    Serial.begin(115200);
    pinMode(BUTTON1_PIN, INPUT_PULLUP); // 初始化按键1
    pinMode(BUTTON2_PIN, INPUT_PULLUP); // 初始化按键2
}
void loop() {
    int button1State = digitalRead(BUTTON1_PIN);
    int button2State = digitalRead(BUTTON2_PIN);
    if (button1State == LOW && lastButton1State == HIGH) {
        Serial.println("Button 1 Pressed");
    }
    if (button2State == LOW && lastButton2State == HIGH) {
        Serial.println("Button 2 Pressed");
    }
    lastButton1State = button1State;
    lastButton2State = button2State;
    delay(10); // 按键去抖
}


下面是一个简单的结合代码

光照和电池信息结合代码展示

#include <Wire.h>
#include "hp_BH1750.h"
#include "Adafruit_MAX1704X.h"
Adafruit_MAX17048 lipo;
hp_BH1750 lightSensor;
void setup() {
    Serial.begin(115200);
    while (!Serial);
    // 初始化电池芯片
    if (!lipo.begin()) {
        Serial.println(F("Couldn't find Adafruit MAX17048!"));
    }
    // 初始化光照传感器
    if (!lightSensor.begin(BH1750_TO_GROUND)) {
        Serial.println(F("Couldn't find BH1750 sensor!"));
    }
}
void loop() {
    // 电池信息
    float voltage = lipo.cellVoltage();
    int percent = lipo.cellPercent();
    Serial.print("Voltage: ");
    Serial.print(voltage, 2);
    Serial.print(" V, Percent: ");
    Serial.print(percent);
    Serial.println(" %");
    // 光照信息
    if (lightSensor.hasValue()) {
        float lux = lightSensor.getLux();
        Serial.print("Lux: ");
        Serial.print(lux, 2);
        Serial.println(" lx");
    }
    delay(1000); // 每秒更新
}



项目最终效果展示视频

完整功能展示.zip





关键词: 电子测光表成果贴     视频    

专家
2024-12-10 21:04:50     打赏
2楼

感谢分享


专家
2024-12-10 21:06:41     打赏
3楼

感谢分享


专家
2024-12-10 21:15:30     打赏
4楼

感谢分享


专家
2024-12-11 08:05:04     打赏
5楼

感谢分享


高工
2024-12-11 09:37:24     打赏
6楼

描述的比较详细


专家
2024-12-12 08:20:23     打赏
7楼

感谢分享


共7条 1/1 1 跳转至

回复

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