Erreur : "conversion from 'JSONVar' to 'float' is ambiguous"

Bonjour à tous,

Je suis en train de réaliser une retranscription parlée des valeurs données par une balise PIOUPIOU pour diffuser les valeurs de direction, vent moyen et vent maxi sur une radio VHF sur la fréquence FFVL (143.9875).
Par exemple pour la balise PIOUPIOU de Digne les Bains on a l'affichage des valeurs sur une page HTML à l'adresse : OpenWindMap - Live wind reports et les données sous forme de fichier Json à l'adresse : http://api.pioupiou.fr/v1/live/596

Les données récupérées arrivent sous cette forme :

{
  "doc": "http://developers.pioupiou.fr/api/live/",
  "license": "http://developers.pioupiou.fr/data-licensing",
  "attribution": "(c) contributors of the Pioupiou wind network <http://pioupiou.fr>",
  "data": {
    "id": 596,
    "meta": {
      "name": "L'Andran - Digne les Bains"
    },
    "location": {
      "latitude": 44.113592,
      "longitude": 6.215406,
      "date": "2021-01-08T12:48:55.000Z",
      "success": true
    },
    "measurements": {
      "date": "2021-01-10T11:17:40.000Z",
      "pressure": null,
      "wind_heading": 112.5,
      "wind_speed_avg": 0.5,
      "wind_speed_max": 2.5,
      "wind_speed_min": 0
    },
    "status": {
      "date": "2021-01-10T11:17:40.000Z",
      "snr": 0,
      "state": "on"
    }
  }
}

Je souhaite récupérer les données Wind_Speed_avg et Wind_speed_max en conservant les données comme "float" pour arrondir les valeurs à l'entier supérieur.

En déclarant les variables comme int, ça fonctionne mais si je les mets en Float, j'ai le message suivant :

"conversion from 'JSONVar' to 'float' is ambiguous"

Pouvez-vous m'éclairer et m'aider sur ce point ?

Merci.

PS : Le message dépassant 9000 caractères, j'envoie le code dans le message suivant.

Voici le programme :

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

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

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

HardwareSerial hwSerial(1);
#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 randNumber;
int randomSpeed;
int maxSpeed;
int dir;

int windSpeedAvg; // speed miles per hour
int readIndex = 0;
int total = 0;
int windDirection = 0;
int windSpeedMax = 0;
int windHeading = 0;
char *sectors[ ] = {"N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW", "N"};
String compassDir = "";
int index1;
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);


unsigned long timerDelay = 10000;

String jsonBuffer;

void setup() {
  Serial.begin(115200);
  hwSerial.begin(9600, SERIAL_8N1, 18, 19);  // speed, type, TX, RX
  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("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));

  if (!dfPlayer.begin(hwSerial)) {

    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(5);  //Set volume value. From 0 to 30


}

void loop() {
  // Send an HTTP GET request
  if ((millis() - lastTime) > timerDelay) {
    Serial.println("Test");

    if (WiFi.status() == WL_CONNECTED) {
      String serverPath = "http://api.pioupiou.fr/v1/live/596";

      jsonBuffer = httpGETRequest(serverPath.c_str());
      Serial.println(jsonBuffer);
      JSONVar myObject = JSON.parse(jsonBuffer);

      if (JSON.typeof(myObject) == "undefined") {
        Serial.println("Parsing input failed!");
        return;
      }
      windHeading = (myObject["data"]["measurements"]["wind_heading"]);
      windSpeedAvg = (myObject["data"]["measurements"]["wind_speed_avg"]);
      windSpeedMax = (myObject["data"]["measurements"]["wind_speed_max"]);
      getHeading(windHeading);

      dfPlayer.volume(6);
      delay(1000);
      voice();

      Serial.print("JSON object = ");
      Serial.println(myObject);
      Serial.print("Balise : ");
      Serial.println(myObject["data"]["id"]);
      Serial.print("BaliseName : ");
      Serial.println(myObject["data"]["meta"]["name"]);

      Serial.print("WindSpeedAvg : ");
      Serial.println(myObject["data"]["measurements"]["wind_speed_avg"]);
      //      getHeading(windHeading);
      Serial.print("WindHeading : ");
      Serial.println(myObject["data"]["measurements"]["wind_heading"]);
      Serial.print("Direction : ");
      Serial.println(compassDir);

      Serial.print("WindSpeedMax : ");
      Serial.println(myObject["data"]["measurements"]["wind_speed_max"]);

    }
    else {
      Serial.println("WiFi Disconnected");
    }
    lastTime = millis();
  }
}

String httpGETRequest(const char* serverName) {
  HTTPClient http;

  http.begin(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);
  }
  // Free resources
  http.end();

  return payload;
}
void voice() {
  //  randNumber = random(1, 7);
  //  Serial.println(randNumber);
  //    Serial.println(index);
  //  switch (randNumber) {
  switch (number) {
    case 0:
      Serial.println(F("NORD"));
      dir = 0;
      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;
  };

  dfPlayer.playFolder(FOLDER_title, 1);
  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 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;
  }
}
void getHeading(int direction) {
  int index = windHeading % 360;//modulo
  index = round(index / 22.5);
  number = (degres[index]);
  Serial.print("Index = "); Serial.println(index);
  Serial.print("Number = "); Serial.println(number);
  compassDir = (sectors[index]);
}

