Aller au contenu


Photo
- - - - -

NodeMCU Weather Station on Arduino IDE


  • Veuillez vous connecter pour répondre
37 réponses à ce sujet

#21 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 18 septembre 2020 - 05:26

Vu que tu as récupérer le Json complet tu as fais le A) 

Et maintenant qu'on a vu ensemble comment récupérer les longitude et latitude tu devrais pouvoir modifier la ligne pour récupérer les valeurs contenu dans sunset et sunrise non ? Et ainsi faire l'étape B = extraire du json les informations dont tu as besoin . 

aller petit coup de pouce  je te fais la récupération du sunset : 


 

uint32_t sunset = root["sys"]["sunset"];


Comment est ce que tu récupère sunrise ? 
Comment est ce que j'ai su qu'il fallait mettre " sys " entre le premier [ ] et "sunset" entre le deuxième ? 

La réponse étant dans ton dernier message ...

Une fois que tu as récupérer tes valeur sunset et sunrise , comment son indiquée ces informations ? Quel est le format ? Dans quel format toi as tu besoin de ces info ? => Là tu attaquera le C = conversion des données 

...

 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#22 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 19 septembre 2020 - 06:22

Bonjour Mike,

j'ai réussi à afficher le sunrise "1600492508" sur l'ecran mais je ne sais pas comment convertir en

year,month,day,hour,minute,seconde.

d'avance merci .

#include <ESP8266WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <TimeLib.h>

const char* ssid     = "freeboxbabette";                 // SSID of local network
const char* password = "FC56BF8323";                    // Password on network
String APIKEY = "8b3016c8fecf7dad2d84dfba699ae0ba";                                 
String CityID = "6454924";                                 //Your City ID

WiFiClient client;
char servername[]="api.openweathermap.org";              // remote server we will connect to
String result;

int  counter = 60;                                      

String weatherDescription ="";
String weatherLocation = "";
uint32_t Sunrise;
String Country;
String weatherID;
float Temperature;
float Humidity;
float Pressure;
double Latitude = 0.0;
double Longitude = 0.0;

LiquidCrystal_I2C lcd(0x3F, 20, 4);    // Address of your i2c LCD back pack should be updated.

void setup() {
  Serial.begin(115200);
  int cursorPosition=0;
  lcd.begin();
  lcd.backlight();
  lcd.print("   Connecting");  
  Serial.println("Connecting");
  WiFi.begin(ssid, password);
 
             while (WiFi.status() != WL_CONNECTED)
            {
            delay(500);
            lcd.setCursor(cursorPosition,2);
            lcd.print(".");
            cursorPosition++;
            }
  lcd.clear();
  lcd.print("   Connected!");
  Serial.println("Connected");
  delay(1000);
}

void loop() {
    
    if(counter == 60)                                 //Get new data every 10 minutes
    {
      counter = 0;
      displayGettingData();
      delay(1000);
      getWeatherData();
    }else
    {
      counter++;
      displayWeather(weatherLocation,weatherDescription);
      delay(5000);
      displayConditions(Temperature,Humidity,Pressure,Latitude,Longitude,Sunrise);
      delay(5000);
    }
}

void getWeatherData()                                //client function to send/receive GET request data.
{
  if (client.connect(servername, 80))   
          {                                         //starts client connection, checks for connection
          client.println("GET /data/2.5/weather?id="+CityID+"&units=metric&APPID="+APIKEY);
          client.println("Host: api.openweathermap.org");
          client.println("User-Agent: ArduinoWiFi/1.1");
          client.println("Connection: close");
          client.println();
          }
  else {
         Serial.println("connection failed");        //error message if no client connect
          Serial.println();
       }

  while(client.connected() && !client.available())
  delay(1);                                          //waits for data
  while (client.connected() || client.available())    
       {                                             //connected or data available
         char c = client.read();                     //gets byte from ethernet buffer
         result = result+c;
       }

client.stop();                                      //stop client
result.replace('[', ' ');
result.replace(']', ' ');
Serial.println(result);
char jsonArray [result.length()+1];
result.toCharArray(jsonArray,sizeof(jsonArray));
jsonArray[result.length() + 1] = '\0';
StaticJsonBuffer<1024> json_buf;
JsonObject &root = json_buf.parseObject(jsonArray);

if (!root.success())
  {
    Serial.println("parseObject() failed");
  }

String location = root["name"];
String country = root["sys"]["country"];
uint32_t sunrise = root["sys"]["sunrise"];
float temperature = root["main"]["temp"];
float humidity = root["main"]["humidity"];
String weather = root["weather"]["main"];
String description = root["weather"]["description"];
float pressure = root["main"]["pressure"];
long time = root["time"];
double latitude = root["coord"]["lat"];
double longitude = root["coord"]["lon"];
weatherDescription = description;
weatherLocation = location;
Country = country;
Temperature = temperature;
Humidity = humidity;
Pressure = pressure;
Latitude = latitude;
Longitude = longitude;
Sunrise =  sunrise;

}

