Utilisation d'un tableau pour adresses API

Bonjour à tous,
je ne suis pas à l'aise avec l'utilisation des tableaux et je n'ai pas trouvé un tuto qui m'explique clairement comment s'y prendre.
Aussi je viens vers vous pour m'aiguiller!

J'ai un programme de répéteur de balises météo Pioupiou qui lit les données par l'intermédiaire d'une API :

"http://api.pioupiou.fr/v1/live/596"

Mon programme utilise une ESP32 Wroom et un DFplayer mini plus un SA828 pour émettre en VHF

Pour l'instant, il fonctionne bien avec une seule balise suivant le code ci dessous (Il n'y a pas la partie SA828) :

#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

const char* ssid = "XXXXXXXXXXXXXX";
const char* password = "XXXXXXXXXXXXXXXXl";

HardwareSerial mySoftwareSerial(1);

//**********DFPLAYER***********

//SoftwareSerial mySoftwareSerial(D3, D2); // DFPLAYER TX, RX
#include "DFRobotDFPlayerMini.h"
#define FOLDER_title          1
#define FOLDER_directions     2
#define FOLDER_speed          3
#define FOLDER_text           4

static unsigned long timer = millis();
int dir;
const int PTT = 15;
const int PIN_CS_SA828 = 27;

float data_measurements_wind_heading;
float data_measurements_wind_speed_avg;
float data_measurements_wind_speed_max;

int windSpeedAvg;
int readIndex;
int windSpeedMax;
int windHeading;
char *sectors[ ] = {"N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW", "N"};
String compassDir = "";
int number = 0;
const byte degres[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};

DFRobotDFPlayerMini dfPlayer;
void printDetail(uint8_t type, int value);

//*************************************************

// THE DEFAULT TIMER IS SET TO 10 SECONDS FOR TESTING PURPOSES
unsigned long lastTime = 0;
unsigned long timerDelay = 10000;

//String serverPath = "http://api.pioupiou.fr/v1/live/596";//Digne
//String serverPath = "http://api.pioupiou.fr/v1/live/594";//Le TRAINON
//String serverPath = "http://api.pioupiou.fr/v1/live/595";//Aiguines
String serverPath = "http://api.pioupiou.fr/v1/live/87";//Saint-Andre_Sud
//String serverPath = "http://api.pioupiou.fr/v1/live/115";//MaisonCantonniere
//String serverPath = "http://api.pioupiou.fr/v1/live/373";//Moustiers

String json;

DynamicJsonDocument doc(1024);

void setup() {
  mySoftwareSerial.begin(9600, SERIAL_8N1, 18, 19);  // speed, type, TX, RX
  Serial.begin(115200);

  pinMode(PIN_CS_SA828, OUTPUT);
  pinMode(PTT, OUTPUT);
  Serial.println("");
  Serial.println("Sketch : balisePoupiou_Andran_D1ProMini.ino");

  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());

  Serial.println("Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.");

  //************DFPLAYER*************************

  Serial.println();
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));

  if (!dfPlayer.begin(mySoftwareSerial)) {
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while (true);
  }
  Serial.println(F("DFPlayer Mini online."));

  dfPlayer.setTimeOut(500);
  dfPlayer.EQ(DFPLAYER_EQ_NORMAL);
  dfPlayer.outputDevice(DFPLAYER_DEVICE_SD);

  //  dfPlayer.volume(8);  //Set volume value. From 0 to 30
  //********************************************************
}
void loop() {
  // Send an HTTP GET request
  if ((millis() - lastTime) > timerDelay) {
    Serial.println("Test");
    // Check WiFi connection status
    if (WiFi.status() == WL_CONNECTED) {
      json = httpGETRequest(serverPath.c_str());
      Serial.println(json);
      DeserializationError error = deserializeJson(doc, json);
      if (error) {
        Serial.print(F("deserializeJson() failed: "));
        Serial.println(error.f_str());
        return;
      }
      JsonObject data = doc["data"];
      int data_id = data["id"];
      const char* data_meta_name = data["meta"]["name"];
      JsonObject data_measurements = data["measurements"];
      data_measurements_wind_heading = data_measurements["wind_heading"];
      data_measurements_wind_speed_avg = data_measurements["wind_speed_avg"];
      data_measurements_wind_speed_max = data_measurements["wind_speed_max"];

      Serial.print("JSON object = "); Serial.println(data);
      Serial.print("Balise : "); Serial.println(data_id);
      Serial.print("BaliseName : "); Serial.println(data_meta_name);

      Serial.print("WindHeading : "); Serial.println(data_measurements_wind_heading);
      Serial.print("Direction : "); Serial.println(compassDir);
      Serial.print("WindSpeedAvg : "); Serial.println(data_measurements_wind_speed_avg);
      Serial.print("WindSpeedMax : "); Serial.println(data_measurements_wind_speed_max);

      windSpeedAvg = round (data_measurements_wind_speed_avg);
      windSpeedMax = round (data_measurements_wind_speed_max);
      windHeading = round(data_measurements_wind_heading);
      Serial.print("windSpeedAvg : "); Serial.println(windSpeedAvg);
      Serial.print("windSpeedMax : "); Serial.println(windSpeedMax);
      getHeading(windHeading);

      digitalWrite(PIN_CS_SA828, HIGH);
      Serial.println("PIN_CS_SA828 HIGHT");
      digitalWrite(PTT, HIGH);
      Serial.println("PPT HIGHT");
      dfPlayer.volume(10);
      delay(1000);

      voice();
      delay(1000);

      digitalWrite(PTT, LOW);
      digitalWrite(PIN_CS_SA828, LOW);
    }
    else {
      Serial.println("WiFi Disconnected");
    }
    lastTime = millis();
  }
}

