22浏览
查看: 22|回复: 13

[项目] Arduino ESP32 彩色6寸电子纸墨水屏气象站

[复制链接]
Arduino ESP32 彩色6寸电子纸墨水屏气象站图1

这是我十多年来一直想构建的项目。我终于成功了,我真的很兴奋——一个电池供电的气象站项目。我过去建造过许多气象站项目,但这次不同。它可以用电池使用数月。原因是它使用了令人惊叹的 E-Paper 显示屏。让我向您展示我是如何构建这个项目的,以及如何使用相同或类似的显示器构建自己的项目。
首先,让我解释一下这个项目是什么以及它是如何运作的。
如您所见,我们有一个大型 6 英寸 E-Paper 显示屏,可以显示 7 种颜色,并结合 ESP32 微处理器。在我过去六年用过的所有电子纸板中,这是最好的。
在显示屏上,我们显示温度、湿度、气压和天气预报。我们从两个传感器获取温度、湿度和气压,并从互联网获取天气预报。
我们还在此处显示一些图表。显示过去 24 小时温度读数的折线图、显示过去 24 小时湿度读数的条形图和显示过去 24 小时气压读数的条形图。
在我看来,最后一个条形图是其中最有用的。我们可以获取这些值,并使用特定算法 Zambretti 算法生成我们自己的天气预报。但这是另一个 Instructable 的主题。

驴友花雕  中级技神
 楼主|

发表于 昨天 19:24

Arduino ESP32 彩色6寸电子纸墨水屏气象站

主要硬件
电子纸显示板:https://educ8s.tv/part/ColorEPaper
DHT22 传感器:https://educ8s.tv/part/DHT22
BMP180 传感器:https://educ8s.tv/part/BMP18
BME280 传感器:https://educ8s.tv/part/BME280

Arduino ESP32 彩色6寸电子纸墨水屏气象站图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:38

Arduino ESP32 彩色6寸电子纸墨水屏气象站

第 1 步:Inkplate6 彩色电子纸显示

这是一个 6 英寸彩色电子纸展示板。我已经制作东西十多年了,我对 e-ink 技术及其用途很着迷。如果您不熟悉它,电子墨水显示器仅在更新其内容时才会使用电力,因此即使此设备现在已关闭,它仍然会显示此图像。我在这个频道中使用 e-ink 显示器构建了许多项目。我一直想要一个多合一的板子。一个包含我构建项目所需的一切并且易于使用的板子。那么,让我们看看这个板子提供了什么。

首先,该板使用大型彩色 E-Ink 显示屏。这是我第一次使用彩色 E-Ink 显示屏,我喜欢它。颜色为任何项目增添了很多东西。此显示器可以显示 7 种不同的颜色。白色、黑色、红色、黄色、蓝色、绿色和橙色。它提供 600x448 像素的分辨率,屏幕刷新率约为 11 秒。由于显示器使用 E-Ink 技术,它仅在刷新其内容时消耗电量,因此如果我们不一直更新显示器,我们的功耗几乎为零。该板可实现 18μΑs 的深度睡眠电流。我喜欢它,我们可以构建可以使用电池持续数月的项目。神奇的东西。

该板还配备了一个集成了 Wi-Fi 和蓝牙连接的 ESP32 微控制器。我们还可以找到一个 SD 卡插槽,我们可以在其中存储文件和图像以在屏幕上显示。该板可以通过 USB-C 连接器进行编程和供电,并配有电池充电器和 Lipo 电池。此外,该板还配备了一个 RTC 时钟模块,用于跟踪时间并降低功耗。如您所见,该板还为我们提供了许多 gpio 引脚来连接我们的传感器和设备。该板还带有一个 3D 打印的外壳,如果您想修改它们,也可以在线获取这些文件。创客还能要求什么呢?我们想要的硬件一切都在这里。

Arduino ESP32 彩色6寸电子纸墨水屏气象站图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:40

Arduino ESP32 彩色6寸电子纸墨水屏气象站

第 2 步:DHT22 传感器

DHT22 是一款非常流行的温度和湿度传感器。它便宜、易于使用,并且规格声称具有良好的精度和准确度。

