Inter­rupt: Lauflicht

Lese­zeit: 5 Minu­ten

Lösung
Seite als PDF

Bei die­ser Anlei­tung lernst du ein neu­es Kon­zept für die Defi­ni­ti­on von Kon­stan­ten vom Typ int kennen.

enum kann die Defi­ni­ti­on einer grö­ße­ren Anzahl Kon­stan­ten vom Typ int ver­ein­fa­chen. Das ers­te Ele­ment erhält den Wert 0, jedes wei­te­re wird um 1 hochgezählt.

Das Bei­spiel­pro­gramm defi­niert die Wochen­ta­ge als Aufzählung.

enum Wochentage
{
  Sonntag, 
  Montag, 
  Dienstag, 
  Mittwoch, 
  Donnerstag,
  Freitag,
  Samstag 
};

void setup() 
{
  Serial.begin(9600); 

  // Startwert → Sonntag, Endwert → Samstag 
  for (int i = Sonntag; i <= Samstag; i++)
  { 
    Serial.print(i); Serial.print("\t"); 
  }

  Serial.println();
  Serial.print("So\tMo\tDi\tMi\tDo\tFr\tSa");
} 

void loop()
{
  // bleibt leer, Programm läuft nur einmal 
}
enum-Beispiel: Wochentage

Der Start­wert des ers­ten Ele­ments kann auch gesetzt werden:

enum Farben
{
  // Startwert setzen
  GRUEN = 3,
  WEISS,
  ROT,
  BLAU,
  GELB
};

void setup()
{
  Serial.begin(9600);

  // Startwert → GRUEN, Endwert → GELB
  for (int i = GRUEN; i <= GELB; i++)
  {
    Serial.print(i);
    Serial.print("\t");
  }
}

void loop()
{
   // bleibt leer, Programm läuft nur einmal
}
enum: Startwert setzen

Wei­te­re Informationen

Außer­dem benö­tigst du eine Erwei­te­rung der for-Schlei­fe.
for-Schlei­fen kön­nen mit dem Schlüs­sel­wort break been­det werden:

Bei­spiel: die for-Schlei­fe wird nach dem Wert 5 beendet.

void setup()
{
  Serial.begin(9600);
  for (int i = 0; i < 10; i++)
  {
    Serial.println("Zahl " + String(i));
    if (i == 5)
    {
      Serial.println("Schleife wird nach " + String(i) + " beendet!");
      break;
    }
  }
}

void loop()
{
  // bleibt leer, Programm läuft nur einmal
}
Beispiel: for-Schleife beenden

Benö­tig­te Bauteile:

  • 5 LEDs
  • 3 Wider­stän­de 220 Ω (gel­be, rote und grü­ne LED)
  • 2 Wider­stän­de 100 Ω (blaue und wei­ße LED)
  • Berüh­rungs­sen­sor
  • Lei­tungs­dräh­te

Beach­te die ➨Vor­wi­der­stän­de ver­schie­de­ner LEDs

Baue die Schal­tung auf.
(Fah­re mit der Maus über das Bild, um die Bezeich­nun­gen der Bau­tei­le zu sehen)

Beim Start des Pro­gramms sol­len die LEDs nach­ein­an­der für 200 Mil­li­se­kun­den nach­ein­an­der leuch­ten. Eine Berüh­rung des Sen­sors schal­tet das Lauf­licht aus, die nächs­te Berüh­rung star­tet es von Neuem. 

Defi­nie­re die LEDs als Auf­zäh­lung, der Sen­sor muss zwin­gend an Pin 2 oder 3 ange­schlos­sen wer­den. Die Varia­ble, deren Zustand für das Stopp und das Wei­ter des Lauf­licht­lichts ver­ant­wort­lich ist, wird als bool definiert. 

enum Farben
{
  GRUEN = 3,
  WEISS,
  ROT,
  BLAU,
  GELB
};

int SENSOR = 2;

volatile bool Stopp = true;

Im set­up-Teil wird der pin­Mo­de der LEDs defi­niert. Der Start­wert ist die grü­ne LED, der End­wert die gel­be LED.
Außer­dem wird die Funk­ti­on LED­Schal­ten als Inter­rupt-Rou­ti­ne defi­niert. Weil der beim Berüh­ren des Sen­sors aus­ge­le­se­nen Wert HIGH ist, reagiert der Inter­rupt auf RISING. 

void setup()
{
  // pinMode der LEDs definieren
  for (int i = GRUEN; i < GELB; i++)
  {
    pinMode(i, OUTPUT);
  }
  
  // Funktion für das Auslösen des Interrupts definieren
  attachInterrupt(digitalPinToInterrupt(SENSOR), LEDSchalten, RISING);
}

attach­In­ter­rupt

Der loop-Teil. Beach­te die Kommentare.

void loop()
{
  // solange Stopp den Wert true hat
  while (Stopp)
  {
    for (int i = GRUEN; i <= GELB; i ++)
    {
      // aktuelle LED i einschalten
      digitalWrite(i, HIGH);
      delay(200);

      // aktuelle LED i ausschalten
      digitalWrite(i, LOW);

      // Schleifen-Durchlauf stoppen (break)
      // wenn die Variable Stopp den Wert false hat
      if (!Stopp) break;
    }
  }
}

Jetzt benö­tigst du nur noch die Funk­ti­on LEDSchalten.
Sie tut nichts ande­res als den Wert für Stopp jeweils umzudrehen.

void LEDSchalten()
{
  Stopp = !Stopp;
}

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 9. Okt 2023 @ 17:40