当前位置: 首页 > article >正文

ESP32玩转1.8寸LCD屏:用TFT_eSPI库做个桌面小时钟(附完整代码)

ESP32打造高颜值桌面时钟从TFT_eSPI库到完整项目实战在创客的世界里将硬件与代码结合创造出实用又有趣的项目总是令人兴奋。今天我们要用ESP32开发板和1.8寸ST7735驱动的LCD屏幕打造一个功能完善、界面美观的桌面电子时钟。这个项目不仅适合作为桌面摆件更是学习嵌入式GUI开发的绝佳案例。1. 项目准备与环境搭建1.1 硬件清单要完成这个项目你需要准备以下硬件组件ESP32开发板推荐使用ESP32-WROOM-321.8寸TFT LCD屏幕ST7735驱动芯片杜邦线若干面包板可选用于临时连接USB数据线用于供电和编程硬件连接示意图如下ESP32引脚LCD引脚功能说明3.3VVCC电源正极GNDGND电源地线GPIO18SCLSPI时钟线GPIO23SDASPI数据线GPIO5RES复位信号GPIO4DC数据/命令选择GPIO15CS片选信号1.2 软件环境配置首先确保你已经安装了Arduino IDE和ESP32开发板支持包。然后按照以下步骤配置TFT_eSPI库通过Arduino库管理器安装TFT_eSPI库找到库目录下的User_Setup.h文件通常位于Arduino/libraries/TFT_eSPI修改配置文件以适配ST7735驱动#define ST7735_DRIVER #define TFT_WIDTH 128 #define TFT_HEIGHT 160 #define TFT_RGB_ORDER TFT_BGR // 颜色顺序 #define TFT_MISO -1 // 不使用MISO #define TFT_MOSI 23 // GPIO23 #define TFT_SCLK 18 // GPIO18 #define TFT_CS 15 // GPIO15 #define TFT_DC 4 // GPIO4 #define TFT_RST 5 // GPIO5 #define LOAD_GLCD // 加载标准字体2. 基础时钟功能实现2.1 获取网络时间(NTP)一个实用的时钟需要准确的时间源。我们将使用NTP(网络时间协议)从互联网获取时间#include WiFi.h #include time.h const char* ssid 你的WiFi名称; const char* password 你的WiFi密码; void setupTime() { WiFi.begin(ssid, password); while (WiFi.status() ! WL_CONNECTED) { delay(500); Serial.print(.); } configTime(8 * 3600, 0, pool.ntp.org, time.nist.gov); struct tm timeinfo; if (!getLocalTime(timeinfo)) { Serial.println(Failed to obtain time); return; } Serial.println(timeinfo, %A, %B %d %Y %H:%M:%S); }2.2 基本时钟显示现在让我们在屏幕上显示时间#include TFT_eSPI.h TFT_eSPI tft TFT_eSPI(); void displayTime() { struct tm timeinfo; if (!getLocalTime(timeinfo)) { tft.setTextColor(TFT_RED); tft.drawString(Time Sync Failed, 10, 10, 2); return; } char timeStr[20]; strftime(timeStr, sizeof(timeStr), %H:%M:%S, timeinfo); tft.setTextColor(TFT_WHITE, TFT_BLACK); tft.drawString(timeStr, 20, 50, 7); // 使用大号字体显示时间 }3. 界面美化与高级功能3.1 设计美观的时钟界面一个好看的时钟界面需要考虑以下元素字体选择混合使用不同大小的字体突出重点颜色搭配选择对比度高但不刺眼的配色方案布局设计合理利用屏幕空间避免拥挤动态效果添加秒针动画或日期滚动效果下面是一个改进后的显示函数void drawClockFace() { // 绘制时钟背景 tft.fillScreen(TFT_BLACK); tft.drawRoundRect(5, 5, 118, 150, 10, TFT_NAVY); tft.fillRoundRect(7, 7, 114, 146, 8, TFT_DARKGREY); // 绘制刻度 for (int i 0; i 12; i) { float angle i * PI / 6; int x1 64 50 * sin(angle); int y1 80 - 50 * cos(angle); int x2 64 45 * sin(angle); int y2 80 - 45 * cos(angle); tft.drawLine(x1, y1, x2, y2, TFT_WHITE); } } void updateClock() { struct tm timeinfo; getLocalTime(timeinfo); // 显示时间 char timeStr[9]; strftime(timeStr, sizeof(timeStr), %H:%M:%S, timeinfo); tft.setTextColor(TFT_CYAN, TFT_DARKGREY); tft.drawString(timeStr, 15, 30, 4); // 显示日期 char dateStr[20]; strftime(dateStr, sizeof(dateStr), %a, %d %b %Y, timeinfo); tft.setTextColor(TFT_YELLOW, TFT_DARKGREY); tft.drawString(dateStr, 10, 120, 2); // 绘制秒针动画 static int prevSecond -1; if (timeinfo.tm_sec ! prevSecond) { // 清除旧秒针 float oldAngle prevSecond * PI / 30 - PI/2; int xOld 64 40 * cos(oldAngle); int yOld 80 40 * sin(oldAngle); tft.drawLine(64, 80, xOld, yOld, TFT_DARKGREY); // 绘制新秒针 float angle timeinfo.tm_sec * PI / 30 - PI/2; int x 64 40 * cos(angle); int y 80 40 * sin(angle); tft.drawLine(64, 80, x, y, TFT_RED); prevSecond timeinfo.tm_sec; } }3.2 添加温度显示功能许多ESP32开发板内置温度传感器我们可以利用它显示环境温度#ifdef __cplusplus extern C { #endif uint8_t temprature_sens_read(); #ifdef __cplusplus } #endif void displayTemperature() { float temp (temprature_sens_read() - 32) / 1.8; // 转换为摄氏度 char tempStr[10]; sprintf(tempStr, %.1f C, temp); tft.setTextColor(TFT_GREEN, TFT_DARKGREY); tft.drawString(tempStr, 20, 100, 2); }4. 低功耗优化与自动亮度调节4.1 实现自动亮度调节通过光敏电阻或环境光传感器实现自动亮度#define LIGHT_SENSOR_PIN 34 // 光敏电阻连接引脚 void adjustBrightness() { int lightValue analogRead(LIGHT_SENSOR_PIN); int brightness map(lightValue, 0, 4095, 10, 255); // 注意ST7735没有直接调节背光的功能这里需要PWM控制背光LED ledcWrite(0, brightness); // 使用LEDC通道控制背光 } void setup() { // 配置PWM通道用于背光控制 ledcSetup(0, 5000, 8); // 通道0, 5kHz, 8位分辨率 ledcAttachPin(27, 0); // 假设背光控制接在GPIO27 // ...其他初始化代码 }4.2 低功耗模式实现对于电池供电的应用低功耗设计至关重要void enterLowPowerMode() { // 夜间模式(23:00-6:00)降低刷新率 struct tm timeinfo; getLocalTime(timeinfo); if (timeinfo.tm_hour 23 || timeinfo.tm_hour 6) { // 每小时只刷新一次时间 static int lastHour -1; if (timeinfo.tm_hour ! lastHour) { updateClock(); lastHour timeinfo.tm_hour; } // 关闭WiFi以节省电量 WiFi.disconnect(true); WiFi.mode(WIFI_OFF); // 降低CPU频率 setCpuFrequencyMhz(80); } else { // 正常模式 setCpuFrequencyMhz(240); if (WiFi.status() ! WL_CONNECTED) { WiFi.begin(ssid, password); } } }5. 完整项目代码与进阶扩展5.1 完整时钟项目代码将前面所有功能整合成一个完整的项目#include TFT_eSPI.h #include WiFi.h #include time.h #include esp_sleep.h TFT_eSPI tft TFT_eSPI(); // WiFi配置 const char* ssid your_SSID; const char* password your_PASSWORD; void setup() { Serial.begin(115200); // 初始化显示屏 tft.init(); tft.setRotation(1); tft.fillScreen(TFT_BLACK); // 连接WiFi WiFi.begin(ssid, password); tft.setTextColor(TFT_WHITE); tft.drawString(Connecting WiFi..., 10, 10, 2); while (WiFi.status() ! WL_CONNECTED) { delay(500); Serial.print(.); } // 配置NTP configTime(8 * 3600, 0, pool.ntp.org, time.nist.gov); // 初始化时钟界面 drawClockFace(); // 配置背光PWM ledcSetup(0, 5000, 8); ledcAttachPin(27, 0); ledcWrite(0, 128); } void loop() { adjustBrightness(); updateClock(); displayTemperature(); enterLowPowerMode(); // 控制刷新率 static unsigned long lastUpdate 0; if (millis() - lastUpdate 200) { // 每秒刷新5次 lastUpdate millis(); // 其他需要频繁更新的内容... } delay(50); // 短暂延迟减少CPU负载 } // 前面定义的所有功能函数...5.2 进阶功能扩展思路天气信息显示通过API获取实时天气数据显示温度、湿度、天气图标多时区支持添加按钮切换不同时区同时显示多个时区时间闹钟功能设置多个闹钟添加振动马达或蜂鸣器提醒OTA更新实现无线固件更新无需连接电脑即可升级功能语音控制集成语音识别模块通过语音命令设置闹钟或查询信息// 示例添加简单的闹钟功能 struct Alarm { uint8_t hour; uint8_t minute; bool enabled; }; Alarm alarms[3]; // 支持3个闹钟 void checkAlarms() { struct tm timeinfo; getLocalTime(timeinfo); for (int i 0; i 3; i) { if (alarms[i].enabled alarms[i].hour timeinfo.tm_hour alarms[i].minute timeinfo.tm_min timeinfo.tm_sec 0) { triggerAlarm(); break; } } } void triggerAlarm() { // 闪烁屏幕和触发蜂鸣器 for (int i 0; i 10; i) { tft.invertDisplay(true); digitalWrite(BUZZER_PIN, HIGH); delay(200); tft.invertDisplay(false); digitalWrite(BUZZER_PIN, LOW); delay(200); } }这个ESP32桌面时钟项目展示了如何将硬件驱动、网络通信、用户界面和电源管理等多个嵌入式开发概念融合到一个实用项目中。通过不断迭代和添加新功能你可以把它打造成一个真正个性化的智能设备。