DHT 传感器由两部分组成,电容式湿度传感器和热敏电阻。里面还有一个芯片,可以做一些模数转换,输出带有温度和湿度的数字信号。使用任何微控制器都很容易读取数字信号。

DHT22 的特性

低成本
3 至 5V 电源和 I/O
转换期间最大电流消耗 2.5mA
0-100% 湿度读数,精度为 2-5%
-40 至 125°C 温度读数 ±0.5°C 精度

与 Arduino 的连接非常简单。我们将带有 + 号的传感器引脚连接到 Arduino 的 5V 或 3.3V 输出。我们将带有 - 号的传感器引脚连接到 GROUND。最后,我们将 OUT 引脚连接到 Arduino 的任何数字引脚。

为了将 DHT22 传感器与 Arduino 一起使用,我们必须使用 DHT 库。

https://github.com/adafruit/DHT-sensor-library

Arduino ESP32 彩色6寸电子纸墨水屏气象站图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:43

Arduino ESP32 彩色6寸电子纸墨水屏气象站

第 3 步:BMP180 传感器

BMP180 是一款低成本、低功耗的数字气压传感器,可通过 I2C 与 Arduino 通信。它通常用于测量大气压力、温度和海拔高度。凭借其高精度和宽测量范围,它是各种应用的宝贵工具,例如天气监测、无人机和其他车辆的高度跟踪以及气候数据收集。BMP180 体积小且易于集成,使其成为 Arduino 项目的热门选择。

传感器类型: 数字气压传感器
通信:协议 I2C
测量范围:大气压:300 至 1100 hPa(海拔 9000 米至 -500 米)
温度测量:范围 -40°C 至 85°C(-40°F 至 185°F)
精度: 压力:±0.2 hPa (0.75 毫巴);温度:±1.0°C (2°F)
分辨率:压力:0.01 hPa (0.03 毫巴);温度:0.01°C (0.02°F)
功耗典型值:0.3 μA;最大值:2.5 μAD

Arduino ESP32 彩色6寸电子纸墨水屏气象站图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:45

Arduino ESP32 彩色6寸电子纸墨水屏气象站

第 4 步:连接

连接真的很容易。我将一些接头引脚焊接到板上,并将传感器连接到它们。

BMP180 传感器使用 I2C 接口,因此我们必须将电源和另外两根电线连接到电路板的 SCL 和 SDA 引脚。

DHT22 传感器需要电源和一根电线,我已将其连接到引脚 IO13。


Arduino ESP32 彩色6寸电子纸墨水屏气象站图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:47

Arduino ESP32 彩色6寸电子纸墨水屏气象站

第 5 步:代码和库

为了编译项目,我们需要 4 个库,用于显示器的 Inkplate 库、用于 BMP180 传感器的库、用于 DHT22 传感器的库和 ArduinoJson 库,用于解析我们从互联网获得的数据。

Inkplate6 库
DHT22 文库
BMP180 文库
Arduino JSON

您可以直接从 Arduino IDE 下载所有库,因此无需访问任何网站。

该项目的软件由许多文件组成。我决定使用面向对象编程来使这个项目更易于使用。项目的每个功能都有自己的 Class。所以我们有一个检索天气预报的 Class。然后我们有一个读取传感器的类。然后我们有一个负责将数据读写到 EEPROM 存储器的 Class。我们需要的另一个类是一个保存所有历史传感器数据的类,最后是一个负责在显示屏上绘图的类。这样,如果您想使用不同的 display,则只需编写自己的 Display 类。如果您想使用不同的传感器,比如 BMP280,您只需修改传感器类。所有其他代码都可以正常工作。

您可以在此处找到代码链接:https://educ8s.tv/arduino-e-paper-weather-station/

它是完全开源的,如果您愿意,您可以使用其他功能对其进行扩展。我很想看看您将以这段代码为起点构建什么。

该项目演示了面向对象编程 (OOP) 在创建可维护、灵活的代码方面的强大功能。如果您对这个气象站的代码如何组织成简洁的模块化类感兴趣,让我通过我的课程“OOP Made Easy”向您展示如何掌握 OOP。

