Hallo zusammen,
ich arbeite gerade an einem Projekt, für dass ich die Wettervorhersage von Open Weather Map nutze. Hierzu habe ich ein eigenes void angelegt. Die Daten empfange ich und auch das Parsen der Daten aus der JSON funktioniert Problemlos.
Beispiel: String iconNow = root["current"]["weather"][0]["icon"];
Das Problem ist jetzt, dass ich genau diesen String "iconNow" in einem anderen Void brauche, ich dort jedoch den Fehler "iconNow was not declared in this scope" erhalte.
Wenn ich nun
String iconNow = "";
als globale Variable setze, kommt jedoch nichts an, der String bleibt leer.
Ich habe das Problem einmal simplifiziert in diesem Sketch dargestellt.
String test = "";
void setup() {
Serial.begin(9600);
}
void loop() {
test1();
delay(5000);
test2();
}
void test1(){
String test = "Es funktioniert!";
}
void test2(){
Serial.print("Das hier steht da:");
Serial.println(test);
}
Auch hier bleibt der String test leer. Nur wenn ich die Deklarierung "String" aus void test1() entferne, funktioniert es. Im Originalcode nutze ich jedoch die Bibliothek ArduinoJSON.h, weshalb ich hier die Deklarierung String benutzen muss, sonst bekomme ich einen Fehler.
Wie bekomme ich den Wert des Strings iconNow bzw. des Strings test in die Globale Variable, damit ich sie in einem anderen void nutzen kann?
Vielleicht ist es ja offensichtlich und ich sehe es einfach nicht.
Vielen Dank
Es gibt keine "voids". Void ist ein Datentyp. Die Dinger sind Funktionen
void test1(){
String test = "Es funktioniert!";
}
Das ist eine lokale Variable test die die globale Version überdeckt
Okay, also muss ich die lokale Variable irgendwie Global machen.
So geht's, ist aber irgendwie nicht elegant, besonders wenn ich 20 Werte übertragen muss:
String testNow = "";
void setup() {
Serial.begin(9600);
}
void loop() {
test1();
delay(5000);
test2();
}
void test1(){
String test = "Es funktioniert!";
testNow = test;
}
void test2(){
Serial.print("Das hier steht da:");
Serial.println(testNow);
}
crosswalkersam:
So geht's, ist aber irgendwie nicht elegant, besonders wenn ich 20 Werte übertragen muss:
dann nimmst du ein Array, statt einer Variablen.
Kann ich in ein Array auch Daten verschiedener Art reinschreiben? Einige von den Variablen sind Strings, andere floats oder einige int
crosswalkersam:
Kann ich in ein Array auch Daten verschiedener Art reinschreiben? Einige von den Variablen sind Strings, andere floats oder einige int
Nein. Was Du tun kannst: Wenn Du unterschiedliche Daten zu einer Struktur (Schlüsselwort struct) zusammenfasst, kannst Du ein Array aus solchen „Datenpaketen“ anlegen.
Gruß
Gregor
Okay, vielen Dank. Das mit den Arrays hört sich interessant an. Aber auch dann erzeuge ich doch nur ein lokales Array, oder? Wie mach ich das dann Global?
crosswalkersam:
Okay, vielen Dank. Das mit den Arrays hört sich interessant an. Aber auch dann erzeuge ich doch nur ein lokales Array, oder? Wie mach ich das dann Global?
Indem Du es außerhalb aller Blöcke (also z. B. noch vor setup()) deklarierst. Dann ist es von loop() und anderen Funktionen aus „sichtbar“ (global eben).
Gruß
Gregor
Und in dieses Global deklariere Array kann ich aus meinem void reinschreiben und es ineinem anderen void wieder auslesen?
Tut mir leid, dass ich so doof Frage, aber es ist mein erstes mal mit den Dingern 
crosswalkersam:
Und in dieses Global deklariere Array kann ich aus meinem void reinschreiben und es ineinem anderen void wieder auslesen?
Ja. Probier's aus. Der Punkt ist, dass Variablen, die sich innerhalb eines Blocks (alles zwischen { und }) befinden, auch nur innerhalb dieses Blocks sichtbar sind („scope“).
Tut mir leid, dass ich so doof Frage, aber es ist mein erstes mal mit den Dingern 
Mach Dir nichts draus. Ich bin manchmal vollkommen unabsichtlich unglaublich dämlich. Ganz ohne Drogen.
Gruß
Gregor
Habs gerade versucht und siehe da: funktioniert. Vielen, vielen Dank! 8)
crosswalkersam:
Habs gerade versucht und siehe da: funktioniert. Vielen, vielen Dank! 8)
Gern geschehen. Immerhin habe ich den Beginn des Wochenendes auf heute ... äh ... gestern vorgezogen.
Was Du „voids“ nennst, sind übrigens Funktionen. „void“ steht vor dem Funktionsnamen und bedeutet lediglich, dass die betreffende Funktion keine Rückgabe liefert.
Gruß
Gregor