Suche

A     B     C     D     E     F     G     H     I     J     K     L     M     N     O     P     Q     R     S     T     U     V     W     X     Y     Z


Formelsammlung
Alle Tests
 F7 F9




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.







Sidemap - Technik Impressum E-Mail Datenschutz Sidemap - Hersteller