相关文章:

ESP32玩转1.8寸LCD屏:用TFT_eSPI库做个桌面小时钟(附完整代码)

ESP32打造高颜值桌面时钟:从TFT_eSPI库到完整项目实战 在创客的世界里,将硬件与代码结合创造出实用又有趣的项目总是令人兴奋。今天我们要用ESP32开发板和1.8寸ST7735驱动的LCD屏幕,打造一个功能完善、界面美观的桌面电子时钟。这个项目不仅适…...

别再浪费主板上的PCIE插槽了!手把手教你用VL805芯片打造高速USB3.0扩展坞

释放主板潜能:基于VL805芯片的USB3.0扩展方案实战指南 当你的工作台摆满外设却苦于主板接口不足时,那些闲置的PCIE插槽正等待被唤醒。本文将从芯片选型到性能调优,完整呈现如何将一块VL805-QFN68芯片转化为高性能USB3.0扩展方案。 1. 硬件选型…...

vue-pdf踩坑实录:从‘Cannot read properties of undefined’到完美预览的避坑指南

Vue-PDF实战避坑指南:从版本冲突到性能优化的全链路解决方案 1. 当控制台抛出"undefined catch"错误时 那个令人窒息的红色报错框突然出现在控制台——"Cannot read properties of undefined (reading catch)"。作为经历过三次类似场景的老手&a…...

