Globale Variable

Hey Leute. Bin absoluter Anfänger und hab für viele von euch sicher ein leichtes Problem...

Ich möchte mit dem NodeMCU per HTTPClient aus einer Api Json abholen und die Daten daraus als Variable nutzen.

Das abholen und als Variable zu erhalten klappt. Jedoch nicht als globale Variable. Kann mir einer anhand meines Codes erklären, was das Problem ist.

Ich habe bereits versucht balances_0_value und ripple_eur als globale Variable zu deklarieren indem ich sie außerhalb von setup und loop deklariert habe. jedoch gibt es dann Fehlermeldungen weil sie die Daten der beiden vorher aus der Json auslesen. Zumindest denke ich das...

Nach einigen googeln und einlesen komm ich nicht mehr weiter ...

Vll kann mir hier jemand helfen ::)

Ich sehe die Variable “balances_0_currency” nicht als global definiert.

wenn du die Variablen global und dann nochmal lokal deklarierst kann es zu unerwarteten Verhalten kommen,
versuch es mal so:

#include <ESP8266WiFi.h>          //https://github.com/esp8266/Arduino

//needed for library
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>         //https://github.com/tzapu/WiFiManager

float ripple_eur;
float balance;
const char* balances_0_currency;



void setup() {
    // put your setup code here, to run once:
    Serial.begin(115200);

    //WiFiManager
    //Local intialization. Once its business is done, there is no need to keep it around
    WiFiManager wifiManager;
    //reset saved settings
    //wifiManager.resetSettings();
   
    //set custom ip for portal
    //wifiManager.setAPStaticIPConfig(IPAddress(10,0,1,1), IPAddress(10,0,1,1), IPAddress(255,255,255,0));

    //fetches ssid and pass from eeprom and tries to connect
    //if it does not connect it starts an access point with the specified name
    //here  "AutoConnectAP"
    //and goes into a blocking loop awaiting configuration
    wifiManager.autoConnect("CryptoFeed", "******");
    //or use this for auto generated name ESP + ChipID
    //wifiManager.autoConnect();

   
    //if you get here you have connected to the WiFi
    Serial.println("connected...yeey :)");
}






void loop() {
  // Check WiFi Status
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;  //Object of class HTTPClient
    http.begin("http://data.ripple.com/v2/accounts/rU4ZUFnUyaTXvb1rPAwDSUinpCw2PAxsHN/balances?currency=XRP");
    int httpCode = http.GET();
    //Check the returning code                                                                 
    if (httpCode > 0) {
      // Parsing
     const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(4) + 100;
     DynamicJsonBuffer jsonBuffer(capacity);
     const char* json = "{\"result\":\"success\",\"ledger_index\":49477232,\"limit\":200,\"balances\":[{\"currency\":\"XRP\",\"value\":\"22.638107\"}]}";
     JsonObject& root = jsonBuffer.parseObject(json);

     const char* result = root["result"]; // "success"
     long ledger_index = root["ledger_index"]; // 49477232
     int limit = root["limit"]; // 200
     [color=red]//const char* balances_0_currency = root["balances"][0]["currency"]; // "XRP"7[/color]
     balances_0_currency = root["balances"][0]["currency"]; // "XRP"7
     const char* balances_0_value = root["balances"][0]["value"]; // "22.638107"
      // Output to serial monitor
      Serial.print("Currency:");
      Serial.println(balances_0_currency);
      Serial.print("Value:");
      Serial.println(balances_0_value);
    }
    http.end();   //Close connection
  }
   if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;  //Object of class HTTPClient
    http.begin("http://api.coingecko.com/api/v3/simple/price?ids=ripple&vs_currencies=eur");
    int httpCode = http.GET();
    //Check the returning code                                                                 
    if (httpCode > 0) {
      // Parsing
     const size_t capacity = 2*JSON_OBJECT_SIZE(1) + 30;
     DynamicJsonBuffer jsonBuffer(capacity);
     const char* json = "{\"ripple\":{\"eur\":0.247758}}";
     JsonObject& root = jsonBuffer.parseObject(json);

     [color=red]//float ripple_eur = root["ripple"]["eur"]; // 0.247758[/color]
     ripple_eur = root["ripple"]["eur"]; // 0.247758
      // Output to serial monitor
      Serial.print("Price:");
      Serial.println(ripple_eur);
    }
    http.end();   //Close connection
  }
  // Delay
  delay(60000);
}

Keine unerwarteten, sondern klar definierte Reaktionen: Die lokalen Variablen überdecken die gleichnamigen globalen Variablen.

Gruß Tommy

Super Sache. Danke. Hat jetzt noch jemand ne Idee warum ich immer als ripple_eur 0,25 bekomme. Irgendwie aktualisiert sich das nicht. Es ist zum verrückt werden ...

Aktuell wäre es laut API 0.240896

hast du das foat im loop rausgenommen?

Wie meinst du das :/ foat sagt mir nichts.

Meinst du void?

Ich seh da ein delay(60000), übel, ganz übel

ElEspanol: Ich seh da ein delay(60000), übel, ganz übel

Wieso? Erklärung bitte. So hilfts mir nicht weiter.

Wäre auch noch ein cooles Feature der IDE, dass eine Warnung erscheint, wenn lokale Variablen globale überschreiben. So kenne ich es vom MS Visual Studio.

IIblackZII: Wieso? Erklärung bitte. So hilfts mir nicht weiter.

Für was eine Erklärung? Dass man den uC nicht eine Minute lang Leerlaufen lässt und somit normalen Code blockiert? Such mal nach „blockierungsfrei“ in den Suchmaschinen deiner Wahl

freddy64: Wäre auch noch ein cooles Feature der IDE, dass eine Warnung erscheint, wenn lokale Variablen globale überschreiben. So kenne ich es vom MS Visual Studio.

Warnungen kommen vom Compiler. Visual Studio hat einen eigenen Compiler. Das können die Arduino Macher nicht leisten

Außerdem hat es schon sehr viel Sinn dass man lokale Variablen mit dem gleichen Namen anlegen kann.

ElEspanol: Für was eine Erklärung? Dass man den uC nicht eine Minute lang Leerlaufen lässt und somit normalen Code blockiert? Such mal nach „blockierungsfrei“ in den Suchmaschinen deiner Wahl

Achso. Ja wird noch durch Timer ersetzt

ElEspanol:
Für was eine Erklärung? Dass man den uC nicht eine Minute lang Leerlaufen lässt und somit normalen Code blockiert? Such mal nach „blockierungsfrei“ in den Suchmaschinen deiner Wahl

Nun besser? Hab die Tasks per Timer. Ich hab nun lediglich noch ein Problem. Meine Daten welche per API geholt werden, holt er einmalig ab und dann aktualisiert er nicht mehr…

Hat irgendjemand eine Idee dazu?