Ce serait plus malin de mettre le code à la suite du message précédent.
Demande au modérateur de regrouper les 2 fils de discussion (lien en bas des fenêtres de message)

Bonjour,

c'est fait.

Tu devrais utiliser la bibliothèque ArduinoJSON, qui a le gros avantage de disposer d'un assistant qui te fait le code pour dé-sérialiser ton stream de données. Si je colle celui-ci dans l'assistant, j'obtiens le code ci-dessous :

// Stream& input;

DynamicJsonDocument doc(768);
deserializeJson(doc, input);

const char* doc = doc["doc"]; // "http://developers.pioupiou.fr/api/live/"
const char* license = doc["license"]; // "http://developers.pioupiou.fr/data-licensing"
const char* attribution = doc["attribution"]; // "(c) contributors of the Pioupiou wind network <http://pioupiou.fr>"

JsonObject data = doc["data"];
int data_id = data["id"]; // 596

const char* data_meta_name = data["meta"]["name"]; // "L'Andran - Digne les Bains"

JsonObject data_location = data["location"];
float data_location_latitude = data_location["latitude"]; // 44.113592
float data_location_longitude = data_location["longitude"]; // 6.215406
const char* data_location_date = data_location["date"]; // "2021-01-08T12:48:55.000Z"
bool data_location_success = data_location["success"]; // true

JsonObject data_measurements = data["measurements"];
const char* data_measurements_date = data_measurements["date"]; // "2021-01-10T11:17:40.000Z"
float data_measurements_wind_heading = data_measurements["wind_heading"]; // 112.5
float data_measurements_wind_speed_avg = data_measurements["wind_speed_avg"]; // 0.5
float data_measurements_wind_speed_max = data_measurements["wind_speed_max"]; // 2.5
int data_measurements_wind_speed_min = data_measurements["wind_speed_min"]; // 0

JsonObject data_status = data["status"];
const char* data_status_date = data_status["date"]; // "2021-01-10T11:17:40.000Z"
int data_status_snr = data_status["snr"]; // 0
const char* data_status_state = data_status["state"]; // "on"

que tu peux simplifier pour ne conserver que les variables qui t'intéressent (7 lignes de code) :

// Stream& input;
DynamicJsonDocument doc(768);
deserializeJson(doc, input);
JsonObject data = doc["data"];
JsonObject data_measurements = data["measurements"];
float data_measurements_wind_heading = data_measurements["wind_heading"]; // 112.5
float data_measurements_wind_speed_avg = data_measurements["wind_speed_avg"]; // 0.5
float data_measurements_wind_speed_max = data_measurements["wind_speed_max"]; // 2.5

Bonjour lesept,

Merci pour ton aide.
J'ai fait la modif et ça fonctionne !

Une question : Je reçois les données sous forme de string.

Comment puis-je faire pour les obtenir sous forme de Stream ou de Char ?

Merci.

Pour le stream, il y a des pistes ici, ça dépend de la source des données.
Pour le tableau de char, tu peux regarder cet exemple

Bonjour lesept,

Merci pour ces liens je vais étudier ça!

Fitness04

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