【免费下载】 新概念英语第三册资源集合

新概念英语第三册资源集合 【下载地址】新概念英语第三册资源集合 新概念英语第三册资源集合 项目地址: https://gitcode.com/open-source-toolkit/8a5ad 资源介绍 本仓库提供了一系列新概念英语第三册(New Concept English 3)的资源文件&#x…...

别再只会抄电路图了!深入拆解LM317数据手册,搞懂可调稳压电源每个电阻电容的作用

从数据手册到实战设计:LM317可调稳压电源的深度解析 在电子设计领域,能够读懂并应用集成电路数据手册是区分初级玩家和专业工程师的重要标志。LM317作为经典的线性稳压器,其数据手册中蕴含的设计智慧远比大多数教科书上的标准电路图丰富得多。…...

别再死记硬背了!用这个商品库存表案例,5分钟搞懂HTML表格的rowspan属性

别再死记硬背了!用商品库存表案例5分钟掌握HTML表格的rowspan属性 每次看到HTML表格代码里那些rowspan和colspan属性就头疼?别担心,今天我们不谈枯燥的语法定义,而是通过一个真实的商品库存管理案例,带你理解rowspan的…...

【免费下载】 Windows Installer Clean Up 简体中文版

Windows Installer Clean Up 简体中文版 【下载地址】WindowsInstallerCleanUp简体中文版 本仓库提供了一个名为“Windows Installer Clean Up 简体中文”的资源文件下载。该工具是一款专门用于清理Windows系统中的安装程序残留文件的实用工具。通过使用此工具,您可…...