void displayWeather(String location,String description)
{
 
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(location);
  lcd.print(", ");
  lcd.print(Country);
  lcd.setCursor(0,1);
  lcd.print(description);               //print sunrise
 
 
}

void displayConditions(float Temperature,float Humidity, float Pressure,double latitude,double longitude,uint32_t Sunrise )
{
 lcd.clear();                            //Print Temperature
 lcd.print("T:");
 lcd.print(Temperature,1);
 lcd.print((char)223);
 lcd.print("C ");
                                         
 lcd.print(" H:");                       //Print Humidity
 lcd.print(Humidity,0);
 lcd.print(" %");
 
 lcd.setCursor(0,1);                     //Print Pressure
 lcd.print("P: ");
 lcd.print(Pressure,1);
 lcd.print(" hPa");
 
 lcd.setCursor(0,2);                    //Print Latitude
 lcd.print("Lat:");
 lcd.print(latitude, 2);
 
 lcd.setCursor(10,2);                   //Print Longitude
 lcd.print("Lon:");
 lcd.print(longitude, 2);
        
 lcd.setCursor(0,3);                    //Print Sunrise
 lcd.print(Sunrise);
}

void displayGettingData()
{
  lcd.clear();
  lcd.print("Getting data");
}
 


#23 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 19 septembre 2020 - 06:44

Je pense que tout ce que tu as besoin est dans cette lib : 

http://www.nongnu.org/avr-libc/user-manual/group__avr__time.html#gaa9336f97d394e8e02d97b9ff4fb0aca2

 

reste à savoir l'utiliser ;) 

Petit bonus ça semble aussi calculer les phases de la lune.


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#24 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 20 septembre 2020 - 10:30

bonjour Mike,

je te rappel que je suis amateur et ta librairie je n'y comprend rien du tout .

Bon dimanche .



#25 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 20 septembre 2020 - 04:15

reBonjour,Mike

j'ai fait ce code cela fonctionne très bien dans son contexte mais impossible de le mettre dans mon code .

 ne crois pas que je me repose sur toi .

j'ai chercher toute l’après-midi mais rien à faire je ne trouve pas .

bonne soirée.

Serial.println :

sunrise
20.09.2020 07:16:15 sunrise +2
 

#include <TimeLib.h>
#include <ArduinoJson.h>

void setup() {

  Serial.begin(115200);
 
  const char* json = "{\"country\":\"JP\",\"sunrise\":1600578975,\"sunset\":1369821049,\"timezone\":7200}";
  int timezone = +2;

  DynamicJsonBuffer jsonBuffer;
  JsonObject& root = jsonBuffer.parseObject(json);

  unsigned long t = root["sunrise"];

  char buff[32];
  sprintf(buff, "%02d.%02d.%02d %02d:%02d:%02d", day(t), month(t), year(t), hour(t)+timezone, minute(t), second(t));
  Serial.println("sunrise");
  Serial.print(buff);
}

void loop() {
 
}


#26 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 20 septembre 2020 - 09:22

Oui tu es amateur pas de problème, mais oui il faut que tu cherches aussi par toi même et j'ai eu raison de te laisser chercher : tu as déjà trouvé par toi même comment l'utiliser dans un code d'exemple ! Bravo, une étape qui marche bien! 

 

Maintenant il faut apprendre à fusionner des codes, et pour ça il faut aller étape par étape. 

 

