#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const int PIN_BUTTON = 17;
const char* NAME_WIFI = "Wokwi-GUEST";
const char* PASSWORD = "";
const String WEBSITE = "http://api.openweathermap.org/data/2.5/weather?q=Moscow,ru,pt&APPID=";
const String KEY = "cdecb72a7903eb3bb1964c39615f1764";
const unsigned long TIME_OUT = 30000;
int printMessage = 0;
LiquidCrystal_I2C lcd(0x27, 16, 2);
HTTPClient http;
StaticJsonDocument<1500> document;
DeserializationError error;
void setup() {
Wire.begin();
lcd.init();
WiFi.begin(NAME_WIFI, PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
lcd.print("Connecting to");
lcd.setCursor(0, 1);
lcd.print("WiFi...");
delay(1000);
lcd.clear();
}
http.begin(WEBSITE + KEY);
pinMode(PIN_BUTTON, INPUT);
digitalWrite(PIN_BUTTON, HIGH);
request();
}
void request() {
static int httpGet = 0;
static String httpRequest;
if (WiFi.status() == WL_CONNECTED) {
httpGet = http.GET();
if (httpGet > 0) {
httpRequest = http.getString();
error = deserializeJson(document, httpRequest);
printRequest();
}
else {
lcd.clear();
lcd.print("HTTP request");
lcd.setCursor(0, 1);
lcd.print("error!");
}
}
}
void pruntMeaning(float meaning) {
lcd.setCursor(0, 1);
lcd.print(meaning);
lcd.write(254);
}
void printRequest() {
static float meaning = 0;
lcd.clear();
if (error) {
lcd.print("Request failed!");
}
else if (printMessage == 0) {
meaning = static_cast<float> (document["main"]["temp"]);
meaning -= 273,15;
lcd.print("Temperature");
pruntMeaning(meaning);
lcd.write(223);
lcd.write(67);
}
else if (printMessage == 1) {
meaning = static_cast<float> (document["main"]["feels_like"]);
meaning -= 273,15;
lcd.print("Feels like, temp");
pruntMeaning(meaning);
lcd.write(223);
lcd.write(67);
}
else if (printMessage == 2) {
meaning = static_cast<float> (document["main"]["humidity"]);
lcd.print("Humidity");
pruntMeaning(meaning);
lcd.print("%");
}
}
int debounce(int lasts, int buttonPort) {
int currents = digitalRead(buttonPort);
if (lasts != currents) {
delay(15);
return digitalRead(buttonPort);
}
else {
return lasts;
}
}
void button () {
static int currunt = LOW;
static int last = LOW;
currunt = debounce(last, PIN_BUTTON);
if (last == HIGH && currunt == LOW) {
printMessage++;
if (printMessage > 2) {
printMessage = 0;
}
printRequest();
}
last = currunt;
}
void loop() {
static unsigned long time = millis();
if (millis() - time > TIME_OUT) {
time = millis();
request();
}
button ();
delay(10);
}