String httpGETRequest(const char* serverName) {
  WiFiClient client;
  HTTPClient http;
  http.begin(client, serverName);
  int httpResponseCode = http.GET();
  String payload = "{}";

  if (httpResponseCode > 0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http.getString();
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  http.end();

  return payload;
}
void voice() {
  Serial.println();
  switch (number) {
    case 0:
      Serial.println(F("NORD"));
      dir = 16;
      break;
    case 1:
      Serial.println(F("NORD-NORD-EST"));
      dir = 1;
      break;
    case 2:
      Serial.println(F("NORD-EST"));
      dir = 2;
      break;
    case 3:
      Serial.println(F("EST-NORD-EST"));
      dir = 3;
      break;
    case 4:
      Serial.println(F("EST"));
      dir = 4;
      break;
    case 5:
      Serial.println(F("EST-SUD-EST"));
      dir = 5;
      break;
    case 6:
      Serial.println(F("SUD-EST"));
      dir = 6;
      break;
    case 7:
      Serial.println(F("SUD-SUD-EST"));
      dir = 7;
      break;
    case 8:
      Serial.println(F("SUD"));
      dir = 8;
      break;
    case 9:
      Serial.println(F("SUD-SUD-OUEST"));
      dir = 9;
      break;
    case 10:
      Serial.println(F("SUD-OUEST"));
      dir = 10;
      break;
    case 11:
      Serial.println(F("OUEST-SUD-OUEST"));
      dir = 11;
      break;
    case 12:
      Serial.println(F("OUEST"));
      dir = 12;
      break;
    case 13:
      Serial.println(F("OUEST-NORD-OUEST"));
      dir = 13;
      break;
    case 14:
      Serial.println(F("NORD-OUEST"));
      dir = 14;
      break;
    case 15:
      Serial.println(F("NORD-NORD-OUEST"));
      dir = 15;
      break;
    case 16:
      Serial.println(F("NORD"));
      dir = 16;
      break;
    default:
      break;
  };
  delay(1000);
  dfPlayer.playFolder(FOLDER_title, 3);//St Andre
  delay(1500);
  dfPlayer.playFolder(FOLDER_directions, dir);
  delay(1500);
  dfPlayer.playFolder(FOLDER_speed, windSpeedAvg);
  delay(1000);
  dfPlayer.playFolder(FOLDER_text, 1);
  delay(1000);
  dfPlayer.playFolder(FOLDER_speed, windSpeedMax);
  delay(1000);
  dfPlayer.playFolder(FOLDER_text, 2);

  if (dfPlayer.available()) {
    printDetail(dfPlayer.readType(), dfPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
  }
}
void getHeading(int direction) {
  int index = windHeading % 360;//modulo
  index = round(index / 22.5);
  number = (degres[index]);
  Serial.print("Number : "); Serial.println(number);
  compassDir = (sectors[index]);
}
void printDetail(uint8_t type, int value) {
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
}

J'imagine qu'il faut mettre ces Strings contenant les adresses dans un tableau puis de les lire à tour de role par une boucle FOR et lancer la requette HTTP GET.

Mais, je ne sais pas comment m'y prendre...

Pouvez-vous m'aiguiller?
Merci.

Tu pourrais faire ça

String serverPath[] = {"http://api.pioupiou.fr/v1/live/596",        //Digne
                       "http://api.pioupiou.fr/v1/live/594",        //Le TRAINON
                       "http://api.pioupiou.fr/v1/live/595",        //Aiguines
                       "http://api.pioupiou.fr/v1/live/87",          //Saint-Andre_Sud
                       "http://api.pioupiou.fr/v1/live/115",        //MaisonCantonniere
                       "http://api.pioupiou.fr/v1/live/373"         //Moustiers

et ensuite là où tu utilisais serverPath tu mets à la place serverPath[index] avec index ayant une valeur ente 0 et 5 en l'état actuel. index peut être une constante ou une variable si par exemple tu utilisais une boucle for pour lire les serveurs les uns après les autres.

On doit pouvoir se contenter de stocker les chiffres (596, 594, etc) dans un tableau et de construire le path comme suit :
String path = "http://api.pioupiou.fr/v1/live/" + String(serverNumber[i]);
Ce sera plus frugal en mémoire.

Bonjour,

Merci à tous les deux, vos solutions fonctionnent.

A bientôt.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.