Par de ce code que tu as et commence par ajouter le " hello world " avec juste l'écran lcd, puis  quand ça marche ajoute juste la connexion à l'api, puis une fois que ça marche ajoute les initialisations des variable, puis quand ça marche ajoute ce qui est dans le while ... Regarde les codes de test précédent que je t'ai fournis. 
 

Essaye à minima d'ajouter l'affichage avec l'écran lcd dans ton code d'exemple ci dessus, et poste où tu en es quand tu bloque. 

" Donne un poisson à un homme, il mangera un jour, apprend lui à pêcher il mangera toute sa vie " ... 
Moi je te donne un peu de poisson et j'essaye surtout de t'apprendre à pêcher ! =) 

Bonne continuation ;) Et surtout ne te décourage pas, tu avances ça se voit ;)


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#27 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 21 septembre 2020 - 04:05

Bonjour Mike ,

tu m'a dit de venir quand j’étais bloquer .

CE CODE FONCTIONNE j'ai bien date,mois,année,heure,minute,seconde(sunrise)

 
#include <TimeLib.h>
#include <ArduinoJson.h>

int timezone = +2;
int root;
int SunriseHour;
int SunriseMin;

void setup() {

  Serial.begin(115200);
 
}

void loop() {
  Sunrise();
 
}
 void Sunrise(){
  const char* json = "{\"country\":\"JP\",\"sunrise\":1600665442,\"sunset\":1369821049,\"timezone\":7200}";
  DynamicJsonBuffer jsonBuffer;
  JsonObject& root = jsonBuffer.parseObject(json);
  unsigned long t = root["sunrise"];
  char buff[32];
  sprintf(buff, "%02d.%02d.%02d %02d:%02d:%02d", day(t), month(t), year(t), hour(t)+timezone, minute(t), second(t));
  Serial.println("sunrise");
  Serial.println(buff);
  SunriseHour = (buff ,hour(t)+timezone);
  SunriseMin = (buff,minute(t));
  Serial.println("sunriseMin");
  Serial.println (SunriseHour*60+SunriseMin);
 
}
 

j'ai voulu le mettre dans mon code avec le wifi et la j'ai une panne "expected primary-expression before ',' à la ligne

sprintf( buff,"%02d.%02d.%02d %02d:%02d:%02d", day(t), month(t), year(t), hour(t)+timezone, minute(t), second(t));

dans void Sunrise()

d'avance merci

#include <ESP8266WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <TimeLib.h>

int SunriseHour;
int SunsetHour;
int SunriseMin;
int SunsetMin;

const char* ssid     = "freeboxbabette";                 // SSID of local network
const char* password = "FC56BF8323";                    // Password on network
String APIKEY = "8b3016c8fecf7dad2d84dfba699ae0ba";                                 
String CityID = "6454924";                                 //Your City ID

WiFiClient client;
char servername[]="api.openweathermap.org";              // remote server we will connect to
String result;

int  counter = 60;                                      

String weatherDescription ="";
String weatherLocation = "";
//uint32_t Sunrise;
String Country;
String weatherID;
float Temperature;
float Humidity;
float Pressure;
double Latitude = 0.0;
double Longitude = 0.0;

LiquidCrystal_I2C lcd(0x3F, 20, 4);    // Address of your i2c LCD back pack should be updated.

void setup() {
  Serial.begin(115200);
  int cursorPosition=0;
  lcd.begin();
  lcd.backlight();
  lcd.print("   Connecting");  
  Serial.println("Connecting");
  WiFi.begin(ssid, password);
 
             while (WiFi.status() != WL_CONNECTED)
            {
            delay(500);
            lcd.setCursor(cursorPosition,2);
            lcd.print(".");
            cursorPosition++;
            }
  lcd.clear();
  lcd.print("   Connected!");
  Serial.println("Connected");
  delay(1000);
}

void loop() {
    Sunrise();
    if(counter == 60)                                 //Get new data every 10 minutes
    {
      counter = 0;
      displayGettingData();
      delay(1000);
      getWeatherData();
    }else
    {
      counter++;
      displayWeather(weatherLocation,weatherDescription);
      delay(5000);
      displayConditions(Temperature,Humidity,Pressure,Latitude,Longitude);
      delay(5000);
    }
}

