// Подключаем библиотеку Adafruit_ILI9341
#include <Adafruit_ILI9341.h>
// Подключаем библиотеку Adafruit_GFX
#include <Adafruit_GFX.h>
// Подключаем библиотеку SPI
#include <SPI.h>
// Указываем пины для дисплея
#define TFT_CS 15 // Пин CS
#define TFT_DC 2 // Пин DC
#define TFT_RST 13 // Пин RST
// Создаем объект Adafruit_ILI9341
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
// Подключаем библиотеку WiFi
#include <WiFi.h>
// Указываем параметры подключения к WiFi
const char* ssid = "Wokwi-GUEST"; // Имя WiFi-сети
const char* password = ""; // Пароль WiFi-сети
// Подключаем библиотеку ArduinoJson
#include <ArduinoJson.h>
// Указываем API-ключ для OpenWeatherMap.org
const char* api_key = "yf6443dbc26b050b0a7999844fd6de974";
// Указываем ID города Ярославль
const char* city_id = "468902";
// Создаем переменные для хранения данных о погоде
float temperature; // Температура в градусах Цельсия
String description; // Описание погоды
String icon; // Код иконки погоды
// Создаем функцию для получения данных о погоде с OpenWeatherMap.org
void getWeatherData() {
// Формируем URL-адрес для запроса
String url = "http://api.openweathermap.org/data/2.5/weather?id=" + String(city_id) + "&appid=" + String(api_key) + "&units=metric&lang=ru";
// Начинаем запрос
WiFiClient client;
if (client.connect(url.c_str(), 80)) {
// Отправляем запрос
client.print("GET /data/2.5/weather?id=" + String(city_id) + "&appid=" + String(api_key) + "&units=metric&lang=ru HTTP/1.1\r\n");
client.print("Host: api.openweathermap.org\r\n");
client.print("Connection: close\r\n\r\n");
// Ждем ответа
while (client.connected() || client.available()) {
// Читаем строку из ответа
String line = client.readStringUntil('\n');
// Проверяем, что это начало тела ответа
if (line == "\r") {
// Создаем буфер для хранения JSON-объекта
StaticJsonDocument<1024> doc;
// Читаем JSON-объект из ответа
DeserializationError error = deserializeJson(doc, client);
// Проверяем, что нет ошибки
if (!error) {
// Извлекаем данные о погоде из JSON-объекта
temperature = doc["main"]["temp"]; // Температура
description = doc["weather"][0]["description"].as<String>(); // Описание
icon = doc["weather"][0]["icon"].as<String>(); // Иконка
}
// Завершаем чтение ответа
break;
}
}
// Закрываем соединение
client.stop();
}
}
// Создаем функцию для отображения данных о погоде на дисплее
void displayWeatherData() {
// Очищаем дисплей
tft.fillScreen(ILI9341_BLACK);
// Устанавливаем цвет и размер шрифта
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
// Выводим название города
tft.setCursor(10, 10);
tft.print("Yar");
// Выводим температуру
tft.setCursor(10, 40);
tft.print(temperature);
tft.print(" C");
// Выводим описание погоды
tft.setCursor(10, 70);
tft.print(description);
// Выводим иконку погоды
// TODO: добавить функцию для отображения иконки по коду
}
// Создаем функцию для инициализации дисплея
void initDisplay() {
// Инициализируем дисплей
tft.begin();
// Поворачиваем дисплей на 90 градусов
//tft.setRotation(1);
}
// Создаем функцию для подключения к WiFi
void connectWiFi() {
// Выводим сообщение о подключении
Serial.print("Подключение к WiFi-сети ");
Serial.println(ssid);
// Подключаемся к WiFi-сети
WiFi.begin(ssid, password);
// Ждем, пока не подключимся
while (WiFi.status() != WL_CONNECTED) {
// Выводим точку на монитор порта
Serial.print(".");
// Ждем полсекунды
delay(500);
}
// Выводим сообщение об успешном подключении
Serial.println();
Serial.println("Подключено к WiFi-сети");
Serial.println("IP-адрес: ");
Serial.println(WiFi.localIP());
}
// Функция setup, выполняется один раз при запуске
void setup() {
// Настраиваем скорость обмена данными с монитором порта
Serial.begin(115200);
// Инициализируем дисплей
initDisplay();
// Подключаемся к WiFi-сети
connectWiFi();
}
// Функция loop, выполняется бесконечно
void loop() {
// Получаем данные о погоде с OpenWeatherMap.org
getWeatherData();
// Отображаем данные о погоде на дисплее
displayWeatherData();
// Ждем 10 секунд
delay(10000);
}