#include <WiFi.h>
#include <HTTPClient.h>
#include <LiquidCrystal_I2C.h>
#include <ArduinoJson.h>
#include "timer.h"
#define BUTTON 2
LiquidCrystal_I2C lcd(0x27, 16, 2);
volatile enum { TEMP, APP_TEMP, HUMIDITY } lcd_state = TEMP;
timer_ period(30000);
// Вводим имя и пароль точки доступа
const char* ssid = "Wokwi-GUEST";
const char* password = "";
//бесплатный сервис получения данных о погоде
const String endpoint = "http://api.openweathermap.org/data/2.5/weather?q=Prokopyevsk,ru,pt&units=metric&APPID=";
//индивидуальный пароль
const String key = "73d9914da8c7f6e22e17fd8818ee0a76";
//Memory pool. Размер с запасом
StaticJsonDocument<1500> doc;
//разбор полученного сообщения как форматированного текста JSON
DeserializationError error;
// создаем объект для работы с HTTP
HTTPClient http;
void requestMaker()
{
// выполняем проверку подключения к беспроводной сети
if ((WiFi.status() == WL_CONNECTED))
{
// подключаемся к веб-странице OpenWeatherMap с указанными параметрами
http.begin(endpoint + key);
int httpCode = http.GET(); // Делаем запрос
// проверяем успешность запроса
if (httpCode > 0)
{
// выводим ответ сервера
String payload = http.getString();
Serial.println(httpCode);
handleReceivedMessage(payload);
}
else {
Serial.println("Ошибка HTTP-запроса");
}
http.end(); // освобождаем ресурсы микроконтроллера
}
}
void handleReceivedMessage(String message)
{
error = deserializeJson(doc, message);
lcdWorker();
}
inline void lcdWorker()
{
// Если разбор прошел неуспешно
if (error)
{
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.c_str());
return;
}
lcd.clear();
const char* name = doc["name"];
lcd.print("City:");
lcd.print(name);
if (lcd_state == TEMP) {
float temp = doc["main"]["temp"];
lcd.setCursor(0, 1);
lcd.print("Temp.:");
lcd.print(temp);
lcd.write(char(223));
lcd.write('C');
}
else if (lcd_state == APP_TEMP) {
float apparent_temp = doc["main"]["feels_like"];
lcd.setCursor(0, 1);
lcd.print("App.Temp.:");
lcd.print(apparent_temp, 1);
lcd.write(char(223));
lcd.write('C');
}
else {
float humidity = doc["main"]["humidity"];
lcd.setCursor(0, 1);
lcd.print("Humidity:");
lcd.print(humidity, 1);
lcd.write('%');
}
}
void buttonHandler() {
switch (lcd_state) {
case TEMP:
lcd_state = APP_TEMP;
break;
case APP_TEMP:
lcd_state = HUMIDITY;
break;
case HUMIDITY:
lcd_state = TEMP;
break;
default:
break;
}
lcdWorker();
}
void setup()
{
lcd.init();
lcd.backlight();
pinMode(BUTTON, INPUT_PULLUP);
// attachInterrupt(BUTTON, buttonHandler, FALLING);
Serial.begin(115200);
// делаем небольшую задержку на открытие монитора порта
delay(1000);
// подключаемся к Wi-Fi сети
WiFi.begin(ssid, password);
lcd.clear();
lcd.print("Connecting to");
lcd.setCursor(0, 1);
lcd.print("Wi-Fi");
while (WiFi.status() != WL_CONNECTED)
{
lcd.setCursor(5, 1);
lcd.print(" ");
delay(300);
lcd.setCursor(5, 1);
lcd.print('.');
delay(300);
lcd.print('.');
delay(300);
lcd.print('.');
delay(300);
}
lcd.clear();
lcd.print("Wi-Fi is active");
delay(2000);
}
void loop()
{
if (digitalRead(BUTTON) == LOW) {
buttonHandler();
}
if (period.isExpired()) {
requestMaker();
period.restart();
}
}