Einen wunderschönen guten Morgen euch allen.
Ich wundere mich derzeit über das was ich mir hier zusammengestrickt habe (siehe „code“ unten).
Warum wird immer nur die Letzte Slave-request aktualisiert?
Beispiel:
(die Slave’s übertragen beim Tastendruck eine „1“).
Wenn ich (mit dem unten gezeigtem code) beim „Slave-9“ den Taster für „L1“ drücke dann wird „L1“ nicht „aktualisiert“. Wenn ich wiederrum den Taster für „L1“ beim „Slave-12“ drücke dann wird auch eine „1“ übernommen.
Wenn ich jetzt im Code, den „Slave-9-codeschnipsel“ in der Schleifenabfolge unter
„Slave-12“ schreibe dann wird „Slave-9“ bearbeitet aber „Slave-12“ /10 dann wieder nicht.
Augenscheinlich wird immer nur der Letzte Slave in der Codeabfolge „Aktualisiert“ , sehe ich das richtig?
Ich habe hier anscheinend ein Verständnisproblem wie das ganze hier abläuft, geschweige denn wie ich dieses „Problem“ lösen kann
Erklär doch mal mit ner Handvoll Worte.
Ich sehe irgendwie L1 bis L21, aber nur L1-L4 benutzt.
Wenn da was kommentiert wäre oder die Variablen "sprechende" Namen, könnte man sich da was zusammenreimen....
"L" soll für LED stehen die dann auf einem MEGA2560 (Slave80) aktiviert wird.
Und später sollen dann die anderen "LED / L1....L21" implementiert werden (mit noch 30 weiteren Slaves).
Das habe ich mir fast schon so gedacht. Wie behebe ich das am besten?
Und ich dachte, dass mein Vorgehen so legitim und augenscheinlich einfach funktioniert.
Kannst Du mal den hier laufen lassen?
Der soll einen Slave abfragen und die abgefragten Infos an den Master senden.
Dann 2 Sekunden Pause, damit Du auf dem Master auch was siehst und den nächsten Slave etc...
Kontrollausgabe auf dem Seriellen Monitor.
#include <Wire.h>
constexpr byte master {80};
constexpr byte slaveNums {3};
constexpr byte slave[slaveNums] {9, 10, 12};
byte slaveData[4];
void setup()
{
Wire.begin();
Serial.begin(9600);
Serial.println(F("Start..."));
}
void loop()
{
for (byte b = 0; b < slaveNums; b++)
{
mainSlaveRequest(slave[b]);
printDebugData(slave[b]);
setMasterData(master);
delay(2000);
}
}
void mainSlaveRequest(const byte mainSlaveRequestAdress)
{
Wire.requestFrom(mainSlaveRequestAdress, sizeof(slaveData));
byte *pte = (byte *)slaveData;
for (unsigned int re = 0; re < sizeof(slaveData); re++)
{
*pte = Wire.read();
pte++;
}
}
void setMasterData(const byte masterAdress)
{
Wire.beginTransmission(masterAdress);
Wire.write((byte *)slaveData, sizeof(slaveData));
Wire.endTransmission();
}
void printDebugData(const byte slaveNumber)
{
Serial.print(F("Daten von Slave: "));
Serial.println(slaveNumber);
for (byte b = 0; b < sizeof(slaveData); b++)
{
Serial.print(slaveData[b]);
Serial.print(' ');
}
Serial.println();
}
Obwohl man so früh wie möglich wissen sollte, dass das alles von einem richtigen C++ Compiler verarbeitet wird. Und deshalb deutlich mehr geht, als die Arduino Referenz erwähnt.
Allerdings!
Das kann ich nur ausdrücklich bestätigen.
z.B. fehlt der Arduino Doku der, aus meiner Sicht, wichtige/elegante "range based for loop"
Von daher würde ich sagen:
Gibts sogar abgespeckt/verstümmelt für Arduino User
Ansonsten gibts ja auch noch endlos viele C++ Bücher und Tutorials (in wechselhafter Qualität)
Nachtrag: (aus der Arduino Doku)
int x = 1;
for (int i = 0; i > -1; i = i + x)
Ganz böse! Ganz böse!
Da wird auf einen int Überlauf gewartet, welcher ein undefiniertes Verhalten verursacht. Das ist der Todesstoß für das ganze Programm.
Der Schreiber des Tutorials hat sich damit 6 Monate Urlaub auf einer Streckbank seiner Wahl verdient.
E:\Programme\arduino\portable\sketchbook\sketch_nov30d\sketch_nov30d.ino: In function 'setup':
E:\Programme\arduino\portable\sketchbook\sketch_nov30d\sketch_nov30d.ino:11:29: warning: iteration 32767 invokes undefined behavior [-Waggressive-loop-optimizations]
11 | for (int i = 0; i > -1; i = i + x) ;
| ~~^~~~~~~
E:\Programme\arduino\portable\sketchbook\sketch_nov30d\sketch_nov30d.ino:11:21: note: within this loop
11 | for (int i = 0; i > -1; i = i + x) ;
| ~~^~~~
Das ist einer der gruseligsten Stellen in der Arduino Doku.
Ja, ich weiß, das funktioniert so, wie es da steht (der Überlauf wird abgefangen), aber eine gute Idee ist das nicht.....
"undefiniertes Verhalten" kann man aus Spaß aber gerne mal ausprobieren.
Ist was anderes als z.B. Vin mit 24V zu beschicken.
Man kann trefflich diskutieren, dass es einem nix nutzt, wenn man weiß, was bei undefiniertem Verhalten tatsächlich passiert. (Weil der Compiler frei ist, in der nächsten Version was anderes zu machen und z.B. zu meckern)
Da stimme ich dir schon zu, aber ein pädagogisches Konzept, erstmal nur Teile der Wahrheit zu erzählen, ist durchaus gebräuchlich. Und dass die Arduino Doku nun mal da ist, sollte jemand, der eine Verständnisfrage „Schleife“ stellt, mindestens auch wissen
Naja..
Ich halte die Arduino Doku für sehr nützlich, für die Dinge, welche Arduino mit bringt.
Für die Sprache, ist die Sprachdoku das Maß der Dinge.
Für die einzelnen µC, oder Bausteine, das jeweilige Datenblatt.
Die Arduino Doku mixt das etwas zu dolle für meinen Geschmack.
Da ist von "Arduino Sprache" die Rede.
Dort werden Macros bei den Funktionen eingeordnet.
und vieles weitere
Ja dem ist so.
Aber auch hier schießt die Arduino Doku manchmal drüber hinaus, und verbreitet Falschinformation.
Das ist für mich ganz was anderes, als Information in Häppchen aufzuteilen.
Da habe ich volles Verständnis für!
z.B. ein Kapitel im Buch lesen, und solange damit testen, spielen und modifizieren, bis man das Thema (möglichst vollständig) begriffen hat.
Dann zum nächsten Thema,......
Da möchte ich nicht wissen, was du zu @my_xy_projekt s Link in #17 sagst. Immerhin wird da schon im Vorwort auf S.3 verraten, dass als "Arduino-Sprache" auch alle sonstigen C/C++ Befehle benutzt werden können. Ist auf jeden Fall sehr Arduino-spezifisch und keine reine Übersetzung der Arduino Referenz, die es übrigens auch auf deutsch gibt.