一 、功能开发
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); // 每秒更新 }
项目最终效果展示视频