void getWeatherData()                                //client function to send/receive GET request data.
{
  if (client.connect(servername, 80))   
          {                                         //starts client connection, checks for connection
          client.println("GET /data/2.5/weather?id="+CityID+"&units=metric&APPID="+APIKEY);
          client.println("Host: api.openweathermap.org");
          client.println("User-Agent: ArduinoWiFi/1.1");
          client.println("Connection: close");
          client.println();
          }
  else {
         Serial.println("connection failed");        //error message if no client connect
          Serial.println();
       }

  while(client.connected() && !client.available())
  delay(1);                                          //waits for data
  while (client.connected() || client.available())    
       {                                             //connected or data available
         char c = client.read();                     //gets byte from ethernet buffer
         result = result+c;
       }

client.stop();                                      //stop client
result.replace('[', ' ');
result.replace(']', ' ');
Serial.println(result);
char jsonArray [result.length()+1];
result.toCharArray(jsonArray,sizeof(jsonArray));
jsonArray[result.length() + 1] = '\0';
StaticJsonBuffer<1024> json_buf;
JsonObject &root = json_buf.parseObject(jsonArray);

if (!root.success())
  {
    Serial.println("parseObject() failed");
  }

String location = root["name"];
String country = root["sys"]["country"];
//unsigned long t = root["sys"]["sunrise"];
float temperature = root["main"]["temp"];
float humidity = root["main"]["humidity"];
String weather = root["weather"]["main"];
String description = root["weather"]["description"];
float pressure = root["main"]["pressure"];
long time = root["time"];
double latitude = root["coord"]["lat"];
double longitude = root["coord"]["lon"];
weatherDescription = description;
weatherLocation = location;
Country = country;
Temperature = temperature;
Humidity = humidity;
Pressure = pressure;
Latitude = latitude;
Longitude = longitude;


}

void displayWeather(String location,String description)
{
 
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(location);
  lcd.print(", ");
  lcd.print(Country);
  lcd.setCursor(0,1);
  lcd.print(description);               //print sunrise
 
 
}

void displayConditions(float Temperature,float Humidity, float Pressure,double latitude,double longitude)
{
 lcd.clear();                            //Print Temperature
 lcd.print("T:");
 lcd.print(Temperature,1);
 lcd.print((char)223);
 lcd.print("C ");
                                         
 lcd.print(" H:");                       //Print Humidity
 lcd.print(Humidity,0);
 lcd.print(" %");
 
 lcd.setCursor(0,1);                     //Print Pressure
 lcd.print("P: ");
 lcd.print(Pressure,1);
 lcd.print(" hPa");
 
 lcd.setCursor(0,2);                    //Print Latitude
 lcd.print("Lat:");
 lcd.print(latitude, 2);
 
 lcd.setCursor(10,2);                   //Print Longitude
 lcd.print("Lon:");
 lcd.print(longitude, 2);
 
}

void displayGettingData()
{
  lcd.clear();
  lcd.print("Getting data");
}
void Sunrise(){
  int root;
  unsigned long t = root["sunrise"];
  char buff[32];
  sprintf( buff,"%02d.%02d.%02d %02d:%02d:%02d", day(t), month(t), year(t), hour(t)+timezone, minute(t), second(t));
  Serial.println("sunrise");
  Serial.println(buff);
  SunriseHour = (buff ,hour(t)+timezone);
  SunriseMin = (buff,minute(t));
  Serial.println("sunriseMin");
  Serial.println (SunriseHour*60+SunriseMin);
 
}
 
 
 
 
 
 
 
 
 
 


#28 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 21 septembre 2020 - 11:25

Ok là tu as un problème " structurel " . 

root["sunrise"] n'existe pas dans ta fonction Sunrise. 

Il faut que tu fasse une fonction qui va prendre quelque chose en paramètre. 

Exemple un uint32_t ( = unsigned long )  ... 

Et ta fonction va prendre ce long et l'afficher en mode date heure etc ... 
Et tu pourras passer dans ta fonction sunrise  en paramètre ton " //unsigned long t = root["sys"]["sunrise"]; "   

 

Qui est actuellement commenté alors qu'il est très bien là où il est ... 
Par contre je recommande de changer le nom de la variable ... t c'est pas un super nom pour un sunrise ...

Aller à toi de modifier ta fonction sunrise maintenant ! =)

 


 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#29 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 22 septembre 2020 - 04:49

Bonjour Mike,

je n'ai toujours pas trouver comment faire .

uint32_t (= unsigned long) ; comme ça il me dit '=' pas bon

uint32_t ( unsigned long) ;'(' pas bon

uint32_t  unsigned long) ; ')' pas bon

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

unsigned long t ;
uint32_t  unsigned long ; declaration does not declare anything [-fpermissive]
uint32_t (= unsigned long) ;

j'ai passer toute l' aprés-midi sans résultat .

voila bonne soirée .



#30 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 23 septembre 2020 - 06:21

void Sunrise(uint32_t t){
  char buff[32];
  sprintf( buff,"%02d.%02d.%02d %02d:%02d:%02d", day(t), month(t), year(t), hour(t)+timezone, minute(t), second(t));
  Serial.println("sunrise");
  Serial.println(buff);
  SunriseHour = (buff ,hour(t)+timezone);
  SunriseMin = (buff,minute(t));
  Serial.println("sunriseMin");
  Serial.println (SunriseHour*60+SunriseMin);
 
}

// Tu peux choisir selon ta préférence le type unsigned long et le type uint32_t ils sont équivalent... moi je préfère spécifier la taille avec uint32_t

Savoir adapter la taille de ses variables en c : https://www.robot-ma...variables-en-c/


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#31 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 23 septembre 2020 - 10:44

bonjour Mike,

toujours un soucis  Sunrise(uint32_t t);   expected primary-expression before 't'

#include <ESP8266WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <TimeLib.h>
int Sunrise;
int SunriseHour;
int SunsetHour;
int SunriseMin;
int SunsetMin;

const char* ssid     = "freeboxbabette";                 // SSID of local network
const char* password = "FC56BF8323";                    // Password on network
String APIKEY = "8b3016c8fecf7dad2d84dfba699ae0ba";                                 
String CityID = "6454924";                                 //Your City ID

WiFiClient client;
char servername[]="api.openweathermap.org";              // remote server we will connect to
String result;

int  counter = 60;                                      

String weatherDescription ="";
String weatherLocation = "";
String Country;
String weatherID;
float Temperature;
float Humidity;
float Pressure;
double Latitude = 0.0;
double Longitude = 0.0;
//uint32_t t Sunrise;

LiquidCrystal_I2C lcd(0x3F, 20, 4);    // Address of your i2c LCD back pack should be updated.

void setup() {
  Serial.begin(115200);
  int cursorPosition=0;
  lcd.begin();
  lcd.backlight();
  lcd.print("   Connecting");  
  Serial.println("Connecting");
  WiFi.begin(ssid, password);
 
             while (WiFi.status() != WL_CONNECTED)
            {
            delay(500);
            lcd.setCursor(cursorPosition,2);
            lcd.print(".");
            cursorPosition++;
            }
  lcd.clear();
  lcd.print("   Connected!");
  Serial.println("Connected");
  delay(1000);
}

void loop() {
    Sunrise(uint32_t t);   expected primary-expression before 't'
    if(counter == 60)                                 //Get new data every 10 minutes
    {
      counter = 0;
      displayGettingData();
      delay(1000);
      getWeatherData();
    }else
    {
      counter++;
      displayWeather(weatherLocation,weatherDescription);
      delay(5000);
      displayConditions(Temperature,Humidity,Pressure,Latitude,Longitude);
      delay(5000);
    }
}

void getWeatherData()                                //client function to send/receive GET request data.
{
  if (client.connect(servername, 80))   
          {                                         //starts client connection, checks for connection
          client.println("GET /data/2.5/weather?id="+CityID+"&units=metric&APPID="+APIKEY);
          client.println("Host: api.openweathermap.org");
          client.println("User-Agent: ArduinoWiFi/1.1");
          client.println("Connection: close");
          client.println();
          }
  else {
         Serial.println("connection failed");        //error message if no client connect
          Serial.println();
       }

  while(client.connected() && !client.available())
  delay(1);                                          //waits for data
  while (client.connected() || client.available())    
       {                                             //connected or data available
         char c = client.read();                     //gets byte from ethernet buffer
         result = result+c;
       }

client.stop();                                      //stop client
result.replace('[', ' ');
result.replace(']', ' ');
Serial.println(result);
char jsonArray [result.length()+1];
result.toCharArray(jsonArray,sizeof(jsonArray));
jsonArray[result.length() + 1] = '\0';
StaticJsonBuffer<1024> json_buf;
JsonObject &root = json_buf.parseObject(jsonArray);

if (!root.success())
  {
    Serial.println("parseObject() failed");
  }
uint32_t t = root["sunrise"];
String location = root["name"];
String country = root["sys"]["country"];
float humidity = root["main"]["humidity"];
String weather = root["weather"]["main"];
String description = root["weather"]["description"];
float pressure = root["main"]["pressure"];
long time = root["time"];
double latitude = root["coord"]["lat"];
double longitude = root["coord"]["lon"];
weatherDescription = description;
weatherLocation = location;
Country = country;
Temperature = temperature;
Humidity = humidity;
Pressure = pressure;
Latitude = latitude;
Longitude = longitude;


}

void displayWeather(String location,String description)
{
 
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(location);
  lcd.print(", ");
  lcd.print(Country);
  lcd.setCursor(0,1);
  lcd.print(description);               
 
}

 lcd.print;
}
void displayConditions(float Temperature,float Humidity, float Pressure,double latitude,double longitude)
{
 lcd.clear();                            //Print Temperature
 lcd.print("T:");
 lcd.print(Temperature,1);
 lcd.print((char)223);
 lcd.print("C ");
                                         
 lcd.print(" H:");                       //Print Humidity
 lcd.print(Humidity,0);
 lcd.print(" %");
 
 lcd.setCursor(0,1);                     //Print Pressure
 lcd.print("P: ");
 lcd.print(Pressure,1);
 lcd.print(" hPa");
 
 lcd.setCursor(0,2);                    //Print Latitude
 lcd.print("Lat:");
 lcd.print(latitude, 2);
 
 lcd.setCursor(10,2);                   //Print Longitude
 lcd.print("Lon:");
 lcd.print(longitude, 2);
 
}

void displayGettingData()
{
  lcd.clear();
  lcd.print("Getting data");
}
void Sunrise(uint32_t t){
  uint32_t t = root["sunrise"];
  char buff[32];
  sprintf( buff,"%02d.%02d.%02d %02d:%02d:%02d", day(t), month(t), year(t), hour(t)+timezone, minute(t), second(t));
  Serial.println("sunrise");
  Serial.println(buff);
  SunriseHour = (buff ,hour(t)+timezone);
  SunriseMin = (buff,minute(t));
  Serial.println("sunriseMin");
  Serial.println (SunriseHour*60+SunriseMin);
 
}
 
 


#32 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 23 septembre 2020 - 11:23

quand tu déclares une fonction tu dois spécifier le type des paramètres. ( ainsi que le type de la fonction qui est " void " dans notre cas ici )

=> 
 

void Sunrise(uint32_t t){
// le contenu de ma fonction
}

quand tu utilises une fonction il ne faut pas "redéclarer" le type du paramètre ( ni le "void " qui est le type de la fonction  )

=> 
 

Sunrise(t);

Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#33 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 23 septembre 2020 - 11:31

Bonjour,

il faut différencier deux choses :

1) Quand tu déclare ta fonction, il faut préciser le type des variables :

 

mon_type_de_retour ma_fonction(type1 variable1, type2 variable2, ...)

{

  //le contenu de la fonction

  return une_valeur_de_type_mon_type_de_retour

}

2) L'appel à la fonction (ie quand tu veux l'utiliser). A ce moment, il faut uniquement lui passer des valeurs (ie le résultat d'un calcul, sachant que si tu mets une variable, bah le résultat est la valeur de la variable).

mon_type_de_retour resultat;

reultat=ma_fonction(valeur1, valeur2, ...);

Un exemple plus concret :

double ma_fonction(uint32_t partie_entiere, double partie_decimale)
{
   double resultat=partie_entiere + partie_decimale;
   return resultat
}
loop()
{
  double resultat1=ma_fonction(22, 0.03);  //on mets des valeurs écrites explicitement
  uint32_t grand_nombre=99999999;
  double partie_dec=0.99;
  double resultat2=ma_fonction(grand_nombre, partie_dec);  //on mets les valeurs contenues dans des variabels
  uint32_t petit_nombre=42;
  double resultat3=ma_fonction(grand_nombre + petit_nombre -3 , 0.22+0.11*1.3);  //on met les valeurs du résultat d'un calcul

 

 


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#34 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 23 septembre 2020 - 01:08

Mike ,

't' was not declared in this scope sur Sunrise(t); dans void loop()

#include <ESP8266WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <TimeLib.h>
int Sunrise;
int SunriseHour;
int SunsetHour;
int SunriseMin;
int SunsetMin;

const char* ssid     = "freeboxbabette";                 // SSID of local network
const char* password = "FC56BF8323";                    // Password on network
String APIKEY = "8b3016c8fecf7dad2d84dfba699ae0ba";                                 
String CityID = "6454924";                                 //Your City ID

WiFiClient client;
char servername[]="api.openweathermap.org";              // remote server we will connect to
String result;

int  counter = 60;                                      

String weatherDescription ="";
String weatherLocation = "";
String Country;
String weatherID;
float Temperature;
float Humidity;
float Pressure;
double Latitude = 0.0;
double Longitude = 0.0;
//uint32_t t Sunrise;

LiquidCrystal_I2C lcd(0x3F, 20, 4);    // Address of your i2c LCD back pack should be updated.

void setup() {
  Serial.begin(115200);
  int cursorPosition=0;
  lcd.begin();
  lcd.backlight();
  lcd.print("   Connecting");  
  Serial.println("Connecting");
  WiFi.begin(ssid, password);
 
             while (WiFi.status() != WL_CONNECTED)
            {
            delay(500);
            lcd.setCursor(cursorPosition,2);
            lcd.print(".");
            cursorPosition++;
            }
  lcd.clear();
  lcd.print("   Connected!");
  Serial.println("Connected");
  delay(1000);
}

void loop() {
    Sunrise(t);
    if(counter == 60)                                 //Get new data every 10 minutes
    {
      counter = 0;
      displayGettingData();
      delay(1000);
      getWeatherData();
    }else
    {
      counter++;
      displayWeather(weatherLocation,weatherDescription);
      delay(5000);
      displayConditions(Temperature,Humidity,Pressure,Latitude,Longitude);
      delay(5000);
    }
}

void getWeatherData()                                //client function to send/receive GET request data.
{
  if (client.connect(servername, 80))   
          {                                         //starts client connection, checks for connection
          client.println("GET /data/2.5/weather?id="+CityID+"&units=metric&APPID="+APIKEY);
          client.println("Host: api.openweathermap.org");
          client.println("User-Agent: ArduinoWiFi/1.1");
          client.println("Connection: close");
          client.println();
          }
  else {
         Serial.println("connection failed");        //error message if no client connect
          Serial.println();
       }

  while(client.connected() && !client.available())
  delay(1);                                          //waits for data
  while (client.connected() || client.available())    
       {                                             //connected or data available
         char c = client.read();                     //gets byte from ethernet buffer
         result = result+c;
       }

client.stop();                                      //stop client
result.replace('[', ' ');
result.replace(']', ' ');
Serial.println(result);
char jsonArray [result.length()+1];
result.toCharArray(jsonArray,sizeof(jsonArray));
jsonArray[result.length() + 1] = '\0';
StaticJsonBuffer<1024> json_buf;
JsonObject &root = json_buf.parseObject(jsonArray);

if (!root.success())
  {
    Serial.println("parseObject() failed");
  }
//uint32_t t = root["sunrise"];
String location = root["name"];
String country = root["sys"]["country"];
float humidity = root["main"]["humidity"];
String weather = root["weather"]["main"];
String description = root["weather"]["description"];
float pressure = root["main"]["pressure"];
long time = root["time"];
double latitude = root["coord"]["lat"];
double longitude = root["coord"]["lon"];
weatherDescription = description;
weatherLocation = location;
Country = country;
Temperature = temperature;
Humidity = humidity;
Pressure = pressure;
Latitude = latitude;
Longitude = longitude;


}

void displayWeather(String location,String description)
{
 
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(location);
  lcd.print(", ");
  lcd.print(Country);
  lcd.setCursor(0,1);
  lcd.print(description);               
 
}

 lcd.print;
}
void displayConditions(float Temperature,float Humidity, float Pressure,double latitude,double longitude)
{
 lcd.clear();                            //Print Temperature
 lcd.print("T:");
 lcd.print(Temperature,1);
 lcd.print((char)223);
 lcd.print("C ");
                                         
 lcd.print(" H:");                       //Print Humidity
 lcd.print(Humidity,0);
 lcd.print(" %");
 
 lcd.setCursor(0,1);                     //Print Pressure
 lcd.print("P: ");
 lcd.print(Pressure,1);
 lcd.print(" hPa");
 
 lcd.setCursor(0,2);                    //Print Latitude
 lcd.print("Lat:");
 lcd.print(latitude, 2);
 
 lcd.setCursor(10,2);                   //Print Longitude
 lcd.print("Lon:");
 lcd.print(longitude, 2);
 
}

void displayGettingData()
{
  lcd.clear();
  lcd.print("Getting data");
}
void Sunrise(uint32_t t){
  uint32_t t = root["sunrise"];
  char buff[32];
  sprintf( buff,"%02d.%02d.%02d %02d:%02d:%02d", day(t), month(t), year(t), hour(t)+timezone, minute(t), second(t));
  Serial.println("sunrise");
  Serial.println(buff);
  SunriseHour = (buff ,hour(t)+timezone);
  SunriseMin = (buff,minute(t));
  Serial.println("sunriseMin");
  Serial.println (SunriseHour*60+SunriseMin);
 
}
 
 
 


#35 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 23 septembre 2020 - 01:21

Bonjour,

le problème est exactement ce que te dis le compilateur : la variable t n'est pas définie (ie n'existe pas) dans loop.

 

