#include <WiFi.h>
#include <HTTPClient.h>
#include <WiFiClientSecure.h> // Добавляем явно для HTTPS
#include <GyverOLED.h>
// Настройки Wi-Fi
const char* ssid = "Wokwi-GUEST"; // Замените на ваш SSID
const char* password = ""; // Замените на ваш пароль (если есть)
// URL страницы с погодой в Уфе
const char* url = "https://www.gismeteo.ru/weather-ufa-4588/";
// Настройки OLED-дисплея (I2C адрес 0x3C)
GyverOLED<SSD1306_128x64, OLED_BUFFER> oled(0x3C);
// Интервал обновления (1 минута)
const unsigned long updateInterval = 60000;
unsigned long lastUpdate = 0;
void setup() {
Serial.begin(115200);
// Инициализация дисплея
oled.init();
oled.clear();
oled.setScale(1);
oled.setCursor(0, 0);
oled.print("Тест дисплея 1");
oled.update();
Serial.println("Тест 1: 'Тест дисплея 1'");
delay(2000);
oled.clear();
oled.setCursor(0, 0);
oled.print("Тест дисплея 2");
oled.update();
Serial.println("Тест 2: 'Тест дисплея 2'");
delay(2000);
// Подключение к Wi-Fi
connectToWiFi();
updateTemperature();
}
void loop() {
if (millis() - lastUpdate >= updateInterval) {
lastUpdate = millis();
updateTemperature();
}
}
// Подключение к Wi-Fi
void connectToWiFi() {
oled.clear();
oled.setScale(1);
oled.setCursor(0, 0);
oled.print("WiFi...");
oled.update();
Serial.println("Подключаемся к WiFi...");
WiFi.begin(ssid, password);
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 20) {
delay(500);
Serial.print(".");
attempts++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\nWiFi подключен");
oled.clear();
oled.print("WiFi OK");
oled.update();
delay(1000);
} else {
Serial.println("\nWiFi ошибка");
oled.clear();
oled.print("WiFi ошибка");
oled.update();
}
}
// Обновление температуры
void updateTemperature() {
if (WiFi.status() != WL_CONNECTED) {
oled.clear();
oled.setScale(1);
oled.setCursor(0, 0);
oled.print("Нет WiFi");
oled.update();
Serial.println("Нет WiFi");
return;
}
WiFiClientSecure client;
HTTPClient http;
client.setInsecure(); // Отключаем проверку SSL (временное решение для HTTPS)
http.begin(client, url);
http.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/122.0.0.0");
int httpCode = http.GET();
Serial.println("HTTP код: " + String(httpCode));
if (httpCode == HTTP_CODE_OK) {
String html = http.getString();
int startIdx = html.indexOf("<temperature-value");
if (startIdx != -1) {
int valueStart = html.indexOf("value=\"", startIdx) + 7;
int valueEnd = html.indexOf("\"", valueStart);
if (valueStart != -1 && valueEnd != -1) {
String temp = html.substring(valueStart, valueEnd); // "2" или "-5"
Serial.println("Температура: " + temp + "°C");
// Вывод на экран
oled.clear();
// Надпись "Температура в Уфе:"
oled.setScale(1);
int headerWidth = 17 * 6;
int headerX = (128 - headerWidth) / 2;
oled.setCursor(headerX, 0);
oled.print("Температура в Уфе:");
oled.update();
delay(100);
// Температура
oled.setScale(4);
int tempWidth = (temp.length() + 2) * 24;
int tempX = (128 - tempWidth) / 2;
if (tempX < 0) tempX = 0;
oled.setCursor(tempX, 20);
oled.print(temp + "°C");
oled.update();
Serial.println("Экран обновлён: " + temp + "°C");
} else {
displayError("Значение не найдено");
}
} else {
displayError("Тег не найден");
}
} else {
displayError("HTTP: " + String(httpCode));
}
http.end();
}
// Вывод ошибки
void displayError(String message) {
oled.clear();
oled.setScale(1);
oled.setCursor(0, 0);
oled.print("Ошибка:");
oled.setCursor(0, 10);
oled.print(message);
oled.update();
Serial.println("Ошибка: " + message);
}