demo1984s 的个人博客 demo1984s 的个人博客

记录精彩的程序人生

目录
Arduino ESP32/ESP8266开发系列·墨水屏天气站二
/        

Arduino ESP32/ESP8266开发系列·墨水屏天气站二

前言

  上一篇文章 Arduino ESP32/ESP8266 开发系列·墨水屏天气站 在一块老化的 4.2 寸三色墨水屏上绘制除了日期、时间和实时天气预报。本文将对界面进行布局优化,并增加简化的日历和月历,同时还完善了刷新机制,实现屏幕显示数据的定时更新。

显示效果

  为了显示效果更直观,本文换用了另一款屏幕清晰的 DIY 改造产品(闲鱼:数据大世界):

WechatIMG581.jpg

项目概述

  本项目旨在实现以下功能:

  1. 日历:屏幕上部左侧绘制简化的日历,仅包含年月日。
  2. 月历:屏幕下部绘制简化的月历,包含星期和日期。在月历中,当天的日期会被高亮显示 - 周一到周五黑色背景,周六日红色背景,字体为白色。
  3. 数据更新:定期重启获取数据,刷新屏幕。

硬件需求

  与上一篇文章一致,有现成产品则无需接线。

软件需求

  与上一篇文章一致。

代码实现

绘制日历

  日历绘制主要用到 display.fillRect()display.drawRect() 方法实现,却别如下:

  • void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color):绘制实心方形,参数 color 控制填充颜色。
  • void drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t 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();
  • millis():返回程序自启动以来经过的毫秒数。
  • ESP_RESTART_MILLIS :延时毫秒数。
  • void delay(uint32_t ms):延时函数,以毫秒为单位。

OpenWeatherMapDemo.ino 完整代码

  OpenWeatherMapDemo.ino 完整文件内容关注文末公众号后,发送消息“241222”获取链接。

扩展功能

  1. 节气与农历: 可结合农历算法库在日期单元格中增加农历日期或节气显示。
  2. 刷新优化: 如果屏幕支持局部刷新,在仅更新天气预报的时候,可使用局部刷新减少屏幕闪烁和刷新时间。
  3. 降低功耗:while delay() 的延时方式,单片机处于正常运行状态,较为耗电,可改用中断、时钟等方式。

总结

  对 ESP32-C3 开发的墨水屏天气站项目作了以下优化:结合 GxEPDAdafruit_GFX 库优化界面,使用 delay() 方法来设置下次获取数据及刷新屏幕的间隔时间。你可以根据需求扩展更多功能,如显示农历和节气信息、未来三天或七天天气预告等。

Arduino 相关资源下载


标题:Arduino ESP32/ESP8266开发系列·墨水屏天气站二
作者:demo1984s
地址:http://www.demo1984s.com/articles/2024/12/22/1734876474858.html