使用 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.rhkb.cn/news/404338.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python异常处理

Python的异常处理是编程中非常重要的一部分&#xff0c;它允许程序在运行时遇到错误时优雅地处理这些错误&#xff0c;而不是简单地崩溃。异常处理机制包括try、except、else、finally等关键字&#xff0c;它们共同工作以捕获和处理程序中可能出现的错误。 1.异常的基本概念 …

如何有效清理宝塔控制面板中的垃圾文件与优化系统性能

宝塔控制面板&#xff08;BT-Panel&#xff09;作为一款流行的服务器管理软件&#xff0c;极大地简化了Linux服务器的管理任务&#xff0c;包括网站部署、数据库管理、文件操作等。然而&#xff0c;随着服务器运行时间的增长&#xff0c;系统中会积累各种临时文件、日志文件、缓…

探索Python的工业通信之光:pymodbus的奇妙之旅

文章目录 探索Python的工业通信之光&#xff1a;pymodbus的奇妙之旅背景&#xff1a;为何选择pymodbus&#xff1f;pymodbus是什么&#xff1f;如何安装pymodbus&#xff1f;5个简单的库函数使用方法3个场景使用示例常见bug及解决方案总结 探索Python的工业通信之光&#xff1a…

Python WebSocket自动化测试:构建高效接口测试框架

为了更高效地进行WebSocket接口的自动化测试&#xff0c;我们可以搭建一个专门的测试框架。本文将介绍如何使用Python构建一个高效的WebSocket接口测试框架&#xff0c;并重点关注以下四个方面的内容&#xff1a;运行测试文件封装、报告和日志的封装、数据驱动测试以及测试用例…

深入探索MyBatis的动态代理模式

文章目录 深入探索MyBatis的动态代理模式引言一、 MyBatis动态代理概述动态代理的优势 二、准备工作文件存放结构视图1、Mybatis的主配置文件 mybatis-config.xml2、db.properties文件:3、mybatis-config.xml引用properties文件: 三、MyBatis动态代理的实现原理1. Mapper接口定…

Linux·权限与工具-make

1. Makefile/makefile工具 首先展示一下&#xff0c;makefile工具如何使用。我们先写一个C语言程序 然后我们建立一个Makefile/makefile文件&#xff0c;m大小写均可。我们在文件中写入这样两行 wq保存退出后&#xff0c;我们使用 make 命令 可以看到生成了可执行程序&#xff…

人工智能在Facebook的角色:创新与挑战并存

人工智能&#xff08;AI&#xff09;已经成为推动科技进步的重要力量&#xff0c;而在社交媒体领域&#xff0c;Facebook则是将AI技术广泛应用的先锋。Facebook通过AI来改善用户体验、提高内容质量以及优化广告投放&#xff0c;极大地提升了平台的功能与价值。然而&#xff0c;…

渗透第三次作业

xss game前八关复现 第一关 传参进入h2标签 传入一个alert(1) 发现没有触发&#xff0c;原因是官方禁用了script 选择用img标签 ?somebody<img src1 οnerrοr"alert(1337)"> 第二关 先把它的双引号闭合掉&#xff0c;再执行1337再闭合 ?jeff111";al…

【Python零基础】while循环和用户输入

文章目录 前言一、input()函数二、while循环三、使用while循环来处理列表和字典总结 前言 我们开发一个应用程序&#xff0c;目的都是为了解决最终用户的问题&#xff0c;针对用户界面输入的数据&#xff0c;按照用户期待的逻辑进行处理&#xff0c;得到用户想要的结果。本章将…

Java | Leetcode Java题解之第347题前K个高频元素

题目&#xff1a; 题解&#xff1a; class Solution {public int[] topKFrequent(int[] nums, int k) {Map<Integer, Integer> occurrences new HashMap<Integer, Integer>();for (int num : nums) {occurrences.put(num, occurrences.getOrDefault(num, 0) 1);…

【机器学习】(基础篇六) —— 数据集的划分和过拟合问题

数据集的划分 训练集和测试集 在机器学习中&#xff0c;数据集通常会被划分为训练集&#xff08;Training Set&#xff09;和测试集&#xff08;Test Set&#xff09;&#xff0c;有时还会包括一个验证集&#xff08;Validation Set&#xff09;。这样的划分是为了能够更好地…

SQL 数据库设计、事务、视图 <13>

一、数据库设计 1.多表之间的关系 1&#xff09; 一对一&#xff08;了解&#xff09; 如&#xff1a;人和身份证 分析&#xff1a;一个人只有一个身份证&#xff0c;一个身份证只能对应一个人 2&#xff09;一对多&#xff08;多对一&#xff09; 如&#xff1a;部门和员…

Flink消费Kafka数据积压排查解决

0、背景 有个Flink任务每天不定时会出现数据积压&#xff0c;无论是白天还是数据量很少的夜里&#xff0c;且积压的数据量会越来越多&#xff0c;得不到缓解&#xff0c;只能每日在积压告警后重启&#xff0c;重启之后消费能力一点毛病没有&#xff0c;积压迅速缓解&#xff0…

立仪光谱共焦传感器行业应用|薄膜高度差扫描

01&#xff5c;检测需求&#xff1a;扫描薄膜圆圈的高度差 02&#xff5c;检测方式 客户要求扫描薄膜圆圈的高度差&#xff0c;根据观察样品我们选择立仪科技D40A30镜头搭配H系列控制器进行测量 03&#xff5c;光谱共焦测量结果 薄膜圆圈的高度差轮廓 04&#xff5c;光谱共焦…

在CodeBlocks搭建SDL2工程OLED液晶模拟器虚拟OLED单色液晶(128x64)

在CodeBlocks搭建SDL2工程OLED液晶模拟器虚拟OLED单色液晶 例程说明源码下载目录工程配置一、SDL2的初始化和退出二、OLED画点和读点三、更新OLDE的GRAM四、清屏和清某区域五、点阵字库六、显示字符串七、显示中文字符八、显示图片九、测试代码十、主函数十一、运行结果 例程说…

05 serv00安装typecho

下载 ‍ cd domain/xxx.serv00.net/# 下载typecho git clone https://github.com/typecho/typecho.git# 当前有两个目录 typecho/ 和 public_html/ ls# 替换html rm -rf public_html/ mv typecho public_html‍ 安装 浏览器访问你的网站 xxx.serv0.net&#xff0c;看见 type…

8月15日笔记

masscan安装使用 首先需要有c编译器环境。查看是否有c编译器环境&#xff1a; gcc -v如果系统中已经安装了 GCC&#xff0c;这个命令将输出 GCC 的版本信息。如果未安装&#xff0c;你会看到类似于 “command not found” 的错误消息。 如果没有下载&#xff0c;使用如下命令…

万维网与HTTP协议:基础知识简明指南

引言 在当今的数字时代&#xff0c;了解万维网&#xff08;World Wide Web, WWW&#xff09;和HTTP协议&#xff08;Hyper Text Transfer Protocol&#xff09;是至关重要的。本文将为基础小白们简明扼要地介绍万维网及其核心协议HTTP&#xff0c;并通过简单的例子和清晰的段落…

C语言内存操作函数

目录 一. C语言内存操作函数 1. memcpy的使用和模拟实现 2. memmove函数 3. memset函数 4. memcmp函数 一. C语言内存操作函数 随着知识的不断积累&#xff0c;我们所想要实现的目标程序就会更加复杂&#xff0c;今天我们来学习一个新的知识叫做C语言内存操作函数&#x…

基于Python的火车票售票系统/基于django的火车购票系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…