【免费下载】 C小项目分享(22个)亲测可运行

C#小项目分享(22个)亲测可运行 【下载地址】C小项目分享22个亲测可运行 C#小项目分享(22个)亲测可运行 项目地址: https://gitcode.com/open-source-toolkit/73645 资源介绍 本仓库提供了一个包含22个C#小项目的资源文件,所有项目均经过亲测,确保…...

Hotkey Detective:重塑Windows键盘操作的透明化洞察

Hotkey Detective:重塑Windows键盘操作的透明化洞察 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是否曾在…...

【免费下载】 STM32使用AD7799芯片读取AD值

STM32使用AD7799芯片读取AD值 【下载地址】STM32使用AD7799芯片读取AD值 本项目是基于STM32F103系列单片机,实现对AD7799高精度24位模数转换器(ADC)的数据采集。AD7799是一种高性能、低功耗的模拟到数字转换器,支持多种输入范围和…...

【免费下载】 符合标准(GB、JB)的SolidWorks模板

符合标准(GB、JB)的SolidWorks模板 【下载地址】符合标准GBJB的SolidWorks模板 本仓库提供了一系列符合国家标准(GB)和机械行业标准(JB)的SolidWorks模板文件,适用于各种工程设计和绘图需求。这些模板涵盖了不同尺寸的…...

别再硬着头皮写测试了!用Mockito 4.x搞定Spring Boot单元测试的5个真实场景

告别低效测试:Mockito 4.x在Spring Boot中的5个实战技巧 在Java开发领域,单元测试是保证代码质量的重要环节,但面对Spring Boot这样功能强大的框架,测试工作常常变得复杂而低效。依赖注入、数据库交互、外部服务调用等因素让测试代…...

在OpenClaw项目中接入Taotoken实现多模型Agent工作流

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在OpenClaw项目中接入Taotoken实现多模型Agent工作流 对于使用OpenClaw框架构建智能体工作流的开发者而言,如何稳定、灵…...

别再手动搬虚拟机了!手把手教你配置vSphere DRS集群,实现ESXi主机负载自动均衡

企业级虚拟化资源调度实战:vSphere DRS集群的智能配置与优化策略 虚拟化技术已成为现代企业IT基础设施的核心支柱,而资源的高效调度则是保障业务连续性和性能的关键。在传统虚拟化环境中,管理员往往需要手动监控主机负载并迁移虚拟机&#xf…...

Perplexity视频搜索不精准?揭秘4类常见误操作及实时修正方案

更多请点击: https://codechina.net 第一章:Perplexity视频搜索不精准?揭秘4类常见误操作及实时修正方案 Perplexity 的视频搜索功能依赖于跨模态语义理解,但用户常因输入方式或上下文设置不当导致结果偏离预期。以下四类高频误操…...

告别SAP GUI!Notepad++配置ABAP语法高亮,离线查看代码更高效

告别SAP GUI!Notepad配置ABAP语法高亮,离线查看代码更高效 对于ABAP开发者而言,代码阅读和分析是日常工作中不可或缺的部分。然而,传统的SAP GUI环境并非总是最便捷的选择——无论是通勤途中、客户现场无系统访问权限,…...

Electron应用上鸿蒙PC,安装包从180MB压到45MB,我做了哪些骚操作

Electron应用上鸿蒙PC,安装包从180MB压到45MB,我做了哪些骚操作 上个月老板丢给我一个任务:把现有的Electron应用搬到鸿蒙PC上。我花了两天把代码跑通了,build了一版安装包,一看体积——180MB。老板看了一眼&#xff0…...

B站m4s转MP4终极指南:一键解决缓存视频兼容性问题

B站m4s转MP4终极指南:一键解决缓存视频兼容性问题 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经遇到过这样的困扰&#…...

接口自动化测试框架搭建:基于Python+Requests+Pytest的实战教程

在软件测试领域,接口自动化测试是保障系统稳定性、提升测试效率的关键手段。随着敏捷开发和DevOps理念的普及,自动化测试的重要性愈发凸显。Python凭借其简洁的语法、丰富的库生态,成为接口自动化测试的首选语言;Requests库让HTTP…...

【亲测免费】 ADS1118驱动程序

ADS1118驱动程序 【下载地址】ADS1118驱动程序 本仓库提供了专用于ADS1118模数转换器(ADC)的驱动程序。ADS1118是一款高性能、高精度的16位模拟到数字转换器,广泛应用于需要精准测量的应用场景中,例如传感器数据采集系统、医疗设备…...

Auto Edit 日常迭代踩坑实录:OpenAI Codex CLI 三种权限模式配置差异与 2 类高频报错修复

1. Auto Edit 模式不是“全自动”,而是最易失控的权限模式 大多数人第一次在项目里启用 codex cli --mode=auto-edit,是冲着“自动改代码”去的。我也是。直到某天凌晨两点,CI 流水线突然报出 17 个 test failure,而 git diff 显示——它把一个 if (user.role === admin) …...

SAP EWM实战:从产品到处理单位,两种库存转移操作保姆级教程

SAP EWM库存转移实战指南:产品与处理单位的精准操作 在仓库管理的日常工作中,库存转移是最基础却最容易出错的环节之一。特别是对于刚接触SAP EWM系统的管理员来说,面对不同形态的物料——散件产品和带包装的处理单位(HU),往往会产…...

Cadence Allegro实战:除了Shape Keepout,还有哪些方法能精准控制铺铜区域?

Cadence Allegro实战:5种精准控制铺铜区域的进阶技巧 在复杂PCB设计中,铺铜区域的控制往往决定了信号完整性和EMC性能。Shape Keepout虽然是设计师最熟悉的工具,但Allegro其实提供了更丰富的"Areas"类命令集。本文将深入解析Route …...

别再傻傻分不清了!给硬件工程师的SI、PI、EMI关系速查手册(附高频PCB设计实例)

硬件工程师实战指南:SI、PI、EMI的三角关系与高频PCB设计避坑 当你第一次面对DDR4布线导致的EMI测试失败时,可能会陷入这样的困惑:明明是信号完整性问题,为什么整改方案却是调整电源层的去耦电容?这种看似跨领域的因果…...

从零开始用vnpy搭建你的第一个量化交易机器人(保姆级Python教程)

从零开始用vnpy搭建你的第一个量化交易机器人(保姆级Python教程) 第一次接触量化交易时,我被那些复杂的术语和代码吓得不轻。直到发现vnpy这个Python框架,才真正找到了入门的方向。vnpy就像是为Python开发者量身定制的量化交易工具…...

别再只用BLAST了!试试MAFFT+HMMER这套组合拳,挖掘基因家族新成员更精准

基因家族分析进阶指南:MAFFT与HMMER的高效组合策略 在基因组学研究领域,识别基因家族成员是一项基础而关键的工作。传统方法如BLAST虽然广为人知,但在面对远缘同源基因或高度分化的基因家族时,其灵敏度往往不尽如人意。这时&#…...

别再手动复制粘贴了!用poi-tl + Spring Boot自动生成带表格、二维码的Word领料单(附完整源码)

基于poi-tl的Spring Boot领料单自动化生成实战指南 在企业日常运营中,领料单这类标准化文档的生成往往占据大量重复性工作时间。传统的手工复制粘贴不仅效率低下,还容易出错。本文将介绍如何利用poi-tl这一强大的Word模板引擎,结合Spring Bo…...

Solidworks 2018+ 机器人模型避坑指南:用SW2URDF插件导出URDF,再导入Webots R2023a完整流程

SolidWorks 2018机器人模型导入Webots全流程避坑指南 在机器人仿真领域,将SolidWorks设计的机械模型准确导入Webots仿真环境是一个关键但充满挑战的环节。许多工程师和学生在初次尝试这一流程时,往往会在版本兼容性、文件路径、坐标系设置等环节遭遇各种…...

如何高效下载B站视频:BiliDownloader终极使用教程

如何高效下载B站视频:BiliDownloader终极使用教程 【免费下载链接】BiliDownloader BiliDownloader是一款界面精简,操作简单且高速下载的b站下载器 项目地址: https://gitcode.com/gh_mirrors/bi/BiliDownloader 想要轻松保存B站上的精彩视频内容…...

【亲测免费】 YMODEM发送端程序C代码

YMODEM发送端程序C代码 【下载地址】YMODEM发送端程序C代码 YMODEM发送端程序C代码 项目地址: https://gitcode.com/open-source-toolkit/8ede80 资源文件介绍 文件名 YMODEM.7z 文件描述 本资源文件包含了一个完整的YMODEM发送端程序的C代码,适用于STM3…...