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

使用 ESP32 和 TFT 屏幕显示实时天气信息 —— 基于 OpenWeatherMap API

实时监测环境数据是一个非常常见的应用场景,例如气象站、智能家居等。这篇博客将带你使用 ESP32 微控制器和一个 TFT 屏幕,实时显示当前城市的天气信息。通过 OpenWeatherMap API,我们能够获取诸如温度、天气情况以及经纬度等详细的天气数据,并将其显示在屏幕上。使用ESP32的好处就是可以不用外接温湿度传感器,温度数据和天气情况可以实时从网上获取。

IoT天气监测站:使用ESP32从OpenWeatherMap API获取实时天气数据,并通过TFT屏幕显示温度、湿度、风速等信息。项目中涉及到HTTP请求、JSON解析、屏幕显示控制以及网络连接的稳定性优化。
实现效果
在这里插入图片描述

项目概述

本项目的核心是利用 ESP32 连接 Wi-Fi,发起 HTTP 请求获取 OpenWeatherMap 的天气数据,解析返回的 JSON 数据,并使用 TFT 屏幕显示城市名称、当前温度、天气描述以及城市的经纬度信息。ESP32 的强大功能和易于使用的网络库使得这个项目非常适合物联网开发入门者。

所需硬件

ESP32 开发板
1.8寸或更大尺寸的 TFT 屏幕(SPI 接口)
跳线若干
电源线

软件库与工具

Arduino IDE
TFT_eSPI 库(用于 TFT 显示屏的控制)
ArduinoJson 库(用于解析 JSON 格式的数据)
WiFi 库和 HTTPClient 库(ESP32 网络连接和 HTTP 请求)

代码

首先,我们需要设置 ESP32 的网络连接和 OpenWeatherMap API 的配置信息。通过 WiFi.h 库连接到无线网络,然后利用 HTTPClient.h 库发起 HTTP 请求,获取 OpenWeatherMap 提供的实时天气数据。

#include <TFT_eSPI.h>   // 硬件专用库
#include <WiFi.h>       // ESP32 WiFi 库
#include <HTTPClient.h> // HTTP 请求库
#include <ArduinoJson.h> // JSON 解析库// Wi-Fi 网络名称和密码
const char* ssid = "Zkystudent";
const char* password = "5201314520";// OpenWeatherMap API 配置
const String apiKey = "fc23a9395c2ba4678e82d0f2df4ac8d9";
const String apiUrl = "http://api.openweathermap.org/data/2.5/weather?id=1784658&appid=" + apiKey + "&units=metric";// 创建TFT对象
TFT_eSPI tft = TFT_eSPI(); void setup() {// 初始化串口和TFT屏幕Serial.begin(115200);tft.init();tft.setRotation(2);tft.fillScreen(TFT_BLACK);// 连接Wi-Fitft.setCursor(10, 50);tft.setTextColor(TFT_WHITE, TFT_BLACK);tft.setTextSize(2);tft.println("Connecting to WiFi...");WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}tft.fillScreen(TFT_BLACK);tft.println("Connected to WiFi");
}void loop() {if (WiFi.status() == WL_CONNECTED) {HTTPClient http;http.begin(apiUrl);  // 发起HTTP请求int httpCode = http.GET(); // 获取HTTP响应码if (httpCode > 0) { // 检查请求是否成功String payload = http.getString(); // 获取返回的数据// 使用 ArduinoJson 解析JSON数据DynamicJsonDocument doc(2048);deserializeJson(doc, payload);// 获取城市和地理位置数据const char* cityName = doc["name"];float lon = doc["coord"]["lon"];float lat = doc["coord"]["lat"];// 获取天气数据float temperature = doc["main"]["temp"];const char* weatherDescription = doc["weather"][0]["description"];// 显示城市名称、经纬度和天气数据tft.fillScreen(TFT_BLACK);tft.setCursor(10, 20);tft.setTextSize(2);tft.setTextColor(TFT_CYAN);tft.print("City: ");tft.println(cityName);tft.setCursor(10, 60);tft.setTextColor(TFT_YELLOW);tft.print("Lon: ");tft.print(lon);tft.print("  Lat: ");tft.println(lat);tft.setCursor(10, 100);tft.setTextColor(TFT_WHITE);tft.print("Temp: ");tft.print(temperature);tft.println(" C");tft.setCursor(10, 140);tft.setTextColor(TFT_GREEN);tft.print("Weather: ");tft.println(weatherDescription);Serial.println(payload); // 打印JSON数据到串口监视器} else {Serial.println("Error on HTTP request");}http.end(); // 关闭连接}delay(60000); // 每分钟更新一次天气
}

Wi-Fi 连接:使用 WiFi.begin() 函数连接到指定的 Wi-Fi 网络,并在 TFT 屏幕上显示连接状态。
HTTP 请求:一旦 Wi-Fi 连接成功,ESP32 通过 HTTP 请求获取天气数据。我们使用 OpenWeatherMap 的城市 ID 1784658 获取永城的天气数据。
JSON 解析:使用 ArduinoJson 库解析返回的 JSON 数据,提取我们所需的字段,如城市名称、经纬度、温度和天气描述。
TFT 显示:解析后的数据通过 TFT_eSPI 库显示在屏幕上,包括城市名称、经纬度、当前温度和天气描述。

如何获取城市 ID

要获取正确的城市 ID,可以访问 OpenWeatherMap 的城市查找页面 并搜索您所需的城市,获取对应的城市 ID。这样可以避免因城市名称拼写错误导致的数据获取问题。

总结

本项目展示了如何使用 ESP32 和 TFT 屏幕实现一个简单的天气信息显示装置。通过利用 OpenWeatherMap API 和 Wi-Fi 网络,我们能够实时获取天气数据并在显示屏上输出。

http://www.lryc.cn/news/427033.html

相关文章:

  • 高阶数据结构——B树
  • Vue2中watch与Vue3中watch对比和踩坑
  • 在Java程序中执行Linux命令
  • 微信小程序在不同移动设备上的差异导致原因
  • 快速体验fastllm安装部署并支持AMD ROCm推理加速
  • 报错:java: javacTask: 源发行版 8 需要目标发行版 1.8
  • 【数据结构篇】~单链表(附源码)
  • 旋转图像(LeetCode)
  • 入门 - vue中v-model的实现原理和完整用法详解
  • 【区块链+金融服务】港融区域股权服务平台 | FISCO BCOS应用案例
  • Nginx反向代理和前后端分离项目打包部署
  • Spring 中ApplicationContext
  • python之时间 datetime、date、time、timedelta、dateutil
  • 【机器学习第11章——特征选择与稀疏学习】
  • LeetCode-day43-3137. K 周期字符串需要的最少操作次数
  • 基于springboot的智能家居系统
  • 【从问题中去学习k8s】k8s中的常见面试题(夯实理论基础)(七)
  • C:每日一练:单身狗(2.0版本)
  • 打破接口壁垒:适配器模式让系统无缝对接
  • U-Boot 命令使用
  • 谷歌的高级指令有哪些
  • Redis操作--RedisTemplate(一)介绍
  • GitLab环境搭建
  • Socket编程TCP 基础
  • JAVA中的Iterator与ListIterator
  • 高校疫情防控web系统pf
  • 复现nnUNet2并跑通自定义数据
  • Educational Codeforces Round 169 (Rated for Div. 2)(ABCDE)
  • 成为Python砖家(2): str 最常用的8大方法
  • 深入理解JVM运行时数据区(内存布局 )5大部分 | 异常讨论