hiya,
I am currently working with an ESP32 using a Weather API to pull data as a JSON and I want to check the values like temperature, wind speed, etc. at a certain value there should be an output, in this case i want to blink an LED to test it.
I encountered a problem. I tried to include a blink using an if statement regarding certain values. Also I used millis() instead of the delay.
For now the code is kind of working, but the LED is actually not blinking but changes every loop from HIGH to LOW, also I am not certain that it actually reacts to the value in the if statement.
For more clarity in the end the programm should check every few minutes the weather and if I get certain values I want to drive a DC Motor for a couple of seconds then stop it and then start it again.
So I want it to switch multiple times between on and off during one loop. And then the whole loop (including the pull of data) should start again.
#include <WiFi.h>
#include <WiFiMulti.h>
#include <HTTPClient.h>
WiFiMulti WiFiMulti;
#include <ArduinoJson.h>
int ledPin = 22; // the number of the LED pin
int ledState = LOW; // ledState used to set the LED
unsigned long previousMillis = 0; // will store last time LED was updated
long OnTime = 250; // milliseconds of on-time
long OffTime = 750; // milliseconds of off-time
long WaitTime = 10000;
// set Wi-Fi SSID and password
const char *ssid = "xxxxxx";
const char *password = "xxxxxx";
// set location and API key
String Location = "Berlin";
String API_Key = "c66687d91d685f5ecdda000xxxxxx";
void setup()
{
Serial.begin(115200);
delay(200);
pinMode(ledPin, OUTPUT);
WiFiMulti.addAP(ssid, password);
Serial.print("Connecting.");
}
void loop()
{
unsigned long currentMillis = millis();
if ((currentMillis - previousMillis) > WaitTime) { // wait for WiFi connection
if ((WiFiMulti.run() == WL_CONNECTED))
{
WiFiClient client;
HTTPClient http;
String payload;
// specify request destination
Serial.print("[HTTP] begin...\n");
if (http.begin(client, "http://api.openweathermap.org/data/2.5/weather?q=" + Location + "&APPID=" + API_Key)) // HTTP
{
Serial.print("[HTTP] GET...\n");
// start connection and send HTTP header
int httpCode = http.GET();
// httpCode will be negative on error
if (httpCode > 0) // check the returning code
{
// HTTP header has been send and Server response header has been handled
Serial.printf("[HTTP] GET... code: %d\n", httpCode);
// file found at server
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY)
{
payload = http.getString();
Serial.println(payload);
}
}
else
{
Serial.printf("[HTTP] GET... failed, error: %s\n",
http.errorToString(httpCode).c_str());
return;
}
/*
{"coord":{"lon":77.75,"lat":20.9333},
"weather":[{"id":804,"main":"Clouds","description":"overcast clouds","icon":"04n"}],
"base":"stations","main":{"temp":301.45,"feels_like":303.3,"temp_min":301.45,
"temp_max":301.45,"pressure":1004,"humidity":62,"sea_level":1004,"grnd_level":966},
"visibility":10000,"wind":{"speed":3.14,"deg":293,"gust":7.39},"clouds":{"all":94},
"dt":1628958953,"sys":{"country":"IN","sunrise":1628900858,"sunset":1628947200},
"timezone":19800,"id":1278718,"name":"Amrāvati","cod":200}
*/
StaticJsonDocument<1024> doc;
DeserializationError error = deserializeJson(doc, payload);
if (error)
{
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
// float coord_lon = doc["coord"]["lon"]; // 77.75
// float coord_lat = doc["coord"]["lat"]; // 20.9333
//
// JsonObject weather_0 = doc["weather"][0];
// int weather_0_id = weather_0["id"]; // 804
// const char* weather_0_main = weather_0["main"]; // "Clouds"
// const char* weather_0_description = weather_0["description"]; // "overcast clouds"
// const char* weather_0_icon = weather_0["icon"]; // "04n"
//
// const char* base = doc["base"]; // "stations"
//
JsonObject main = doc["main"];
float main_temp = main["temp"]; // 301.45
// float main_feels_like = main["feels_like"]; // 303.3
// float main_temp_min = main["temp_min"]; // 301.45
// float main_temp_max = main["temp_max"]; // 301.45
float main_pressure = main["pressure"]; // 1004
int main_humidity = main["humidity"]; // 62
// int main_sea_level = main["sea_level"]; // 1004
// int main_grnd_level = main["grnd_level"]; // 966
//
// int visibility = doc["visibility"]; // 10000
//
JsonObject wind = doc["wind"];
float wind_speed = wind["speed"]; // 3.14
int wind_deg = wind["deg"]; // 293
// float wind_gust = wind["gust"]; // 7.39
//
// int clouds_all = doc["clouds"]["all"]; // 94
//
// long dt = doc["dt"]; // 1628958953
//
// JsonObject sys = doc["sys"];
// const char* sys_country = sys["country"]; // "IN"
// long sys_sunrise = sys["sunrise"]; // 1628900858
// long sys_sunset = sys["sunset"]; // 1628947200
//
// int timezone = doc["timezone"]; // 19800
// long id = doc["id"]; // 1278718
// const char* name = doc["name"]; // "Amrāvati"
// int cod = doc["cod"]; // 200
// print data
Serial.printf("Temperature = %.2f°C\r\n", main_temp);
Serial.printf("Humidity = %d %%\r\n", main_humidity);
Serial.printf("Pressure = %.3f bar\r\n", main_pressure);
Serial.printf("Wind speed = %.1f m/s\r\n", wind_speed);
Serial.printf("Wind degree = %d°\r\n\r\n", wind_deg);
if ((ledState == LOW) && (main_temp >= 200) && (currentMillis - previousMillis >= OnTime)) {
ledState = HIGH; // Turn it off
previousMillis = currentMillis; // Remember the time
digitalWrite(ledPin, ledState); // Update the actual LED
}
else if ((ledState == HIGH) && (main_temp >= 200) && (currentMillis - previousMillis >= OffTime)) {
ledState = LOW; // turn it on
previousMillis = currentMillis; // Remember the time
digitalWrite(ledPin, ledState); // Update the actual LED
}
}
else
{
Serial.println("[HTTP] .begin() failed");
}
http.end(); //Close connection
}
previousMillis = currentMillis;
}
if (currentMillis < previousMillis + WaitTime) {
}
}