您将创建更令人兴奋的东西,而不是建造气象站 - 一个活生生的数字生态系统,细胞在这里移动、交互和进化!通过这个引人入胜的项目,您最终将一劳永逸地理解 OOP,不再有像 “Cat” 和 “Dog” 类这样令人困惑的抽象示例。不用担心这门课程是用 Python 编写的 - 无论你是用 Arduino、Java、C++ 还是任何其他面向对象的语言编码,类、继承和封装等 OOP 原则的工作方式都完全相同。您将学习的概念将改变您使用任何语言进行编码的方式。在短短 3.5 小时内,您将学习如何将复杂的代码转换为美观、可维护的解决方案。想了解 OOP 如何改变您的编码技能吗?

访问 https://bit.ly/3NaMfg4 了解如何更智能地编码,而不是更难编码。

Arduino ESP32 彩色6寸电子纸墨水屏气象站图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:50

Arduino ESP32 彩色6寸电子纸墨水屏气象站

步骤 6:首次运行代码

在首次运行项目之前,最好先运行一次 clean_eeprom 程序。您可以在我在上一步中共享的 .zip 文件中找到代码,也可以在 github 存储库中找到代码。这个小程序会将我们将要使用的 EEPROM 存储器的值初始化为零,并将擦除之前存储在那里的任何数据。这是必需的,因为我们每次唤醒芯片时都会读取 EEPROM 存储器,如果 EEPROM 没有复位,我们将遇到问题。

现在,在项目代码中,我们需要输入 4 个值。首先,我们需要输入 WiFi 网络的 SSID 和密码,以便板子可以连接到互联网以检索天气预报。现在要检索天气预报,我们将使用 Openweathermap 免费 api。要使用它,我们必须创建一个帐户。当我们创建帐户时,我们将可以访问个人 API 密钥。我们需要在 APIKEY 变量中输入 key。我们要输入的最后一件事是我们要获取天气预报的城市的 ID。只需搜索您的城市,并记下 URL 末尾显示的 ID。您需要在此变量中输入此值。就是这样。我们的代码已准备好上传到开发板。

该设备现在显示从传感器和天气预报收集的所有数据。但是,由于缺乏历史数据,这些图表尚不可见。正确绘制图表需要 24 小时。


Arduino ESP32 彩色6寸电子纸墨水屏气象站图1



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:53

Arduino ESP32 彩色6寸电子纸墨水屏气象站

第 7 步:代码的工作原理

该项目通过每 6 分钟测量一次温度、湿度和压力读数来运行。然后,它进入深度睡眠模式,在该模式下,该器件几乎完全禁用,仅消耗 15μA 的电流。显示屏即使处于非活动状态,仍显示以前记录的读数,这是我选择它的主要原因。

由于深度睡眠模式会禁用所有设备内存以节省电量,因此存储在 RAM 中的任何数据都会丢失。因此,在进入睡眠模式之前,我将所有读数保存到设备的 EEPROM 存储器中,这是一种永久存储解决方案。唤醒后,该器件从 EEPROM 检索所有读数并更新它们。

每 10 个唤醒周期或 60 分钟,设备会获取温度、湿度和压力读数,并相应地更新图表。每 60 个唤醒周期或 360 分钟 (6 小时),设备会连接到互联网以检索天气预报。为了节省电力,此过程限制为每天四次,因为 WiFi 连接会消耗大量能源。

通过实施这些省电策略,电池寿命可以延长数月。我目前使用的是 1200mAh 电池,我会及时通知您它的使用寿命。该项目在过去 3 天里一直可靠运行,我迫不及待地想用 6 个月的时间与您分享这个项目。

Arduino ESP32 彩色6寸电子纸墨水屏气象站图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:56

Arduino ESP32 彩色6寸电子纸墨水屏气象站

第 8 步:封闭项目

为了增强设备的外观,是时候将其封闭起来了。我使用的是电路板随附的原始外壳,但如果您愿意,您可以设计和 3D 打印自己的外壳。我只是为传感器从外壳中伸出一个孔,使它们能够有效地收集数据。它在我的桌子上看起来太酷了,我忍不住盯着它看。


Arduino ESP32 彩色6寸电子纸墨水屏气象站图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:58

Arduino ESP32 彩色6寸电子纸墨水屏气象站

