Gleichzeitiger Ablauf

Hallo zusammen,

wir bauen gerade für eine Modellbahn einen Bahnübergang, die Schranken werden über einen Servo gehoben und geschlossen, die LED der Andreaskreuze sollen blinken.

Im Idealfall sollten die LEDs zunächst dreimal blinken und die Schranken dann schließen.

Während die Schranken schließen, sollen die LEDs natürlich weiter blinken.

Ich habe bereits das hier gefunden: http://forum.arduino.cc/index.php?topic=209388.0
bin davon aber nicht so der Fan da es ohne die Servo library läuft und ich das noch nicht so verstehe.

Mein Code bisher:

#include <Servo.h>

Servo myservo;

int pos = 0; 
boolean valueServo = 0;                  // Startwert des Servo 
unsigned long previousMillisServo = 0; // speichert wie viele Sekunden seit derletzten Änderung vergangen sind
unsigned long intervalServo = 30;    // Interval zwischen zwei Änderungen


byte ledPin = 13;                  // LED liegt am (digitalen) Pin 13
boolean value = LOW;                  // Startwert der LED
unsigned long previousMillis = 0; // speichert wie viele Sekunden seit derletzten Änderung vergangen sind
unsigned long interval = 700;    // Interval zwischen zwei Änderungen
 
void setup()
{
  myservo.attach(9);
  pinMode(ledPin, OUTPUT);      // Setzt den ledPin (Pin 13) als Ausgang
}
 
void loop()
{
   if (millis() - previousMillisServo > intervalServo) {
         for (pos = 0; pos <= 110; pos += 1) {
              myservo.write(pos);              // tell servo to go to position in variable 'pos'
         }
    }




 
 /* es wird kontrolliert, ob die Zeit für das Blink-Intervall schon abgelaufen ist
  * Wenn die Zeitdifferenz zwischen dem Letzten Abspeichern und der aktuellen Zeit größer
  * als das Intervall ist, so wird die nachfolgende Funktion ausgeführt.
  */
  if (millis() - previousMillis > interval) {
    previousMillis = millis();   // aktuelle Zeit abspeichern
 
    // LED Zustand wecheln.
    value = !value;
 
    // Wert auf den Ausgang schreiben
    digitalWrite(ledPin, value);
  }
}

Hier dreht der Servo aber durch, die LED blinken aber passend.

Ich hoffe ihr könnt mir meinen Fehler aufzeigen,
Gruß und Danke SachsenBahner

Die for-Schleife muss noch weg. Du darfst in jedem Intervall nur eine Aktion durchführen. Das Limit musst du dann per if abfragen

Ich wollte mal wissen, wie so etwas mit den Task Makros aussieht. Dabei habe ich einigen Komfort einprogrammiert, möglicherweise zu viel für den Anfang. Wichtig war mir, daß die Schranke langsam geschlossen und geöffnet wird, und daß die LED des Andreaskreuz nach dem Blinken auf Aus stehen bleibt. Alles über Konstanten am Programmanfang konfigurierbar.

Wen's interessiert, ich habe den Sketch Schranke zu den Beispielen der ALib0 hinzugefügt.

SachsenBahner:
wir bauen gerade für eine Modellbahn einen Bahnübergang, die Schranken werden über einen Servo gehoben und geschlossen, die LED der Andreaskreuze sollen blinken.

Mir fehlt das Kriterium, wann die Schranken schließen sollen. Drückst Du einen Taster oder hast Du Sensoren an den Schienen?

Du brauchst eine Ablaufsteuerung (Schrittsteuerung, endlicher Automat, finite state machine). Also:

Anleitung: Endlicher Automat mit millis()

Ich löse das mittels switch/case, aber viele Wege führen bekanntlich nach Rom. Suche Dir aus, was zu Dir paßt :slight_smile:

Schwierig wird es dann bei einer zweigleisigen Strecke mit Sensoren und rangierender Lok. Diese Aspekte würde ich aber zunächst unberücksichtigt lassen.

Wenn man noch mehr parallele Abläufe implementieren möchte, wie das bei einer Modelleisenbahn vorkommt, dann wird ein Ansatz mit Tasks immer interessanter. Eine Implementierung mit einem Automaten ist zumindest nicht einfacher, die Implementierung der Task-Makros erzeugt ja schon so einen Automaten, nur sieht man das nicht ohne einen Blick in das Assembler-Listing. Jedes Task-Makro erzeugt einen weiteren Zustand des Automaten.

DrDiettrich:
... dann wird ein Ansatz mit Tasks immer interessanter.

Leider bin ich noch nicht dazu gekommen, mir den Lösungsansatz mittels Task anzusehen, interessant ist das auf jeden Fall, steht auf der ToDo-Liste. Mit millis() umgehen zu können und das verstanden zu haben, ist aber sicher auch nicht verkehrt :slight_smile:

Mal sehen, auf welchen Zug Sachsenbahner aufspringt.