Lokdecoder 2

Wir haben das Programm, dass uns ChatGPT geschickt hat, auch nach weiteren Kommentaren nur teilweise verstanden. Hier folgt jetzt eine zwar längere, aber vielleicht auch von unseren Lesern/innen besser
nachvollziehbare Version:
const int dccPin = 2;
char bits[300];
int bitPos = 0;
char paket[100];
bool collecting = false;
void setup()
{
Serial.begin(115200);
pinMode(dccPin, input);
}
Damit wird die Übertragungsgeschwindigkeit auf den höchst möglichen Wert gesetzt. Die Daten, oder besser gesagt die Flanken, erreichen den Arduino über Pin 2, der dazu auf 'Input' gesetzt wird. Ein
Wechsel zwischen kurzen Flanken für die '1' und langen Flanken für die '0'.
unsigned long lastTime = 0;
void loop()
{
if (digitalRead(dccPin) == HIGH)
{
while(digitalRead(dccPin) == HIGH);
unsigned long now = micros();
unsigned long dt = now - lastTime;
lastTime = now;
if(dt < 80)
{
bits[bitPos++] = '1';
}
else
{
bits[bitPos++] = '0'
}
}
}
Trickreich: (digitalRead(dccPin) wird mit einer einfachen while-Schleife wiederholt, damit das Programm wartet, bis das Signal wieder LOW wird. Das geschieht, um zu gewährleisten, dass derselbe Puls
unbedingt nur einmal erkannt wird.
Nach 80 µs wird wieder nachgeschaut. Bei einer '1' ist dauert der HIGH nur etwas über 50 µs. Der hat dann schon umgeschaltet, während bei der '0' der HIGH noch andauert. So kann man beide unterscheiden
und eine '0' oder eine '1' in bits hineinschreiben.
int oneCount = 0;
if(bit == '1')
{
oneCount++;
}
else // bit == '0'
{
if(oneCount >= 10)
{
collecting = true;
bitPos = 0;
}
oneCount = 0;
}
Hier wird eine Variable 'oneCount' definiert und auf Null gesetzt. Sie zählt, sobald eine Eins auftaucht. Wichtig dabei: Die ganzen weiteren Maßnahmen nach 'else' werden erst nach mindestens 10 Einsen und
einer folgenden Null in Gang gesetzt.
Und was passiert dann? Dafür ist die Variable collecting da. Die wurde ursprünglich einmal definiert und auf 'false' gesetzt. Die erhält jetzt ein 'true' und sorgt noch innerhalb der void loop() dafür, dass jetzt in die
ebenfalls im Anfang definierte Variable 'paket' gespeichert wird
if(collecting)
{
paket[bitPos] = bit;
bitPos++;
}
So, jetzt sind alle Informationen aus diesem Block in 'paket' gespeichert. Beim nächsten Schritt muss dieses 'paket' daraufhin untersucht werden, ob es überhaupt für die Lok bestimmt ist, die das 'paket'
aufgenommen hat.
|