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

记录精彩的程序人生

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

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

背景概述

  本文介绍了如何基于ESP32-C3 开发一个​墨水屏天气站的小项目​。本项目将结合 ESP32-C3 的功能、墨水屏显示器(e-Ink)、天气 API 和日历功能,创建一个既能显示天气信息,又能展示当前日期和时间的智能设备。

显示效果

  4.2寸墨水屏显示效果如下图(屏幕稍有老化):

示例.jpg

  项目代码:百度网盘链接 https://pan.baidu.com/s/1GuYrQ42u0oNo0DQ47HD-bQ?pwd=k5rx

项目概述

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

  1. 显示当前日期和时间​。
  2. 从天气 API 获取实时天气信息。
  3. 通过墨水屏(e-Ink)显示这些信息。
  4. 使用 ESP32-C3 进行网络通信和数据处理​。

硬件需求

  1. ESP32-C3 开发板:选择 ESP32-C3,因为它拥有 Wi-Fi 功能,并且是较为低功耗的单核 32 位微控制器。
  2. 墨水屏(e-Ink)显示模块:常用的模块有 2.9 寸 和 4.2 寸,支持 SPI 接口。
  3. 电源管理:ESP32-C3 需要稳定的电源(一般使用 5V 或 3.3V USB 电源)。
  4. 面包线:用于连接 ESP32-C3 和墨水屏(各模块为单独分开时)。
  5. 数据线:用于连接ESP32-C3和电脑,切勿使用充电线。

软件需求

  1. Arduino IDE:用于开发和上传代码。本项目使用Arduino IDE版本为 2.3.4,ESP32开发板版本为 2.0.11。
  2. e-Ink 显示库:如 微雪、佳显、GxEPD2等,支持多种墨水屏显示模块。
  3. Wi-Fi 库:ESP32 内置的 Wi-Fi 库,用于连接网络。
  4. JSON 解析库:用于解析天气 API 返回的 JSON 数据。
  5. NTP 时间同步库​:用于从网络上获取当前时间。

硬件连接

  1. ESP32-C3 与墨水屏连接:使用 SPI 接口连接墨水屏与 ESP32-C3。以下为ESP32-C3 开发板与墨水屏驱动板的连接方式(不同厂商开发板版本引脚接线或有区别):
序号ESP32C3开发板引脚墨水屏驱动板引脚
1MOSIGPIO6
2SCKGPIO4
3CSGPIO7
4DCGPIO5
5RSTGPIO10
6BUSYGPIO11

注意:合宙 ESP32-C3 开发板的 GPIO11 是个特殊引脚,默认为 SPI flashVDD 引脚,需要解锁后才能使用。

代码实现

注册天气账号并获取API Key

  注册流程不作详细介绍,注册登录后前往后台页面获取Key https://home.openweathermap.org/api_keys ,本项目用的 2.5 版本的接口。

API KEY

安装必要的库

  需在 Arduino IDE 的 库管理 中安装以下库:

  • NTPClient:用于从 NTP 时间服务器同步时间,版本 3.2.1 。
  • ArduinoJson​:用于解析天气 API 返回的 JSON 数据,版本 7.2.1 。
  • GxEPD2​:用于控制墨水屏显示,版本 1.6.1 。
  • Adafruit GFX Library:用于显示字体,版本 1.11.11 。
  • Adafruit BusIO:Adafruit GFX Library 依赖库,版本 1.16.2 。

获取天气信息

  配置 Wi-Fi 网络和天气 API(例如 OpenWeatherMap API):

// Wi-Fi 配置
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";

// 天气 API 配置
const String apiKey = "your_API_KEY";  // 从 OpenWeatherMap 或其他服务获取
const String city = "your_city";       // 设置城市名称
const String apiUrl = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "&appid=" + apiKey + "&units=metric";

  通过 API 获取天气信息:

