INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Gleisbelegtmelder - Verarbeitung mit Arduino
12.10.2019, 10:31 (Dieser Beitrag wurde zuletzt bearbeitet: 12.10.2019 20:49 von Bitklopfer.)
Beitrag #1
Gleisbelegtmelder - Verarbeitung mit Arduino
Hallo zusammen, ich stelle einen Sketch vor mit dem ich ein Signal von meinen 2 Belegmeldern auf der Modellbahn
weiter mit dem Arduino verarbeite. Wird erkannt, dass der Strckenabschnitt belegt ist und der Zug darauf 550ms steht ,
geht meine Anzeige auf HIGH, Verläßt der Zug den Abschnitt geht mit delay ( 250) die Anzeige auf LOW.
Funktioniert soweit prima.
Habe nun den Sketch sozusagen für beide Abschnitte doppelt geschrieben.
Frage : Kann man das auch einfacher und eleganter machen? ( z.B. wenn noch mehr Belegmelder zum Einsatz kommen

Code:
int LED1 = 13;
int LED2 = 12;
int button = 3;
int button2 = 5;

boolean LED1State = false;
boolean LED2State = false;

long buttonTimer = 0;      
long longPressTime = 550;   .
                              
boolean buttonActive = false;
boolean longPressActive = false;
                                 .
long button2Timer = 0;
long longPress2Time = 550;

boolean button2Active = false;
boolean longPress2Active = false;

void setup() {

  pinMode(LED1, OUTPUT);
  pinMode(button, INPUT);
  pinMode(LED2, OUTPUT);
  pinMode(button2, INPUT);
}
void loop() {

  if (digitalRead(button) == HIGH) {             // Abfrage des ersten Abschnittes
    if (buttonActive == false) {
      buttonActive = true;
      buttonTimer = millis();
    }
    if ((millis() - buttonTimer > longPressTime) && (longPressActive == false)) {

      longPressActive = true;
      digitalWrite(LED1, HIGH);
    }

  } else {

    if (buttonActive == true) {
      if (longPressActive == true) {
        longPressActive = false;
      }
      buttonActive = false;
    }  else {                                       // Zug verläßt den Abschnitt
      delay(250);
      digitalWrite( LED1, LOW);
    }
  }
  if (digitalRead(button2) == HIGH) {    // Abfrage des 2 ten Abschnittes

    if (button2Active == false) {
      button2Active = true;
      button2Timer = millis();
    }
    if ((millis() - button2Timer > longPress2Time) && (longPress2Active == false)) {

      longPress2Active = true;
      digitalWrite(LED2, HIGH);
    }
  } else {
    if (button2Active == true) {
      if (longPress2Active == true) {
        longPress2Active = false;
      }
      button2Active = false;
    }  else {                                            // Zug verläßt den Abschnitt
      delay(250);
      digitalWrite( LED2, LOW);
    }
  }
}

Delay habe ich mittlerweile auch durch die millis() Anwendung ersetzt.

Mit freundlichen Grüßen
Norbert
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.10.2019, 14:37 (Dieser Beitrag wurde zuletzt bearbeitet: 12.10.2019 16:17 von Tommy56.)
Beitrag #2
RE: Gleisbelegmelder - Verarbeitung mit Arduino
Du könntest den Belegtmelder als Struct/Klasse anlegen, davon ein Array und dann kannst Du fast beliebig viele davon erledigen.
Etwa so (ungetestet):
Code:
struct Melder {
  public:
  Melder(byte pinLED, byte pinButton) : pinLED(pinLED), pinButton(pinButton) {}  // Konstruktor
   void init() {
     pinMode(pinLED, OUTPUT);
     pinMode(pinButton,INPUT);
   }
   void run() {
    if (digitalRead(pinButton)) {             // Abfrage des ersten Abschnittes
      if (!buttonActive) {
        buttonActive = true;
        buttonTimer = millis();
      }
      if ((millis() - buttonTimer > longPressTime) && (!longPressActive)) {
        longPressActive = true;
        digitalWrite(pinLED, HIGH);
      }
    } else {
      if (buttonActive) {
        if (longPressActive) {
          longPressActive = false;
        }
        buttonActive = false;
      }  else {                                       // Zug verläßt den Abschnitt
        delay(250);
        digitalWrite( pinLED, LOW);
      }
    }
   }
  private:
  byte pinLED;
  byte pinButton;
  unsigned long buttonTimer = 0; // besser unsigned
  unsigned long longPressTime = 550;
  boolean buttonActive = false;
  boolean longPressActive = false;
  // hier auch noch die Variablen für milles mit rein, wenn Du delay ersetzt
};

Melder meldArr[] = {
                      {13,3},
                      {12,5}
                    };
const byte anzMelder = sizeof(meldArr) / sizeof(meldArr[0]);

void setup() {
  for(byte i=0; i<anzMelder;i++) meldArr[i].init();
}

void loop() {
    for(byte i=0; i<anzMelder;i++) meldArr[i].run();
}

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.10.2019, 15:38
Beitrag #3
RE: Gleisbelegmelder - Verarbeitung mit Arduino
Tommy , vielen Dank für deinen sehr ausführlichen Input. Darüber muß ich etwas nachdenken.

Mit freundlichen Grüßen
Norbert
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.10.2019, 16:17
Beitrag #4
RE: Gleisbelegmelder - Verarbeitung mit Arduino
Ich habe den Code in #2 nochmal korrigiert.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.10.2019, 17:25
Beitrag #5
RE: Gleisbelegmelder - Verarbeitung mit Arduino
Diese 2 kleinen Korrekturen, hab ich bei mir aufgrung einer Fehlermeldung schon korrigiert.
Hab millis noch eingefügt und es läuft super. Vielen Dank !!

Mit freundlichen Grüßen
Norbert
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.10.2019, 17:30 (Dieser Beitrag wurde zuletzt bearbeitet: 12.10.2019 17:31 von Tommy56.)
Beitrag #6
RE: Gleisbelegmelder - Verarbeitung mit Arduino
Prima und danke für die Rückmeldung.
Dann stelle doch bitte Deine Version mit den millis hier noch rein.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.10.2019, 17:43
Beitrag #7
RE: Gleisbelegmelder - Verarbeitung mit Arduino
zusätzlichen Kontakt eingefügt mit {11,4}, funktioniert sofort. Spitze!

Mit freundlichen Grüßen
Norbert
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.10.2019, 17:49
Beitrag #8
RE: Gleisbelegmelder - Verarbeitung mit Arduino
Das ist der Vorteil von OOP. Wenn man es richtig macht, muss nur noch zusätzlich initialiosiert werden. Zumindest bei so einfachen Sachen, wo alle Instanzen das genau gleiche Verhalten haben.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Wert von einem Arduino zu einem zweiten Arduino senden Thorsten_S 9 166 Heute 14:48
Letzter Beitrag: Thorsten_S
  Firmata (Daten senden an den Arduino und empfangen vom Arduino) comfan 6 3.904 29.04.2017 14:29
Letzter Beitrag: hotsystems
  Arduino Ethernet mit USB 2 Serial Converter/Welche Einstellungen im Arduino-Sketch lociluke 1 3.482 05.05.2015 13:40
Letzter Beitrag: Bitklopfer
  Arduino Mega-Projekt mit EEPROM auf Arduino Due portieren Foto-Ralf 17 9.529 16.03.2015 12:06
Letzter Beitrag: Foto-Ralf

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste