Connexion à open weather map à plusieurs reprises avec Esp 8266

Salut tout le monde, je souhaite calculer la puissance actuelle fournis par toutes les éoliennes présentes sur le territoire marocain en fonction de la vitesse du vent à chaque parc éolienne, du coup j'utilise un esp 8266 connecté à un arduino mega qui récupère ces données via un API, je dois donc me connecter 10 fois à L'API pour récupérer la donnée à 10 endroits différents, cependant il arrive que la connexion à open weather map échou à l'une des 10 connexions et fausse l'intégralité du calcul,
Y'a-t-il un moyen pour réessayer de se connecter au cas ou ça échou à l'une des 10 reprises, voici mon programme actuel


#include <ArduinoJson.h>
#define DST_IP "api.openweathermap.org"


String NomduRéseauWifi "xxxxxxxxxxxxx" ; // Garder les guillements
String MotDePasse      = "xxxxxxxxx"; // Garder les guillements
DynamicJsonDocument doc(64);
/****************************************************************/
/*                             INIT                             */
/****************************************************************/
void setup()
{
  Serial.begin(9600);
  Serial1.begin(115200);  
  initESP8266();
}
/****************************************************************/
/*                        BOUCLE INFINIE                        */
/****************************************************************/
void loop()
{
  /* while(Serial1.available())
   {    
     Serial.println(Serial1.readString());
   }  */
   
}
/****************************************************************/
/*                Fonction qui initialise l'ESP8266             */
/****************************************************************/
void initESP8266()
{  
  Serial.println("**********************************************************");  
  Serial.println("**************** DEBUT DE L'INITIALISATION ***************");
  Serial.println("**********************************************************");  
  envoieAuESP8266("AT+RST");
  recoitDuESP8266(2000);
  Serial.println("**********************************************************");
  /*envoieAuESP8266("AT+CWMODE=1");
  recoitDuESP8266(5000);
  Serial.println("**********************************************************");*/
  envoieAuESP8266("AT+CWJAP=\""+ NomduReseauWifi + "\",\"" + MotDePasse +"\"");
  recoitDuESP8266(20000);
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPMUX=0");  
  recoitDuESP8266(1000);
  Serial.println("**********************************************************");
  String cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += DST_IP;
  cmd += "\",80";
  envoieAuESP8266(cmd);
  recoitDuESP8266(10000);
  if(Serial.find("ERROR")) return;
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPSEND=72");
  //recoitDuESP8266(2000);
  cmd ="GET /data/2.5/weather?q=Tangier&appid=XXXXXXXXXXXXXXXXXXX";
  recoitDuESP8266(2000);
  envoieAuESP8266(cmd);
  unsigned int i = 0; //timeout counter
  int n = 1; // char counter
  String json="{";
  size_t inputLength=22;
  while (!Serial1.find("\"wind\":{")){}
  while (i<60000) {
    if(Serial1.available()) {
     
      char c = Serial1.read();
      json=json+c;
      Serial.print(c);
      if(c=='}'){
        Serial.println ("fichier json trouvé");
      break;}
      n++;
     
      i=0;
     
    }
    i++;
  }
  Serial.println(n);
 
  DeserializationError error = deserializeJson(doc, json);
  if (error) {
  Serial.print(F("deserializeJson() failed: "));
  Serial.println(error.f_str());
  return;
}
  float vent_parcs_tanger = doc["speed"];
  Serial.print("la vitesse du vent en m/s est de l'ordre de: ");
  Serial.print((float)vent_parcs_tanger);
  recoitDuESP8266(40000);
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPMUX=0");  
  recoitDuESP8266(1000);
  Serial.println("**********************************************************");
  cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += DST_IP;
  cmd += "\",80";
  envoieAuESP8266(cmd);
  recoitDuESP8266(10000);
  if(Serial.find("ERROR")) return;
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPSEND=83");
  //recoitDuESP8266(2000);
  cmd ="GET /data/2.5/weather?q=Sakia%20El%20Hamra&appid=XXXXXXXXXXXXXXXXXXXXXXXXXXXX";
  recoitDuESP8266(2000);
  envoieAuESP8266(cmd);
  i = 0; //timeout counter
  n = 1; // char counter
  json="{";
  inputLength=22;
  while (!Serial1.find("\"wind\":{")){}
  while (i<60000) {
    if(Serial1.available()) {
     
      char c = Serial1.read();
      json=json+c;
      Serial.print(c);
      if(c=='}'){
        Serial.println ("fichier json trouvé");
      break;}
      n++;
     
      i=0;
     
    }
    i++;
  }
  Serial.println(n);
 
  error = deserializeJson(doc, json);
  if (error) {
  Serial.print(F("deserializeJson() failed: "));
  Serial.println(error.f_str());
  return;
}
  float vent_parc_aftissat = doc["speed"];
  Serial.print("la vitesse du vent en m/s est de l'ordre de: ");
  Serial.print((float)vent_parc_aftissat);
  recoitDuESP8266(40000);
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPMUX=0");  
  recoitDuESP8266(1000);
  Serial.println("**********************************************************");
  cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += DST_IP;
  cmd += "\",80";
  envoieAuESP8266(cmd);
  recoitDuESP8266(10000);
  if(Serial.find("ERROR")) return;
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPSEND=72");
  //recoitDuESP8266(2000);
  cmd ="GET /data/2.5/weather?q=Tarfaya&appid=XXXXXXXXXXXXXXXXXX";
  recoitDuESP8266(2000);
  envoieAuESP8266(cmd);
  i = 0; //timeout counter
  n = 1; // char counter
  json="{";
  inputLength=22;
  while (!Serial1.find("\"wind\":{")){}
  while (i<60000) {
    if(Serial1.available()) {
     
      char c = Serial1.read();
      json=json+c;
      Serial.print(c);
      if(c=='}'){
        Serial.println ("fichier json trouvé");
      break;}
      n++;
     
      i=0;
     
    }
    i++;
  }
  Serial.println(n);
 
  error = deserializeJson(doc, json);
  if (error) {
  Serial.print(F("deserializeJson() failed: "));
  Serial.println(error.f_str());
  return;
}
  float vent_parc_akhfenir = doc["speed"];
  Serial.print("la vitesse du vent en m/s est de l'ordre de: ");
  Serial.print((float)vent_parc_akhfenir);
  recoitDuESP8266(40000);
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPMUX=0");  
  recoitDuESP8266(1000);
  Serial.println("**********************************************************");
  cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += DST_IP;
  cmd += "\",80";
  envoieAuESP8266(cmd);
  recoitDuESP8266(10000);
  if(Serial.find("ERROR")) return;
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPSEND=73");
  //recoitDuESP8266(2000);
  cmd ="GET /data/2.5/weather?q=Laayoune&appid=XXXXXXXXXXXXXXX";
  recoitDuESP8266(2000);
  envoieAuESP8266(cmd);
  i = 0; //timeout counter
  n = 1; // char counter
  json="{";
  inputLength=22;
  while (!Serial1.find("\"wind\":{")){}
  while (i<60000) {
    if(Serial1.available()) {
     
      char c = Serial1.read();
      json=json+c;
      Serial.print(c);
      if(c=='}'){
        Serial.println ("fichier json trouvé");
      break;}
      n++;
     
      i=0;
     
    }
    i++;
  }
  Serial.println(n);
  error = deserializeJson(doc, json);
  if (error) {
  Serial.print(F("deserializeJson() failed: "));
  Serial.println(error.f_str());
  return;
}
  float vent_parcs_laayoune = doc["speed"];
  Serial.print("la vitesse du vent en m/s est de l'ordre de: ");
  Serial.print((float)vent_parcs_laayoune);
  recoitDuESP8266(40000);
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPMUX=0");  
  recoitDuESP8266(1000);
  Serial.println("**********************************************************");
  cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += DST_IP;
  cmd += "\",80";
  envoieAuESP8266(cmd);
  recoitDuESP8266(10000);
  if(Serial.find("ERROR")) return;
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPSEND=70");
  //recoitDuESP8266(2000);
  cmd ="GET /data/2.5/weather?q=Ceuta&appid=XXXXXXXXXXXXXXXXXXXX";
  recoitDuESP8266(2000);
  envoieAuESP8266(cmd);
  i = 0; //timeout counter
  n = 1; // char counter
  json="{";
  inputLength=22;
  while (!Serial1.find("\"wind\":{")){}
  while (i<60000) {
    if(Serial1.available()) {
     
      char c = Serial1.read();
      json=json+c;
      Serial.print(c);
      if(c=='}'){
        Serial.println ("fichier json trouvé");
      break;}
      n++;
     
      i=0;
     
    }
    i++;
  }
  Serial.println(n);
 
  error = deserializeJson(doc, json);
  if (error) {
  Serial.print(F("deserializeJson() failed: "));
  Serial.println(error.f_str());
  return;
}
  float vent_parc_haouma = doc["speed"];
  Serial.print("la vitesse du vent en m/s est de l'ordre de: ");
  Serial.print((float)vent_parc_haouma);
  recoitDuESP8266(40000);
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPMUX=0");  
  recoitDuESP8266(1000);
  Serial.println("**********************************************************");
  cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += DST_IP;
  cmd += "\",80";
  envoieAuESP8266(cmd);
  recoitDuESP8266(10000);
  if(Serial.find("ERROR")) return;
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPSEND=71");
  //recoitDuESP8266(2000);
  cmd ="GET /data/2.5/weather?q=Midelt&appid=XXXXXXXXXXXXXXXXXXXXXXX";
  recoitDuESP8266(2000);
  envoieAuESP8266(cmd);
  i = 0; //timeout counter
  n = 1; // char counter
  json="{";
  inputLength=22;
  while (!Serial1.find("\"wind\":{")){}
  while (i<60000) {
    if(Serial1.available()) {
     
      char c = Serial1.read();
      json=json+c;
      Serial.print(c);
      if(c=='}'){
        Serial.println ("fichier json trouvé");
      break;}
      n++;
     
      i=0;
     
    }
    i++;
  }
  Serial.println(n);
 
  error = deserializeJson(doc, json);
  if (error) {
  Serial.print(F("deserializeJson() failed: "));
  Serial.println(error.f_str());
  return;
}
  float vent_parc_midelt = doc["speed"];
  Serial.print("la vitesse du vent en m/s est de l'ordre de: ");
  Serial.print((float)vent_parc_midelt);
  recoitDuESP8266(40000);
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPMUX=0");  
  recoitDuESP8266(1000);
  Serial.println("**********************************************************");
  cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += DST_IP;
  cmd += "\",80";
  envoieAuESP8266(cmd);
  recoitDuESP8266(10000);
  if(Serial.find("ERROR")) return;
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPMUX=0");  
  recoitDuESP8266(1000);
  Serial.println("**********************************************************");
  cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += DST_IP;
  cmd += "\",80";
  envoieAuESP8266(cmd);
  recoitDuESP8266(10000);
  if(Serial.find("ERROR")) return;
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPSEND=75");
  //recoitDuESP8266(2000);
  cmd ="GET /data/2.5/weather?q=Benslimane&appid=XXXXXXXXXXXXXXXXXXXXX";
  recoitDuESP8266(2000);
  envoieAuESP8266(cmd);
  i = 0; //timeout counter
  n = 1; // char counter
  json="{";
  inputLength=22;
  while (!Serial1.find("\"wind\":{")){}
  while (i<60000) {
    if(Serial1.available()) {
     
      char c = Serial1.read();
      json=json+c;
      Serial.print(c);
      if(c=='}'){
        Serial.println ("fichier json trouvé");
      break;}
      n++;
     
      i=0;
     
    }
    i++;
  }
  Serial.println(n);
 
  error = deserializeJson(doc, json);
  if (error) {
  Serial.print(F("deserializeJson() failed: "));
  Serial.println(error.f_str());
  return;
}
  float vent_parc_soulmanya = doc["speed"];
  Serial.print("la vitesse du vent en m/s est de l'ordre de: ");
  Serial.print((float)vent_parc_soulmanya);
  recoitDuESP8266(40000);
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPMUX=0");  
  recoitDuESP8266(1000);
  Serial.println("**********************************************************");
  cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += DST_IP;
  cmd += "\",80";
  envoieAuESP8266(cmd);
  recoitDuESP8266(10000);
  if(Serial.find("ERROR")) return;
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPSEND=69");
  //recoitDuESP8266(2000);
  cmd ="GET /data/2.5/weather?q=Safi&appid=XXXXXXXXXXXXXXXXXXXX";
  recoitDuESP8266(2000);
  envoieAuESP8266(cmd);
  i = 0; //timeout counter
  n = 1; // char counter
  json="{";
  inputLength=22;
  while (!Serial1.find("\"wind\":{")){}
  while (i<60000) {
    if(Serial1.available()) {
     
      char c = Serial1.read();
      json=json+c;
      Serial.print(c);
      if(c=='}'){
        Serial.println ("fichier json trouvé");
      break;}
      n++;
     
      i=0;
     
    }
    i++;
  }
  Serial.println(n);
 
  error = deserializeJson(doc, json);
  if (error) {
  Serial.print(F("deserializeJson() failed: "));
  Serial.println(error.f_str());
  return;
}
  float vent_parc_oualidiya = doc["speed"];
  Serial.print("la vitesse du vent en m/s est de l'ordre de: ");
  Serial.print((float)vent_parc_oualidiya);
  recoitDuESP8266(40000);
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPMUX=0");  
  recoitDuESP8266(1000);
  Serial.println("**********************************************************");
  cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += DST_IP;
  cmd += "\",80";
  envoieAuESP8266(cmd);
  recoitDuESP8266(10000);
  if(Serial.find("ERROR")) return;
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPSEND=74");
  //recoitDuESP8266(2000);
  cmd ="GET /data/2.5/weather?q=Essaouira&appid=XXXXXXXXXXXXXXXXXXXX";
  recoitDuESP8266(2000);
  envoieAuESP8266(cmd);
  i = 0; //timeout counter
  n = 1; // char counter
  json="{";
  inputLength=22;
  while (!Serial1.find("\"wind\":{")){}
  while (i<60000) {
    if(Serial1.available()) {
     
      char c = Serial1.read();
      json=json+c;
      Serial.print(c);
      if(c=='}'){
        Serial.println ("fichier json trouvé");
      break;}
      n++;
     
      i=0;
     
    }
    i++;
  }
  Serial.println(n);
 
  error = deserializeJson(doc, json);
  if (error) {
  Serial.print(F("deserializeJson() failed: "));
  Serial.println(error.f_str());
  return;
}
  float vent_parc_tarfayer = doc["speed"];
  Serial.print("la vitesse du vent en m/s est de l'ordre de: ");
  Serial.print((float)vent_parc_tarfayer);
  recoitDuESP8266(40000);
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPMUX=0");  
  recoitDuESP8266(1000);
  Serial.println("**********************************************************");
  cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += DST_IP;
  cmd += "\",80";
  envoieAuESP8266(cmd);
  recoitDuESP8266(10000);
  if(Serial.find("ERROR")) return;
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPSEND=72");
  //recoitDuESP8266(2000);
  cmd ="GET /data/2.5/weather?q=Tetouan&appid=XXXXXXXXXXXXXXXXX";
  recoitDuESP8266(2000);
  envoieAuESP8266(cmd);
  i = 0; //timeout counter
  n = 1; // char counter
  json="{";
  inputLength=22;
  while (!Serial1.find("\"wind\":{")){}
  while (i<60000) {
    if(Serial1.available()) {
     
      char c = Serial1.read();
      json=json+c;
      Serial.print(c);
      if(c=='}'){
        Serial.println ("fichier json trouvé");
      break;}
      n++;
     
      i=0;
     
    }
    i++;
  }
  Serial.println(n);
 
  error = deserializeJson(doc, json);
  if (error) {
  Serial.print(F("deserializeJson() failed: "));
  Serial.println(error.f_str());
  return;
}
  float vent_parcs_tetouan = doc["speed"];
  Serial.print("la vitesse du vent en m/s est de l'ordre de: ");
  Serial.print((float)vent_parcs_tetouan);
  recoitDuESP8266(40000);
  Serial.println("**********************************************************");
  Serial.println("***************** INITIALISATION TERMINEE ****************");
  Serial.println("**********************************************************");
  Serial.println("");  
}

/****************************************************************/
/*        Fonction qui envoie une commande à l'ESP8266          */
/****************************************************************/
void envoieAuESP8266(String commande)
{  
  Serial1.println(commande);
}
/****************************************************************/
/*Fonction qui lit et affiche les messages envoyés par l'ESP8266*/
/****************************************************************/
void recoitDuESP8266(const int timeout)
{
  String reponse = "";
  long int time = millis();
  while( (time+timeout) > millis())
  {
    while(Serial1.available())
    {
      char c = Serial1.read();
      reponse+=c;
    }
  }
  Serial.print(reponse);  
}

Ce n'est peut-être pas dû à ton code. Je crois que l'API gratuite permet 60 demandes par minutes: est-ce que tu respectes cette limitation ?

Oui je l'a respecte puisque je ne fais que 10 demandes, le problème réside sur le fait que même avec mon ancien programme ou je ne faisais qu'une seule demande il arrivait que la connexion à L'API échou à cause d'une mauvaise connexion ou autre, cela ne se produit que rarement une fois sur 6 ou 7, mais avec 10 connexions la probabilité que ça arrive sur l'une d'entre elle augmente, c'est pour cela que je souhaite rajouter une fonction dans mon programme qui réessai de se connecter une fois que ça échou,comment puis je faire ?
Je trouve aussi que c'est idiot de se connecter à chaque fois à open weather map, à cause du CLOSED qui s'affiche dès que je reçois la première données, n'y a-t-il pas un moyen avec lequel je peux me connecter une seule fois à open weather map et ainsi enchaîner avec les GETs ?

C'est quelle connexion qui plante : le Wifi ou le site ?

C'est le site

Il y a peut-être une autre limite, comme par exemple un délai à respecter entre deux demandes successives... Je suppose que tu n'as pas forcément besoin de connaitre la vitesse du vent à la seconde près. Essaye en laissant passer 20 secondes entre deux demandes. Puis réduis cet intervalle si ça fonctionne mieux.

Quelle erreur est retournée par le site?

J'ai mis un délai de 20 secondes entre les demandes et il échou à la troisième ou 4ème en affichant "no ip" alors qu'il est pourtant bien connecté, mais je suis pourtant sûr que si il réessaie une autre fois sur le même il va réussir, n'y a-t-il pas un moyen d'utiliser un "if" et un "return" au cas ou il échou, bref qlq chose du genre

Des fois ça affiche "no ip" et des fois juste un ERROR

Le message "no ip" est un problème local et non lié au site openweathermap.org.
Tu es certain de ne pas avoir d'instabilité sur ton réseau WiFi?

Le site openweathermap retourne normalement des erreurs dans une page html avec des codes d'erreur 401, 404, 429 ou 500, 502, 503 et 504. Voir là en bas de page pour la description de celles-ci:
https://openweathermap.org/faq#onecall

J'ai effectivement des instabilités car je ne travaille pas actuellement dans mon domicile, normalement je ne devrais pas avoir ce problème quand je reviendrai demain, mais si je venais à faire une démonstration ailleurs que chez moi sans connaître l'état du réseau, j'ai pas moyen de garantir une exécution du programme réussite ?

Il faudrait que tu simplifies ton code. Tu peux faire une fonction qui te renvoie la vitesse du vent lorsque tu lui fournis la commande cmd. Ce serait plus facile à lire et modifier.

Tu peux faire un tableau contenant toutes les commandes et faire une boucle pour obtenir toutes les valeurs des vitesses.
On peut aussi penser à créer une structure qui contiendrait le nom du site, la partie de la commande qui lui est spécifique et la vitesse du vent.

Ça ne résout pas ton problème, mais le code serait plus propre.

Au fait, à quoi sert le Mega ? Pourquoi ne pas tout faire avec l'ESP8266 ?

Merci pour les conseils, j'utilise le méga car je rajouterais par la suite un écran lcd ainsi qu'une sim 800l dans le même projet, l'esp ne peut donc pas tout faire à lui seul

voila ce que j'ai fait

void vitesseduvent (const int octets, String ville, String parc)
{
Serial.println(" ");
Serial.println("**********************************************************");
Serial.println(" ");
envoieAuESP8266("AT+CWJAP=\""+ NomduReseauWifi + "\",\"" + MotDePasse +"\"");
recoitDuESP8266(20000);
Serial.println("**********************************************************");
envoieAuESP8266("AT+CIPMUX=0");
recoitDuESP8266(1000);
Serial.println("**********************************************************");
String cmd = "AT+CIPSTART=\"TCP\",\"";
cmd += DST_IP;
cmd += "\",80";
envoieAuESP8266(cmd);
recoitDuESP8266(1000);
//if(!Serial1.find("OK")) {return;} 

envoieAuESP8266("AT+CIPSEND="(octets)"");
//recoitDuESP8266(2000);
cmd ="GET /data/2.5/weather?q="ville"&appid=XXXXXXXXXXxxxxxxxxxxx";
recoitDuESP8266(1000);
envoieAuESP8266(cmd);
unsigned int i = 0; //timeout counter
int n = 1; // char counter
String json="{";
size_t inputLength=22;
while (!Serial1.find("\"wind\":{")){}
while (i<60000) {
if(Serial1.available()) {

char c = Serial1.read();
json=json+c;
Serial.print(c);
if(c=='}'){
Serial.println ("fichier json trouvé");
break;}
n++;

i=0;

}
i++;
}
Serial.println(n);

DeserializationError error = deserializeJson(doc, json);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
float (parc) = doc["speed"];
Serial.print("la vitesse du vent en m/s est de l'ordre de: ");
Serial.print((float)(parc));
delay(30000);
Serial.println("**********************************************************");
}

cependant j'ai quand même les erreurs suivantes
C:\Users\M. ALILOU\Documents\Arduino\sketch_jul27a\sketch_jul27a.ino: In function 'void vitesseduvent(int, String, String)':
sketch_jul27a:92:39: error: expression cannot be used as a function
envoieAuESP8266("AT+CIPSEND="(octets)"");
^
sketch_jul27a:94:39: error: unable to find string literal operator 'operator""ville' with 'const char [64]', 'unsigned int' arguments
cmd ="GET /data/2.5/weather?q="ville"&appid=xxxxxxxxxxxxxxxx";
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sketch_jul27a:126:14: error: declaration of 'float parc' shadows a parameter
float (parc) = doc["speed"];
^
exit status 1
expression cannot be used as a function

Bonjour,

Il faut 'échapper' les guillemets à l'intérieur d'une chaine
envoieAuESP8266("AT+CIPSEND=\"(octets)\"");

cmd ="GET /data/2.5/weather?q="ville"&appid=50a7aa80fa492fa92e874d23ad061374";
C'est "+ville+" :

cmd ="GET /data/2.5/weather?q="+ville+"&appid=50a7aa80fa492fa92e874d23ad061374";

Et :
envoieAuESP8266("AT+CIPSEND="(octets)"");
devient (j'imagine) :
envoieAuESP8266("AT+CIPSEND=\"("+octets+")\"");

Tu ne devrais pas mettre ton numéro d'API en clair sur le forum... :face_with_spiral_eyes:

voila ce que j'obtiens après la modification,pour ce qui est de "ville" c'est ok,mais il y'a encore une erreur dans octets
C:\Users\M. ALILOU\Documents\Arduino\sketch_jul27a\sketch_jul27a.ino: In function 'void vitesseduvent(int, String, String)':
sketch_jul27a:92:42: error: invalid operands of types 'const char*' and 'const char [3]' to binary 'operator+'
envoieAuESP8266("AT+CIPSEND="("+octets+")"");
~~~~~~~~~~~~~~~~~^~
sketch_jul27a:126:9: error: declaration of 'float parc' shadows a parameter
float parc = doc["speed"];
^
~
exit status 1
invalid operands of types 'const char*' and 'const char [3]' to binary 'operator+'

et pour le cas du float que je veux moi même déclarer à chaque fois avec un nom différent,pour différentier les variables des unes des autres et ainsi les utiliser dans des calculs ,ca affiche une erreur las bas aussi

Poste le code modifié dans son intégralité parce que là on ne voit pas de quoi tu parles.

Il manque les \