上一篇文章 Arduino ESP32/ESP8266 开发系列·墨水屏天气站 在一块老化的 4.2 寸三色墨水屏上绘制除了日期、时间和实时天气预报。本文将对界面进行布局优化,并增加简化的日历和月历,同时还完善了刷新机制,实现屏幕显示数据的定时更新。
为了显示效果更直观,本文换用了另一款屏幕清晰的 DIY 改造产品(闲鱼:数据大世界):
本项目旨在实现以下功能:
与上一篇文章一致,有现成产品则无需接线。
与上一篇文章一致。
日历绘制主要用到 display.fillRect()
和 display.drawRect()
方法实现,却别如下:
color
控制填充颜色。color
控制边框颜色。将星期标题定义成数组,以周日为每周的第一天遍历输出:
1const char* weekDays[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
2 for (int i = 0; i < 7; i++) {
3 display.setCursor(xStart + i * cellWidth + 10, yStart - 5);
4 display.print(weekDays[i]);
5 }
月历中仅显示当月日期,上月及次月日期不显示,当日日期高亮显示:
1if (row == 0 && col < startDay) {
2 continue; // 跳过空白单元格
3 }
4
5 if (currentDay > daysInMonth) {
6 break; // 日期超出最大天数
7 }
8
9 if (currentDay == today) {
10 // 高亮今天的日期
11 display.fillRect(cellX, cellY, cellWidth, cellHeight, GxEPD_BLACK); // 黑色背景
12 display.setTextColor(GxEPD_WHITE); // 白色文字
13 } else {
14 display.setTextColor(GxEPD_BLACK);
15 }
16
17 // 绘制日期
18 display.setCursor(cellX + 10, cellY + 20);
19 display.printf("%2d", currentDay);
这里通过函数 millis()
和函数 delay()
实现延时,结合 ESP.restart()
来重启刷新数据:
1while (millis() < startTime + ESP_RESTART_MILLIS) {
2 delay(500);
3 }
4 ESP.restart();
OpenWeatherMapDemo.ino 完整文件内容关注文末公众号后,发送消息“241222”获取链接。
while
delay()
的延时方式,单片机处于正常运行状态,较为耗电,可改用中断、时钟等方式。 对 ESP32-C3 开发的墨水屏天气站项目作了以下优化:结合 GxEPD 和 Adafruit_GFX 库优化界面,使用 delay()
方法来设置下次获取数据及刷新屏幕的间隔时间。你可以根据需求扩展更多功能,如显示农历和节气信息、未来三天或七天天气预告等。