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:
  • 1 Bewertungen - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Blink Without Delay - mal anders erklärt
31.10.2015, 19:23
Beitrag #1
Blink Without Delay - mal anders erklärt
Hallo,
immer wieder stören Delays den Programmablauf.

Wie man diese Delays vermeidet ist im Tutorial Blink Without Delay erklärt.
Scheinbar kommt aber nicht jeder mit dieser Anleitung gut zurecht. Vielleicht auch weil mehr erklärender Text als Programmcode darin enthalten ist.

Deshalb stelle ich hier eine Anleitung vor die das Prinzip anhand von Beispielen erklärt und dabei Kommentare auf das Wesentliche reduziert.

Code:
/*
Blink Without Delay - anhand von Beispielen erklärt
fünf parallel laufende, voneinander unabhängige, unterschiedliche Zeiten

!!! Variablen zum speichern von Zeiten aus millis() und micros() immer 'unsigned long' deklarieren !!!

*/


// Variablen deklarieren in denen die Startzeiten
// der einzelnen Zeitfunktionen gespeichert werden
unsigned long startzeit_1 = 0;
unsigned long startzeit_2 = 0;
unsigned long startzeit_3 = 0;
unsigned long startzeit_4 = 0;
unsigned long startzeit_5 = 0;

// Definitionen der einzelnen Schaltzeiten
#define        laufzeit_1   1234UL
#define        laufzeit_2   2345UL
#define        laufzeit_3  54321UL
#define        laufzeit_4   1111UL
#define        laufzeit_5     22UL

// Die Anschlusspins der einzelnen LEDs festlegen
const int led_1 = 10;
const int led_2 = 11;
const int led_3 = 12;
const int led_4 = 13;

// Pins als Ausgang
void setup() {
pinMode(led_1, OUTPUT);
pinMode(led_2, OUTPUT);
pinMode(led_3, OUTPUT);
pinMode(led_4, OUTPUT);
}

void loop() {


// laufzeit_1 EIN, laufzeit_1 AUS - LED schalten in loop - Schaltzeiten in Millisekunden
if (millis() - startzeit_1 >= laufzeit_1) {
  startzeit_1 = millis();
  digitalWrite(led_1, digitalRead(led_1) ^ 1);
}




// laufzeit_2 EIN, laufzeit_2 AUS - LED schalten in Funktion - Schaltzeiten in Millisekunden
if (millis() - startzeit_2 >= laufzeit_2) {
  startzeit_2 = millis();
  led2();
}




// laufzeit_3 EIN, laufzeit_3 AUS - LED schalten in loop - Schaltzeiten in Microsekunden
if (micros() - startzeit_3 >= laufzeit_3) {
  startzeit_3 = micros();
  digitalWrite(led_3, digitalRead(led_3) ^ 1);
}




// asymetrische Zeiten - laufzeit_5 EIN, laufzeit_4 AUS - LED schalten in loop - Schaltzeiten in Millisekunden
if (!digitalRead(led_4) && millis() - startzeit_4 >= laufzeit_4 ) {
  startzeit_5 = millis();
  digitalWrite(led_4, digitalRead(led_4) ^ 1);
}
if (digitalRead(led_4) && millis() - startzeit_5 >= laufzeit_5 ) {
  startzeit_4 = millis();
  digitalWrite(led_4, digitalRead(led_4) ^ 1);
}



}

// Unterprogramm für Led 2
void led2() {
digitalWrite(led_2, digitalRead(led_2) ^ 1);  
}

Für den der es nachbauen und testen will:
Das Programm verwaltet fünf parallel laufende, voneinander unabhängige, unterschiedliche Zeiten die den Programmablauf nicht blockieren.
Vier LEDs werden an den Pins 10, 11, 12 und 13 mit Vorwiderstand angeschlossen.
Die LED an Pin 10 blinkt mit einer Impuls- / Pausenzeit von 1234 Millisekunden.
Die LED an Pin 11 blinkt mit einer Impuls- / Pausenzeit von 2345 Millisekunden.
Die LED an Pin 12 blinkt mit einer Impuls- / Pausenzeit von 54321 Microsekunden.
Die LED an Pin 13 blinkt mit einer Impulszeit von 22 Millisekunden und einer Pausenzeit von 1111 Millisekunden.

Viel Spaß damit
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


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