第 9 步:结论

我希望你喜欢这个项目。这是我一直以来最喜欢的游戏之一。我一直想要一个看起来像这样的电子纸气象站。我买不起它,因为没有人在商业上生产这样的设备。所以,我建立了自己的。我们很幸运,我们生活在一个可以在短短几天内自己制作任何我们想要的任何东西的时代。我们也很幸运,因为在互联网的帮助下,我们可以找到所有需要的知识并与志同道合的人取得联系。


Arduino ESP32 彩色6寸电子纸墨水屏气象站图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 20:01

Arduino ESP32 彩色6寸电子纸墨水屏气象站

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 20:04

Arduino ESP32 彩色6寸电子纸墨水屏气象站

开源代码:epaper_weather_station.ino

  1. #include "sensors.h"
  2. #include "display.h"
  3. #include "EEPROMManager.h"
  4. #include "SensorDataManager.h"
  5. #include "ForecastManager.h"
  6. #define TIME_TO_SLEEP  360  //Time to sleep in seconds
  7. char* ssid     = "yourSSID";      // SSID of local network
  8. char* password = "yourPassword";  // Password on network
  9. char* APIKEY = "yourAPIKEY";
  10. char* cityID = "253394"; //Sparta, Greece
  11. Sensors sensors(13);
  12. Display display;
  13. EEPROMManager memory(512);
  14. SensorDataManager sensorData;
  15. ForecastManager forecast;
  16. void setup() {
  17.   Serial.begin(115200);
  18.   sensors.begin();
  19.   memory.begin();
  20.   sensors.readSensors();
  21.   sensorData.initializeData();
  22.   memory.loadSensorData(sensorData.sensorData);
  23.   display.begin();
  24.     //Every 6 hours, get the Weather Forecast
  25.   if(memory.bootUpCount %60 == 0) {
  26.     forecast.begin(ssid, password);
  27.     forecast.getForecast(cityID, APIKEY);
  28.     memory.saveWeatherId(forecast.id);
  29.   } else {
  30.     forecast.id = memory.readWeatherId();
  31.   }
  32.   //Every Hour, update the graphs
  33.   if(memory.bootUpCount %10 == 0) {
  34.     sensorData.updateData(sensors.getTemperature(), sensors.getHumidity(), sensors.getPressure());
  35.     memory.saveSensorData(sensorData.sensorData);
  36.   }
  37.   printSensorData();
  38.   display.printUI();
  39.   display.printTemperature(sensors.getTemperature());
  40.   display.printHumidity(sensors.getHumidity());
  41.   display.printPressure(sensors.getPressure());
  42.   display.printTemperatureGraph(sensorData.sensorData.temperature);
  43.   display.printPressureGraph(sensorData.sensorData.pressure);
  44.   display.printHumidityGraph(sensorData.sensorData.humidity);
  45.   display.printWeatherIcon(forecast.id);
  46.   display.update();
  47.   memory.incrementBootupCount();
  48.   sleep();
  49. }
  50. void loop() {
  51. }
  52. void printSensorData() {
  53.     Serial.println("Sensor Data:");
  54.     for (int i = 0; i < 24; ++i) {
  55.         Serial.print("Index ");
  56.         Serial.print(i);
  57.         Serial.print(": Temp=");
  58.         Serial.print(sensorData.sensorData.temperature[i], 1);
  59.         Serial.print(", Humidity=");
  60.         Serial.print(sensorData.sensorData.humidity[i], 1);
  61.         Serial.print(", Pressure=");
  62.         Serial.println(sensorData.sensorData.pressure[i], 1);
  63.     }
  64.     Serial.println();
  65. }
  66. void sleep() {
  67.   esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * 1000000);
  68.   esp_deep_sleep_start();
  69. }
复制代码



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 20:06

Arduino ESP32 彩色6寸电子纸墨水屏气象站

开源代码:inkplate_clean_eeprom.ino

  1. #include "EEPROMManager.h"
  2. EEPROMManager memory(512);
  3. void setup() {
  4.   Serial.begin(115200);
  5.   memory.begin();
  6.   memory.clear();
  7. }
  8. void loop() {
  9.   
  10. }
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail