Niveau APPRENTISSAGE : ► Fort
Prérequis :
Matériel :
- 1 x NodeMCU Microcontroller Board
- 1 x Breadboard
(gratuit) Obtenir une clé API en vous inscrivant:
Version IDE :
Bibliothèque :
- ArduinoJson.h (Version 6.19.4)
- TimeLib.h (Version 1.6.1)
- ESP8266WiFi.h (Arduino-master 3.1.0-dev)
Vidéo de démonstration :
Schéma de câblage :
Code :
const char* ssid = "-----";
const char* password = "-----";
// ApiKey
//https://docs.thingpulse.com/how-tos/openweathermap-key/
String openWeatherMapApiKey = "-----";
//https://openweathermap.org/city/
String ville = "-----";
String Payscode = "-----";
String jsonBuffer;
int httpCode;
bool LoadingBoot;
unsigned long currentTime = 0;
unsigned long previousTime = 0;
#include <TimeLib.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
void setup(void) {
Serial.begin(9600);
Serial.println();
Serial.print("Connexion Wi-Fi à ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Wi-Fi Connecté avec Succès ! ");
Serial.print("Ip Local : ");
Serial.println(WiFi.localIP());
}
void loop(void) {
currentTime = millis();
if (WiFi.status() == WL_CONNECTED) //Check WiFi connection status
{
WiFiClient client;
if (((currentTime - previousTime) > 10000) || LoadingBoot == 0 ){
LoadingBoot = 1;
previousTime = currentTime;
HTTPClient http; //Déclarer un objet de classe HTTPClient
//Appelle les données météorologiques actuelles.
http.begin(client, "http://api.openweathermap.org/data/2.5/weather?q=" + ville + "," + Payscode + "&lang=fr&APPID=" + openWeatherMapApiKey + "&units=metric"); // !!
httpCode = http.GET(); //Envoyer la demande
if (httpCode > 0) // Vérifie le code de retour
{
String payload = http.getString(); //Obtenir la réponse à la demande
Serial.println("--- Données recu de openweathermap ---");
Serial.println(payload);
Serial.println("-----------------------------------------");
Serial.println("");
// Use https://arduinojson.org/v6/assistant to compute the capacity.
const size_t capacity = JSON_OBJECT_SIZE(544) + JSON_ARRAY_SIZE(239) + 60;
DynamicJsonDocument infosOP(capacity);
// Parse JSON object
DeserializationError error = deserializeJson(infosOP, payload);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
client.stop();
return;
}
//https://openweathermap.org/current
const char* OPVille = infosOP["name"]; // Ville
float OPCoordLon = infosOP["coord"]["lon"]; //Coordonnées géographiques (longitude).
float OPCoordLat = infosOP["coord"]["lat"];//Coordonnées géographiques (latitude).
JsonObject weather = infosOP["weather"][0];
int OPIdMeteo = weather["id"];// Identifiant de la condition météo
const char* OPCondMeteo = weather["main"];//Groupe de paramètres météorologiques (pluie, neige, extrême, etc.).
const char* OPDescrMeteo = weather["description"];//Description ciel.
const char* OPIdentIconeMeteo = weather["icon"];//Identifiant de l'icône météo.
float OPTempExt = infosOP["main"]["temp"];//Température °C.
float OPTempRessenti = infosOP["main"]["feels_like"];//Température Ressenti °C.
float OPTempExtMini = infosOP["main"]["temp_min"];//Température Mini °C.
float OPTempExtMax = infosOP["main"]["temp_max"];//Température Max °C.
float OPPression = infosOP["main"]["pressure"];//Pression atmosphérique au niveau de la mer, hPa.
int OPHumExt = infosOP["main"]["humidity"];// Humidité, %.
int OPvisibility = infosOP["visibility"];//Visibilité, mètre. La valeur maximale de la visibilité est de 10 km
float OPVitesseVent = infosOP["wind"]["speed"];//Vitesse du vent, Unité par défaut : mètre/sec.
int OPDirectionVent = infosOP["wind"]["deg"];//Direction du vent, degrés (météorologiques).
int OPRafaleVent = infosOP["wind"]["gust"];//Rafale de vent. Unité par défaut : mètre/sec.
int OPNebulosite = infosOP["clouds"]["all"];//Nébulosité, %.
unsigned long OPHeuredonnees = infosOP["dt"];//Heure de calcul des données, unix, UTC.
unsigned long OPSunrise = infosOP["sys"]["sunrise"];//Heure du lever du soleil, unix, UTC.
unsigned long OPSunset = infosOP["sys"]["sunset"];//Heure de coucher du soleil, unix, UTC.
const char* OPPays = infosOP["sys"]["country"]; // Indicatif du pays (GB, FR, etc.).
Serial.println("--- Details de l'ensemble des donnees ---");
Serial.printf("Ville = %s\r\n", OPVille);
Serial.printf("Coordonnees geographiques (longitude) : %.4f\r\n", OPCoordLon);
Serial.printf("Coordonnees geographiques (latitude) : %.4f\r\n", OPCoordLat);
Serial.printf("Identifiant de la condition meteo : %d\r\n", OPIdMeteo);
Serial.printf("Conditions météorologiques : %s\r\n", OPCondMeteo);
Serial.printf("Description ciel : %s\r\n", OPDescrMeteo);
Serial.printf("Identifiant de l'icône météo : %s\r\n", OPIdentIconeMeteo);
Serial.printf("Température : %.2f °C\r\n", OPTempExt);
Serial.printf("Température Ressenti : %.2f °C\r\n", OPTempRessenti);
Serial.printf("Température Mini : %.2f °C\r\n", OPTempExtMini);
Serial.printf("Température Max : %.2f °C\r\n", OPTempExtMax);
Serial.printf("Pression atmosphérique au niveau de la mer, hPa : %.2f hPa\r\n", OPPression);
Serial.printf("Humidité : %d %%\r\n", OPHumExt);
Serial.printf("Visibilité : %d m\r\n", OPvisibility);
Serial.printf("Vitesse du vent : %.2f mètre/sec\r\n", OPVitesseVent);
Serial.printf("Direction du vent : %d °\r\n", OPDirectionVent);
Serial.printf("Rafale de vent : %d mètre/sec\r\n", OPRafaleVent);
Serial.printf("Nébulosité : %d %%\r\n", OPNebulosite);
Serial.printf("Heure de calcul des données : %02d:%02d:%02d\n", hour(OPHeuredonnees), minute(OPHeuredonnees), second(OPHeuredonnees));
Serial.printf("Heure du lever du soleil : %02d:%02d:%02d\n", hour(OPSunrise), minute(OPSunrise), second(OPSunrise));
Serial.printf("Heure de coucher du soleil : %02d:%02d:%02d\n", hour(OPSunset), minute(OPSunset), second(OPSunset));
Serial.printf("Pays = %s\r\n", OPPays);
Serial.println("------------------------------------------");
Serial.println("");
Serial.println("");
}
}
}
}
Nombre de vues: 998