Hi Leute,
ich habe hier ein Projekt, bei dem sich bis zu vier Wemos mit einem Ultraschallsensor mit einem fünften Wemos verbinden sollen. Je nachdem wie viele Clients verbunden sind, leuchten entsprechend viele Dioden.
Sobald ein Client eine bestimmte Entfernung misst, soll dem Server bescheid gegeben werden.
Die Kommunikation läuft soweit. Leider wird aber die Diode nicht geschaltet. Wenn ich mir anschaue, welcher Wert in den Variablen steht, sehe ich NULL. Das mysteriöse ist, dass beim Verbinden die Dioden ordnungsgemäß geschaltet werden. Aber auch da ist der Inhalt der Zählervariablen NULL.
Kann mir jemand erklären was hier schief läuft?
Hier wird die Diode geschaltet:
void Lock::registerDevice() {
sensorCount++;
for (int i = 0; i<sensorCount; i++)
leds[i].setColor(red); //leds werden geschaltet
Serial.println("connected");
Serial.println("sensorCount " +sensorCount); //Ausgabe: "sensorCount "
}
Hier nicht:
void Lock::setRing() {
Serial.println("activeSensors " +activeSensors); //Ausgabe: "sensorCount "
for (int i = 0; i < activeSensors; i++)
leds[i].setColor(blue); //leds werden nicht geschaltet
if (activeSensors == sensorCount)
allSensorsActive = true;
else
allSensorsActive = false;
}
Diese Zeile ist unsinn!
Die gibt bei mir "veSensors" aus.
Das ist ja auch so programmiert.
Die Idee mit dem + Zeichen ist natürlich völlig daneben, ausser man will einen Text erst ab dem soundsovielten Zeichen ausgeben.
Gibt auch eine Programmiersprache, da kann man Strings mit & zusammensetzen.
Hier bei Arduino besteht der Super-Luxus darin, dass manprintmit allen möglichen Datentypen aufrufen kann und es kommt meist das raus, was sich naive Benutzer vorstellen:
Da er schreibt, dass es funktionieren würde (also die verkettete Anzeige raus kommt), muss es wohl eine impliziete Verkettung über die Klasse String sein, die println ausgibt.
void Lock::setRing() {
Serial.println("activeSensors " +activeSensors); //Ausgabe: "sensorCount "
for (int i = 0; i < activeSensors; i++)
leds[i].setColor(blue); //leds werden nicht geschaltet
Serial.Println() bekommt das Additionsergebnis aus Adresse des Strings und der Variablen activeSensors.
Diese neue/berechnete Adresse wird von Println als char * akzeptiert.
Stinknormale Pointer Arithmetik.
Im Grunde völlig ok, wenn es denn so gewollt wäre.
Aber das ist es wohl nicht.
Da activeSensors in dem Fall Null ist, wird die Zeichenkette "sensorCount " ausgegeben.
Die Schleife wird nicht durchlaufen, weil activeSensors == 0
Damit ist auch klar, warum die LEDs nicht reagieren.
In meinem Beispiel habe ich activeSensors = 4 gesetzt.
Dann wird der String auch erwartungsgemäß vorn abgeschnitten.
Ich will gar nicht wissen, was ausgegeben wird, wenn die berechnete Adresse irgendwann über den String hinweg zeigt.
Warum schreibt er aber dann in #3, das diese Zeile funktionieren würde?
Vielleicht weil sie keine Fehlermeldung wirft....?
Wer kann es wissen....
Im Nachsatz folgt dann unmittelbar:
Scheinbar bekommt es dem Programm nicht sonderlich gut.
Und das hört sich dann gar nicht mehr so gesund an.
Entspricht dann aber schon eher den Vorstellungen, die ich so habe, von den Abläufen.
Ich schätze mal, das beruht alles auf den oben schon genannten Java Vorstellungen.
Die muss man allerdings über Bord werfen.
Denn Java kennt keine Pointer, und um die dreht es sich hier.
Die Alternative wäre:
Das ist ein wohldurchdachter Geniestreich!
:o Aber davon muss ich erst noch überzeugt werden :o
Wie nett das sich durch mein Post noch eine interessante Unterhaltung ergeben hat.
Die Zeile mit der erfolgreich "String-Addition" funktioniert erwartungsgemäß.
Nachdem ich aber überall diesen Fehler beseitigt habe, hat auch mein Code erwartungsgemäß funktioniert und hat nicht mehr, an mir völlig unverständlichen Stellen, den Geist aufgegeben. Das meinte ich mit "Scheinbar bekommt es dem Programm nicht sonderlich gut."
Nochmal vielen Dank für eure Hilfe. Wieder was gelernt