#include "WiFi.h"
#include <LiquidCrystal_I2C.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include "WeatherParams.h"
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2);
const int button = 15;
int SelectedParam = 0; // Переменная для прохода по параметрам
const int NumOfParams = 3; // Общее количество выводимых параметров
const unsigned long period = 30000; // Период обновления данных
unsigned long timer = 0; // Переменная для таймера
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const String key = "cdecb72a7903eb3bb1964c39615f1764";
const String unitsMetric = "&units=metric";
bool updated = true;
boolean lBut = LOW;
boolean cBut = LOW;
WeatherParams Moscow("http://api.openweathermap.org/data/2.5/weather?q=Moscow,ru,pt&APPID=");
boolean Debounce(boolean last){
boolean current = digitalRead(button);
if(last != current){
delay(5);
current = digitalRead(button);
//return current;
}
return current;
}
// Обработчик кнопки, если счетчик доходит до количества параметров - обнуляем
void ButtonHandler(){
cBut = Debounce(lBut);
if(lBut == LOW && cBut == HIGH){
updated = true;
SelectedParam++;
if(SelectedParam == NumOfParams){
SelectedParam = 0;
}
}
lBut = cBut;
}
// Вывод параметров на экран
void PrintParams(WeatherParams& wthr){
if(updated){ // Если была нажата кнопка
lcd.clear();
lcd.setCursor(0,0);
// массив с наименованиями параметров
lcd.print(wthr.names[SelectedParam]);
lcd.setCursor(0,1);
switch (SelectedParam){
case 0:
lcd.print(wthr.temp); lcd.print(" C");
break;
case 1:
lcd.print(wthr.feels_like); lcd.print(" C");
break;
case 2:
lcd.print(wthr.humidity); lcd.print(" %");
break;
default:
break;
}
updated = false;
}
}
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to Wi-Fi...");
}
Serial.println("Wi-Fi connection is established!");
WeatherScan(Moscow);
pinMode(button, INPUT);
}
void loop() {
ButtonHandler();
if(millis() - timer >= period){ // Обновляем данные каждые 30 секунд
WeatherScan(Moscow);
timer = millis();
}
PrintParams(Moscow);
}
void WeatherScan(WeatherParams& wthr){
// выполняем проверку подключения к беспроводной сети
if ((WiFi.status() == WL_CONNECTED)) {
// создаем объект для работы с HTTP
HTTPClient http;
// подключаемся к веб-странице OpenWeatherMap с указанными параметрами
http.begin(wthr.GetEndpoint() + key + unitsMetric);
int httpCode = http.GET(); // Делаем запрос
// проверяем успешность запроса
if (httpCode > 0) {
// выводим ответ сервера
String payload = http.getString();
//обработка полученных данных
DataParcer(payload, wthr);
}
else {
Serial.println("Ошибка HTTP-запроса");
}
http.end(); // освобождаем ресурсы микроконтроллера
}
}
void DataParcer(String message, WeatherParams& wthr)
{
StaticJsonDocument<1500> doc;
DeserializationError error = deserializeJson(doc, message);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.c_str());
return;
}
wthr.temp = doc["main"]["temp"];;
wthr.feels_like = doc["main"]["feels_like"];
wthr.humidity = doc["main"]["humidity"];
}