Concrètement, il faut sortir la ligne suivante de la fonction Sunset et la mettre dans le loop (avant l'appel à Sunset) :

uint32_t t = root["sunrise"];

 


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#36 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 23 septembre 2020 - 01:22

Il faut que tu comprennes un minimum ce que tu fais ... 

1) Explique moi ce que fait la fonction sunrise. 

   a ) Donne moi un exemple de valeur que tu peux mettre en paramètre de la fonction sunrise 

   b ) Dis moi ce qui va être affiché sur le moniteur série

2) Comment est ce qu'on va récupérer la valeur qu'on met en paramètre de la fonction? 
    a )  D'où est ce qu'elle vient de base?

    b )  Quelle ligne de code fait on pour récupérer cette valeur  ?
    c ) Où est ce qu'on va mettre ce code de récupération de la valeur ?

    d ) Dans quelle variable stock tu la valeur ? 
    e ) Où est ce que tu déclare la variable de stockage ?  Est ce que c'est une variable locale ou globale ? Quel est ton besoin ?

 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#37 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 23 septembre 2020 - 02:41

Mike ,

je vois bien que je t'énerve parce que je ne comprend pas  .

j'en suis profondément désolé .

merci pour tes efforts et tant pis pour moi je n'arrive pas à faire ce programme .

Je laisse tomber .

bonne soirée .



#38 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 23 septembre 2020 - 03:06

Non je ne m'énerve pas! =) 
Et non il ne faut pas laisser tomber! ( quand je ne répondrais plus aux messages c'est que j'en aurais marre :) )

Par contre pour que tu puisse réussir il faut que tu comprennes ce que tu fais. 
Pour cela il faut que tu sois capable de répondre aux questions que j'ai posé. 
Essaye de réponde comme tu penses et on verra.
Si tu ne sais pas,  il va falloir qu'on revienne un peu en arrière pour que tu sache avant de pouvoir continuer. 


Pour programmer c'est un peu comme faire une maison, il faut avoir une "base solide". 
Il faut que tu comprennes ce que tu fais, sinon tu construis une maison sur de mauvaises fondation et tout se casse la figure. 

Au lieu d'essayer de te faire construire une maison qui va se casser la figure j'essaye de t'aider à finaliser les fondations d'abord.
 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 





0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users