一 、功能开发
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");
}串口效果

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(" %");
}
}实际效果

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:"));
}下图为使用光照去晃可以看到串口会有真实的数据变化

二 、 功能代码结合
重新梳理代码结构
电池信息检测功能
#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); // 每秒更新
}项目最终效果展示视频
我要赚赏金
