Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。
Arduino的特点是:
1、开放源码:Arduino的硬件和软件都是开放源码的,你可以自由地修改、复制和分享它们。
2、易用:Arduino的硬件和软件都是为初学者和非专业人士设计的,你可以轻松地上手和使用它们。
3、便宜:Arduino的硬件和软件都是非常经济的,你可以用很低的成本来实现你的想法。
4、多样:Arduino有多种型号和版本,你可以根据你的需要和喜好来选择合适的Arduino板。
5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。
Arduino TFT 是指与 Arduino 开发板兼容的薄膜晶体管(Thin - Film - Transistor)液晶显示屏,以下是其主要特点、应用场景及注意事项的详细介绍:
一、主要特点
1、高分辨率显示:TFT 显示屏通常具有较高的分辨率,能够提供清晰、细腻的图像和文字显示效果。这使得它可以展示复杂的图形界面、丰富的色彩以及详细的信息,满足各种应用对显示质量的要求。
2、快速响应速度:TFT 技术能够实现快速的像素切换,响应速度比传统的液晶显示屏更快。这意味着在显示动态图像或进行交互操作时,不会出现明显的拖影或延迟,提供流畅的视觉体验。
3、宽视角:具有较宽的可视角度,无论从哪个方向观看显示屏,都能获得清晰的图像和一致的色彩表现。这使得在不同角度下观察显示屏时,都能保证信息的准确传达,方便多人同时查看或在不同位置操作设备。
4、丰富的色彩表现:能够呈现出丰富、鲜艳的色彩,具备较高的色彩饱和度和对比度。可以准确地显示各种颜色,使图像和界面更加生动逼真,适用于需要展示彩色图像或进行视觉交互的应用。
5、易于控制:通过 Arduino 开发板可以方便地对 TFT 显示屏进行控制。借助相应的库函数和代码,能够轻松实现图像绘制、文字显示、触摸交互等功能,降低了开发难度,即使对于没有深厚显示技术背景的开发者也较为友好。
二、应用场景
1、人机交互界面:在各种电子设备中,如智能仪器仪表、智能家居控制系统、工业自动化控制面板等,作为人机交互的窗口,用于显示菜单、参数设置界面、实时数据监测以及操作提示等信息,方便用户与设备进行交互。
2、教育领域:可用于制作教育实验设备、电子学习工具等。例如,在教学机器人中作为显示屏,展示机器人的状态信息、任务指令以及互动内容;在电子积木等教育玩具中,显示图形化的编程界面或游戏画面,增加学习的趣味性和互动性。
3、便携式设备:如手持游戏机、电子书阅读器、便携式多媒体播放器等。其高分辨率、宽视角和丰富的色彩表现能够为用户提供良好的视觉享受,同时快速响应速度也适合处理游戏中的动态画面和多媒体内容的播放。
4、物联网应用:在物联网项目中,作为节点设备的显示屏,用于展示传感器采集的数据、设备状态信息以及远程控制界面等。例如,在环境监测系统中,显示温度、湿度、空气质量等数据;在智能农业中,展示农田的灌溉状态、作物生长信息等。
三、需要注意的事项
1、电源管理:TFT 显示屏通常需要稳定的电源供应,并且其功耗相对较高。在与 Arduino 连接时,要确保电源能够满足显示屏的需求,避免因电源不稳定导致显示屏出现闪烁、显示异常或损坏等问题。同时,要合理设计电源电路,考虑节能措施,特别是在电池供电的设备中,以延长设备的续航时间。
2、接口兼容性:不同型号的 Arduino 开发板和 TFT 显示屏可能具有不同的接口类型和通信协议。在选择和使用时,要确保两者之间的接口兼容,并且正确连接引脚。有些 TFT 显示屏可能需要额外的驱动电路或转接板才能与 Arduino 顺利连接,需要仔细阅读产品说明书并进行相应的配置。
3、显示内存限制:虽然 TFT 显示屏能够显示丰富的内容,但 Arduino 的内存资源有限。在绘制复杂图像或显示大量数据时,可能会遇到内存不足的问题。因此,需要合理规划显示内容,优化图像和数据的存储方式,避免因内存耗尽导致程序崩溃或显示异常。
4、驱动程序和库的使用:为了实现 TFT 显示屏的各种功能,需要使用相应的驱动程序和库。不同的显示屏可能需要不同的库,并且这些库可能会不断更新和改进。在使用过程中,要及时关注官方文档和社区资源,获取最新的驱动程序和库,并了解其使用方法和注意事项。同时,要注意库与 Arduino IDE 版本的兼容性,避免出现编译错误或运行时问题。
5、电磁干扰:在一些电磁环境较为复杂的场合,TFT 显示屏可能会受到电磁干扰,导致显示出现噪点、闪烁或颜色异常等问题。此时,需要采取相应的抗干扰措施,如合理布线、使用屏蔽线、添加滤波电容等,以确保显示屏的稳定工作。
主要特点
- 直观性与准确性兼具
直观时间展示:模拟时钟的指针动画能以一种直观的方式呈现时间,就像传统的机械时钟一样,人们可以快速地通过指针的位置大致判断当前时间。例如,时针指向 3 和 4 之间,分针指向 6,人们能立刻明白大概是 3 点半。
数字精确显示:同时结合数字显示,提供了精确的时间信息。当需要准确知道具体的分钟和秒数时,数字显示可以满足这一需求,弥补了指针在精确读数上的不足。 - 视觉效果丰富
动态指针动画:指针的连续转动形成了动态的动画效果,增强了时钟的视觉吸引力。这种动态效果可以根据实际需求进行调整,如指针的转动速度、平滑度等,使时钟更具生动感。
自定义外观:可以对时钟的外观进行高度自定义,包括表盘的颜色、刻度的样式、指针的形状和颜色等。还能添加背景图案或特效,打造出独特的视觉风格,满足不同用户的审美需求。 - 交互性与扩展性
用户交互:可以通过添加按键或触摸功能,实现与用户的交互。例如,用户可以通过按键调整时钟的时间、切换显示模式等,增加了使用的趣味性和便利性。
功能扩展:容易与其他功能进行集成扩展。比如,可以结合温度、湿度传感器,在时钟界面上同时显示环境信息;或者与网络连接,实现自动校时功能。 - 资源利用高效
合理利用 TFT 屏幕:TFT 屏幕具有较高的分辨率和色彩显示能力,模拟时钟动画能够充分发挥这些优势,在有限的屏幕空间内展示丰富的信息。同时,通过优化图形绘制算法,可以减少对 Arduino 资源的占用,确保系统稳定运行。
应用场景
- 智能家居
家庭装饰与实用:作为智能家居设备的一部分,安装在客厅、卧室等地方,既可以作为装饰品美化家居环境,又能为家庭成员提供准确的时间信息。例如,结合智能家居系统的语音控制功能,用户可以通过语音查询时间,提升生活的便利性。
与其他设备联动:与智能灯光、空调等设备进行联动。例如,在特定时间自动调节灯光亮度或空调温度,实现智能化的家居控制。 - 工业控制与监控
操作指示:在工业控制系统中,作为操作界面的一部分,为操作人员提供时间参考。例如,在自动化生产线上,操作人员可以根据时钟的时间安排生产任务,确保生产流程的有序进行。
数据记录与分析:结合工业传感器,记录设备的运行时间和生产数据,为后续的数据分析和设备维护提供依据。 - 教育领域
教学工具:在学校的科学、物理等课程中,作为教学工具帮助学生理解时间的概念和时钟的工作原理。通过观察指针的转动和数字的变化,学生可以更直观地学习时间的测量和计算。
实验计时:在实验教学中,用于实验过程的计时,确保实验按照规定的时间进行,提高实验的准确性和可靠性。 - 商业场所
公共显示:安装在商场、酒店、车站等公共场所,为人们提供准确的时间信息,方便人们安排行程。同时,其精美的外观和动态效果也可以起到吸引顾客的作用。
需要注意的事项
- 时间准确性
时钟校准:为了确保时间的准确性,需要定期进行时钟校准。可以通过连接网络获取标准时间,或者使用高精度的实时时钟模块(如 DS3231)。同时,要考虑到时钟运行过程中可能出现的误差积累,及时进行调整。
硬件稳定性:Arduino 的定时器和时钟模块的稳定性会影响时间的准确性。要选择质量可靠的硬件,并注意电源供应的稳定性,避免因电源波动导致时钟误差。 - 图形绘制与性能优化
算法优化:模拟时钟动画的实现需要进行大量的图形绘制操作,这可能会占用较多的 Arduino 资源。因此,需要优化图形绘制算法,减少不必要的计算和内存占用。例如,采用缓存技术,避免重复绘制不变的图形元素。
帧率控制:要合理控制时钟动画的帧率,确保指针的转动平滑自然,同时又不会因帧率过高而导致系统负担过重。可以根据 Arduino 的性能和 TFT 屏幕的刷新频率进行调整。 - 显示效果与可读性
色彩搭配:选择合适的色彩搭配,确保指针、数字和表盘之间具有良好的对比度,提高时钟的可读性。例如,避免使用过于相近的颜色,以免造成视觉混淆。
字体选择:数字显示的字体要清晰易读,大小适中。可以根据 TFT 屏幕的尺寸和分辨率选择合适的字体,确保在不同的观看距离下都能清晰地读取时间。 - 交互设计与用户体验
操作便捷性:如果设计了用户交互功能,要确保操作简单便捷。例如,按键的布局要合理,触摸区域要足够大,避免误操作。
反馈机制:在用户进行操作时,要提供明确的反馈信息。例如,按键按下时要有相应的提示音或屏幕反馈,让用户知道操作是否成功。
1、ESP32驱动GC9A01屏幕的超大数字时钟
核心代码框架
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_GC9A01A.h>
#define TFT_CS 4
#define TFT_DC 2
#define TFT_RST -1
Adafruit_GC9A01A tft = Adafruit_GC9A01A(TFT_CS, TFT_DC, TFT_RST);
int hours = 10, minutes = 31, seconds = 0;
unsigned long lastUpdateTime = 0;
void setup() {
Serial.begin(115200);
tft.begin();
tft.setRotation(2);
tft.fillScreen(tft.color565(0, 0, 0));
}
void loop() {
unsigned long currentTime = millis();
if (currentTime - lastUpdateTime >= 1000) {
lastUpdateTime = currentTime;
seconds++;
if (seconds == 60) { seconds = 0; minutes++; }
if (minutes == 60) { minutes = 0; hours++; }
if (hours == 24) hours = 0;
tft.fillScreen(tft.color565(0, 0, 0));
tft.setTextColor(tft.color565(255, 255, 255));
tft.setTextSize(7);
tft.setCursor(30, 90);
tft.print(hours);
tft.setCursor(106, 90);
tft.setTextColor((seconds % 2 == 0) ? tft.color565(255, 69, 0) : tft.color565(0, 0, 0));
tft.print(":");
tft.setCursor(140, 90);
tft.print(minutes);
}
}
要点解读
硬件配置:使用ESP32开发板驱动GC9A01型240×240分辨率TFT屏幕,通过SPI接口实现通信,其中CS接D4,DC接D2,RST未连接(-1表示浮空)。
时间管理:基于millis()函数实现每秒更新,通过秒-分-小时三级累加逻辑处理时间进位,避免使用外部RTC模块。
显示优化:采用fillScreen()清除屏幕减少闪烁,使用setTextSize(7)实现超大字体显示,通过颜色变化模拟冒号闪烁效果。
2、Arduino Nano驱动WS2812灯带的彩色数字时钟
核心代码框架
#include <FastLED.h>
#define LED_PIN 6
#define NUM_LEDS 196
CRGB leds[NUM_LEDS];
int hours = 12, minutes = 0;
void setup() {
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
FastLED.clear();
}
void loop() {
// 模拟时间更新
delay(1000);
minutes++;
if (minutes == 60) { minutes = 0; hours = (hours + 1) % 24; }
// 显示时间
displayTime(hours, minutes);
}
void displayTime(int h, int m) {
FastLED.clear();
showNumber(h * 60 + m, 0); // 转换为分钟数定位LED
FastLED.show();
}
void showNumber(int num, int offset) {
// 自定义数字映射逻辑(省略具体实现)
}
要点解读
硬件配置:基于Arduino Nano v3驱动WS2812型196像素RGB LED灯带,通过单总线协议实现通信,灯带采用独立可寻址设计。
时间管理:通过delay(1000)模拟每秒更新,使用分钟数转换定位LED位置,支持0-23小时制显示。
显示优化:采用FastLED库实现高刷新率显示,支持颜色渐变和随机颜色模式,通过数字映射算法实现复杂图案显示。
3、ESP8266驱动ST7735屏幕的动态数字时钟
核心代码框架
#include <TFT_eSPI.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
TFT_eSPI tft = TFT_eSPI();
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");
void setup() {
tft.init();
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
WiFi.begin("SSID", "PASSWORD");
while (WiFi.status() != WL_CONNECTED) delay(500);
timeClient.begin();
}
void loop() {
timeClient.update();
int hours = timeClient.getHours();
int minutes = timeClient.getMinutes();
tft.fillScreen(TFT_BLACK);
tft.setTextColor(TFT_WHITE, TFT_BLACK);
tft.setTextSize(3);
tft.setCursor(10, 50);
tft.printf("%02d:%02d", hours, minutes);
delay(1000);
}
要点解读
硬件配置:基于ESP8266开发板驱动ST7735型128×160分辨率TFT屏幕,通过SPI接口通信,使用User_Setup.h文件配置引脚映射。
时间管理:集成NTPClient库实现网络时间同步,通过UDP协议获取UTC时间并转换为本地时区显示。
显示优化:采用printf()格式化输出时间字符串,支持动态网络时间校准,适用于需要高精度时间的场景。
4、基础模拟时钟动画
此程序展示如何结合数字时间和模拟时钟指针,提供基本的时间显示功能。
#include <TFT_eSPI.h>
#include <RTClib.h>
#include <math.h>
TFT_eSPI tft = TFT_eSPI();
RTC_DS3231 rtc;
#define CENTER_X 120
#define CENTER_Y 120
#define RADIUS 80
void setup() {
tft.init();
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
if (!rtc.begin()) {
tft.setTextColor(TFT_RED, TFT_BLACK);
tft.setTextSize(2);
tft.setCursor(10, 50);
tft.println("RTC not found!");
while (1);
}
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
DateTime now = rtc.now();
// 数字时钟显示
char timeStr[20];
sprintf(timeStr, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
tft.fillRect(0, 0, 240, 50, TFT_BLACK); // 清除数字区域
tft.setTextColor(TFT_WHITE, TFT_BLACK);
tft.setTextSize(3);
tft.setCursor(20, 10);
tft.println(timeStr);
// 绘制模拟时钟
drawClockFace();
drawHands(now);
delay(1000);
}
void drawClockFace() {
tft.drawCircle(CENTER_X, CENTER_Y, RADIUS, TFT_WHITE); // 绘制表盘
for (int i = 0; i < 12; i++) { // 绘制小时刻度
float angle = i * PI / 6;
int x = CENTER_X + cos(angle) * (RADIUS - 10);
int y = CENTER_Y - sin(angle) * (RADIUS - 10);
tft.fillCircle(x, y, 3, TFT_WHITE);
}
}
void drawHands(DateTime now) {
int hourAngle = ((now.hour() % 12) * 30 + now.minute() / 2) * PI / 180;
int minuteAngle = (now.minute() * 6) * PI / 180;
int secondAngle = (now.second() * 6) * PI / 180;
// 时针
drawHand(hourAngle, RADIUS * 0.5, TFT_WHITE);
// 分针
drawHand(minuteAngle, RADIUS * 0.7, TFT_WHITE);
// 秒针
drawHand(secondAngle, RADIUS * 0.9, TFT_RED);
}
void drawHand(float angle, int length, uint16_t color) {
int x = CENTER_X + cos(angle) * length;
int y = CENTER_Y - sin(angle) * length;
tft.drawLine(CENTER_X, CENTER_Y, x, y, color);
}
要点解读:
RTC模块支持:
使用 RTClib 库获取当前时间。
如果RTC模块断电或未初始化,自动设置时间为编译时间。
表盘绘制:
表盘由一个圆和12个刻度组成,刻度用小圆点表示。
指针动态更新:
根据当前时间计算时针、分针和秒针的角度,并使用三角函数绘制指针。
颜色区分:
秒针用红色,时针和分针用白色,便于区分。
5、带日期和星期的模拟时钟
此程序扩展了第一个案例,增加了日期和星期的显示。
#include <TFT_eSPI.h>
#include <RTClib.h>
#include <math.h>
TFT_eSPI tft = TFT_eSPI();
RTC_DS3231 rtc;
const char* weekdays[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
#define CENTER_X 120
#define CENTER_Y 120
#define RADIUS 80
void setup() {
tft.init();
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
if (!rtc.begin()) {
tft.setTextColor(TFT_RED, TFT_BLACK);
tft.setTextSize(2);
tft.setCursor(10, 50);
tft.println("RTC not found!");
while (1);
}
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
DateTime now = rtc.now();
// 数字时钟显示
char timeStr[20];
sprintf(timeStr, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
tft.fillRect(0, 0, 240, 50, TFT_BLACK); // 清除数字区域
tft.setTextColor(TFT_WHITE, TFT_BLACK);
tft.setTextSize(3);
tft.setCursor(20, 10);
tft.println(timeStr);
// 显示日期和星期
char dateStr[20];
sprintf(dateStr, "%04d-%02d-%02d %s", now.year(), now.month(), now.day(),
weekdays[now.dayOfTheWeek()]);
tft.fillRect(0, 200, 240, 40, TFT_BLACK); // 清除日期区域
tft.setTextSize(2);
tft.setCursor(20, 200);
tft.println(dateStr);
// 绘制模拟时钟
drawClockFace();
drawHands(now);
delay(1000);
}
void drawClockFace() {
tft.drawCircle(CENTER_X, CENTER_Y, RADIUS, TFT_WHITE); // 绘制表盘
for (int i = 0; i < 12; i++) { // 绘制小时刻度
float angle = i * PI / 6;
int x = CENTER_X + cos(angle) * (RADIUS - 10);
int y = CENTER_Y - sin(angle) * (RADIUS - 10);
tft.fillCircle(x, y, 3, TFT_WHITE);
}
}
void drawHands(DateTime now) {
int hourAngle = ((now.hour() % 12) * 30 + now.minute() / 2) * PI / 180;
int minuteAngle = (now.minute() * 6) * PI / 180;
int secondAngle = (now.second() * 6) * PI / 180;
// 时针
drawHand(hourAngle, RADIUS * 0.5, TFT_WHITE);
// 分针
drawHand(minuteAngle, RADIUS * 0.7, TFT_WHITE);
// 秒针
drawHand(secondAngle, RADIUS * 0.9, TFT_RED);
}
void drawHand(float angle, int length, uint16_t color) {
int x = CENTER_X + cos(angle) * length;
int y = CENTER_Y - sin(angle) * length;
tft.drawLine(CENTER_X, CENTER_Y, x, y, color);
}
要点解读:
日期和星期显示:
使用 DateTime 类的方法获取日期和星期,并在屏幕底部显示。
多行布局:
时间显示在屏幕上方,日期和星期显示在下方,布局清晰。
动态更新:
每秒更新时间和日期,保持实时性。
6、交互式模拟时钟(触摸调整时间)
此程序展示如何通过触摸屏调整时间,并实时更新数字和模拟时钟。
#include <TFT_eSPI.h>
#include <XPT2046_Touchscreen.h>
#include <RTClib.h>
#include <math.h>
#define TOUCH_CS 33
TFT_eSPI tft = TFT_eSPI();
XPT2046_Touchscreen ts(TOUCH_CS);
RTC_DS3231 rtc;
#define CENTER_X 120
#define CENTER_Y 120
#define RADIUS 80
DateTime currentTime;
void setup() {
tft.init();
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
ts.begin();
if (!rtc.begin()) {
tft.setTextColor(TFT_RED, TFT_BLACK);
tft.setTextSize(2);
tft.setCursor(10, 50);
tft.println("RTC not found!");
while (1);
}
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
currentTime = rtc.now();
}
void loop() {
if (ts.touched()) {
TS_Point p = ts.getPoint();
int x = map(p.x, 0, 4095, 0, 240);
int y = map(p.y, 0, 4095, 0, 240);
// 调整时间
if (x >= 10 && x <= 100 && y >= 200 && y <= 240) {
currentTime = DateTime(currentTime.unixtime() + 3600); // 增加1小时
} else if (x >= 140 && x <= 230 && y >= 200 && y <= 240) {
currentTime = DateTime(currentTime.unixtime() - 3600); // 减少1小时
}
rtc.adjust(currentTime);
}
// 更新显示
updateDisplay();
}
void updateDisplay() {
// 数字时钟显示
char timeStr[20];
sprintf(timeStr, "%02d:%02d:%02d", currentTime.hour(), currentTime.minute(), currentTime.second());
tft.fillRect(0, 0, 240, 50, TFT_BLACK); // 清除数字区域
tft.setTextColor(TFT_WHITE, TFT_BLACK);
tft.setTextSize(3);
tft.setCursor(20, 10);
tft.println(timeStr);
// 触摸按钮
tft.fillRect(10, 200, 90, 40, TFT_GREEN);
tft.fillRect(140, 200, 90, 40, TFT_RED);
tft.setTextColor(TFT_WHITE, TFT_GREEN);
tft.setTextSize(2);
tft.setCursor(20, 210);
tft.println("+1H");
tft.setTextColor(TFT_WHITE, TFT_RED);
tft.setCursor(150, 210);
tft.println("-1H");
// 绘制模拟时钟
drawClockFace();
drawHands(currentTime);
delay(1000);
}
void drawClockFace() {
tft.drawCircle(CENTER_X, CENTER_Y, RADIUS, TFT_WHITE); // 绘制表盘
for (int i = 0; i < 12; i++) { // 绘制小时刻度
float angle = i * PI / 6;
int x = CENTER_X + cos(angle) * (RADIUS - 10);
int y = CENTER_Y - sin(angle) * (RADIUS - 10);
tft.fillCircle(x, y, 3, TFT_WHITE);
}
}
void drawHands(DateTime now) {
int hourAngle = ((now.hour() % 12) * 30 + now.minute() / 2) * PI / 180;
int minuteAngle = (now.minute() * 6) * PI / 180;
int secondAngle = (now.second() * 6) * PI / 180;
// 时针
drawHand(hourAngle, RADIUS * 0.5, TFT_WHITE);
// 分针
drawHand(minuteAngle, RADIUS * 0.7, TFT_WHITE);
// 秒针
drawHand(secondAngle, RADIUS * 0.9, TFT_RED);
}
void drawHand(float angle, int length, uint16_t color) {
int x = CENTER_X + cos(angle) * length;
int y = CENTER_Y - sin(angle) * length;
tft.drawLine(CENTER_X, CENTER_Y, x, y, color);
}
要点解读:
触摸交互:
使用 XPT2046_Touchscreen 库检测触摸事件。
根据触摸区域调整时间,增加或减少1小时。
时间同步:
调整后调用 rtc.adjust() 同步RTC模块时间。
按钮设计:
在屏幕底部绘制两个按钮,分别用于增加和减少时间。
注意,以上案例只是为了拓展思路,仅供参考。它们可能有错误、不适用或者无法编译。您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。实际编程时,您要根据自己的硬件配置、使用场景和具体需求进行调整,并多次实际测试。您还要正确连接硬件,了解所用传感器和设备的规范和特性。涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。