Probleme mit Costum Class

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;
}

Den vollständigen Code findet ihr hier.

 Serial.println("activeSensors " +activeSensors);  //Ausgabe: "sensorCount  "

Diese Zeile ist unsinn!

Die gibt bei mir "veSensors" aus.

Testcode:

const int activeSensors = 4;

void setup(void)  
{
 Serial.begin(9600);
 Serial.println("activeSensors " +activeSensors);
}

void loop(void) 
{

}

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:

Serial.print("activeSensors "); Serial.println(activeSensors);

Das erste gibt einen konstanten Text aus, das zweite wandelt eine Integer-Variable in ihre Dezimal-Darstellung und gibt diesen Text aus.

Vielen Dank für die Hilfe. Da habe ich wohl zuviel Java-Kontakt gehabt in letzter Zeit.

Nichts desto Trotz funktioniert diese Zeile tadellos:

Serial.println("n: "+ mName + " name: " +mName);

Scheinbar bekommt es dem Programm nicht sonderlich gut. Nutzt man es wie vorgesehen, klappt es besser. Jetzt komme ich weiter.

Ich bin erstaunt....

Diese Zeile bekommt aber dem RAM deines Arduino auf die Dauer nicht. Die String-Klasse fragmentiert Deinen RAM.

Gruß Tommy

Da ist keine String Klasse, weit und breit nicht zu sehen.
Sehe zumindest keine.

Nee, er addiert ein paar Adressen aufeinander und nutzt das dann als Zeiger in den Speicher.

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.

Gruß Tommy

Nöö…

Zurück zum Anfang:

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.

Ich glaube Dir. Warum schreibt er aber dann in #3, das diese Zeile funktionieren würde?

Nichts desto Trotz funktioniert diese Zeile tadellos:

Serial.println("n: "+ mName + " name: " +mName);

Das klingt für mich, als würde er die gewünschte Ausgabe bekommen.
Unklar.

Gruß Tommy

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 :slight_smile: