Inter­rupt: Lauf­licht

Lese­zeit: 5 Minu­ten
Navi­ga­ti­on

Bei die­ser Auf­ga­be lernst du ein neu­es Kon­zept für die Defi­ni­ti­on von Varia­blen vom Typ int ken­nen.

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

Das Bei­spiel­pro­gramm defi­niert die Wochen­ta­ge als Auf­zäh­lung.

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 
}

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

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
}

Wei­te­re Infor­ma­tio­nen

Außer­dem benö­tigst du eine Erwei­te­rung der for-Schleife.

for-Schleifen kön­nen mit dem Schlüs­sel­wort break been­det wer­den:

Bei­spiel: die for-Schleife wird nach dem Wert 5 been­det.

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
}

Benö­tig­te Bau­tei­le:

  • 5 LEDs
  • 5 Wider­stän­de > 100 Ω
  • Berüh­rungs­sen­sor
  • Lei­tungs­dräh­te

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 Neu­em.

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 defi­niert.

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

int SENSOR = 2;

volatile bool Stopp = true;

Im setup-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 Metho­de LED­Schal­ten als Interrupt-Routine 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);
  }
  
  // Methode für das Auslösen des Interrupts definieren
  attachInterrupt(digitalPinToInterrupt(SENSOR), LEDSchalten, RISING);
}

attach­In­ter­rupt

Der loop-Teil. Beach­te die Kom­men­ta­re.

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 Metho­de LED­Schal­ten.
Sie tut nichts ande­res als den Wert für Stopp jeweils umzu­dre­hen.

void LEDSchalten()
{
  Stopp = !Stopp;
}


Ver­wand­te Auf­ga­ben:


Letzte Aktualisierung: 31. Jul 2020 @ 9:29