使用 ESP32 和 TFT 屏幕构建航班信息显示器
屏幕坏了一半,将i就一下
效果展示
在本次项目中,我们使用了 ESP32 微控制器与 TFT 屏幕,连接到 AviationStack API,实时获取从郑州到杭州的航班动态信息,并将其显示在屏幕上。这是一个极具实用性的项目,展示了物联网设备如何与在线数据源相结合,为用户提供实时、可视化的信息。
项目概述
项目目标:使用 ESP32 和 TFT 屏幕连接 AviationStack API,并从中提取指定航班的相关信息,比如郑州到杭州的航班,实时显示航班状态、起飞和到达时间。
使用的硬件和工具
ESP32:一款功能强大的 Wi-Fi 微控制器,用于与互联网通信并从 API 获取数据。
TFT_eSPI 屏幕:用于显示从 API 获取的航班信息。
AviationStack API:提供实时航班数据的 API,用于查询航班状态、时间等。
软件环境
Arduino IDE:编写和上传代码到 ESP32。
ArduinoJson 库:用于解析从 AviationStack API 返回的 JSON 数据。
HTTPClient 库:用于通过 HTTP GET 请求获取 API 数据。\
cpp
#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";
// AviationStack API 配置
const String apiKey = "333decadf28ccab610c792eed3ef6b91";
const String apiUrl = "http://api.aviationstack.com/v1/flights?access_key=" + apiKey + "&dep_iata=CGO&arr_iata=HGH&limit=1"; // 不指定日期限制,查看是否能获取数据
// 创建TFT对象
TFT_eSPI tft = TFT_eSPI();
void setup() {
// 初始化串口和TFT屏幕
Serial.begin(115200);
tft.init();
tft.setRotation(2);
tft.fillScreen(TFT_BLACK);
// 连接Wi-Fi
tft.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);
int httpCode = http.GET();
if (httpCode > 0) {
String payload = http.getString();
// 打印完整的JSON数据到串口监视器
Serial.println(payload);
// 使用 ArduinoJson 解析JSON数据
DynamicJsonDocument doc(8192);
deserializeJson(doc, payload);
// 确保返回的数据不为空
if (doc["data"].size() > 0) {
// 获取航班信息数据
const char* flight_number = doc["data"][0]["flight"]["iata"];
const char* departure_airport = doc["data"][0]["departure"]["airport"];
const char* arrival_airport = doc["data"][0]["arrival"]["airport"];
const char* status = doc["data"][0]["flight_status"];
// 获取日期和时间数据(计划的出发时间)
const char* departure_date_utc = doc["data"][0]["departure"]["scheduled"];
// 显示航班信息数据
tft.fillScreen(TFT_BLACK);
tft.setCursor(10, 20);
tft.setTextSize(2);
tft.setTextColor(TFT_CYAN);
tft.print("Flight: ");
tft.println(flight_number);
tft.setCursor(10, 60);
tft.setTextColor(TFT_YELLOW);
tft.print("From: ");
tft.println(departure_airport);
tft.setCursor(10, 100);
tft.setTextColor(TFT_GREEN);
tft.print("To: ");
tft.println(arrival_airport);
tft.setCursor(10, 140);
tft.setTextColor(TFT_WHITE);
tft.print("Date: ");
tft.println(departure_date_utc);
} else {
tft.fillScreen(TFT_BLACK);
tft.setCursor(10, 50);
tft.setTextSize(2);
tft.setTextColor(TFT_RED);
tft.println("No flights found");
}
} else {
tft.fillScreen(TFT_BLACK);
tft.setCursor(10, 50);
tft.setTextSize(2);
tft.setTextColor(TFT_RED);
tft.println("HTTP request error");
}
http.end();
}
delay(60000); // 每分钟更新一次航班信息
}