String getWeatherData() {
  if (client.connect("api.openweathermap.org", 80)) {
    client.print("GET " + apiUrl + " HTTP/1.1\r\n");
    client.print("Host: api.openweathermap.org\r\n");
    client.print("Connection: close\r\n\r\n");

    unsigned long timeout = millis();
    while (client.available() == 0) {
      if (millis() - timeout > 5000) {
        Serial.println("Timeout!");
        client.stop();
        return "";
      }
    }

    String response = "";
    while (client.available()) {
      response += char(client.read());
    }
    // Serial.println(response);
    client.stop();

    // 处理返回信息
    int jsonStart = response.indexOf('{');  // 找到第一个 '{'
    if (jsonStart != -1) {
      response = response.substring(jsonStart);  // 从 '{' 开始截取
    }
    return parseWeatherJson(response);
  }
  return "";
}

获取日期时间

  配置 NTP 客户端,注意东八区时间要使用 UTC+8

// 创建 NTP 客户端
WiFiUDP udp;
// NTPClient timeClient(udp, "pool.ntp.org", 0, 60000);  // 默认时区为 UTC
NTPClient timeClient(udp, "pool.ntp.org", 28800, 60000);  // UTC+8 (中国标准时间)

  获取 NTP 时间:

String getDateTimeData() {
  // 获取当前时间戳
  unsigned long epochTime = timeClient.getEpochTime();
  // 转换为时间结构
  struct tm* timeInfo = localtime((time_t*)&epochTime);
  // 格式化年月日和时分秒
  char buffer[40];
  strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", timeInfo);  // 格式化为 "2024-12-22 12:34:56"

  return String(buffer);
}

OpenWeatherMapDemo.ino 完整代码

  OpenWeatherMapDemo.ino 完整文件内容关注文末公众号后,发送消息“241220”获取链接或直接点击本站资源下载链接

代码解析

  1. Wi-Fi 连接​:通过 WiFi.begin(ssid, password) 连接到 Wi-Fi 网络。
  2. 天气数据获取​:通过 HTTP 请求获取天气数据,并使用 ArduinoJson 库解析 JSON 响应。
  3. 墨水屏显示​:使用 GxEPD2 库控制墨水屏,显示天气信息和当前日期。
  4. NTP 时间同步​:使用 NTPClient 获取当前时间并显示。
  5. 定时刷新:定时刷新的逻辑代码中未提供,可通过 while 或 for 语句实现,也可通过深度睡眠实现。

天气 API 返回结果信息样例如下

{
    "coord":{
        "lon":113.25,
        "lat":23.1167
    },
    "weather":[
        {
            "id":804,
            "main":"Clouds",
            "description":"overcast clouds",
            "icon":"04n"
        }
    ],
    "base":"stations",
    "main":{
        "temp":19.29,
        "feels_like":17.88,
        "temp_min":19.29,
        "temp_max":19.29,
        "pressure":1020,
        "humidity":23,
        "sea_level":1020,
        "grnd_level":1019
    },
    "visibility":10000,
    "wind":{
        "speed":2.85,
        "deg":13,
        "gust":4.63
    },
    "clouds":{
        "all":100
    },
    "dt":1734862385,
    "sys":{
        "country":"CN",
        "sunrise":1734822253,
        "sunset":1734860813
    },
    "timezone":28800,
    "id":1809858,
    "name":"Guangzhou",
    "cod":200
}

测试与调试

  • 确保 ESP32-C3 已成功连接到 Wi-Fi,并且墨水屏连接正常。
  • 查看串口输出,确保获取到正确的天气数据和时间信息。

扩展功能

  • 自定义天气 API:可以使用不同的天气 API 提供商,获取更多数据(如风速、湿度等)。
  • 按键交互:使用按键显示更多信息或切换不同显示界面。

总结

  这个 ESP32-C3 开发的墨水屏天气站项目,通过结合墨水屏显示、Wi-Fi、天气 API 和 NTP 时间同步功能,展示了如何在物联网设备上构建一个实用的智能日历与天气站。你可以根据需求扩展更多功能,如显示更多的天气信息、定时更新数据等。


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