Inter­rupt - Lauf­licht mit Drehgeber

Lese­zeit: 3 Minu­ten

Lösung
Seite als PDF

Die Geschwin­dig­keit eines Lauf­lichts soll durch einen Dreh­ge­ber (Rota­ry-Enco­der) gesteu­ert wer­den. Die Dre­hung vor­wärts beschleu­nigt das Lauf­licht, die Dre­hung rück­wärts ver­lang­samt das Lauf­licht. Durch die Kopp­lung eines Pins an einen Inter­rupt kann das Lauf­licht durch Dre­hen des Dreh­ge­bers unter­bro­chen und neu gestar­tet werden. 

So sieht es aus:

attach­In­ter­rupt()

Ein Dreh­ge­ber setzt mecha­ni­sche Bewe­gung in elek­tri­sche Impul­se. Hier wird ein 2-Kanal-Dreh­ge­ber ein­ge­setzt, der Vor­wärts- und Rück­wärts­be­we­gun­gen erken­nen kann.

Benö­tig­te Bauteile:

  • 5 LEDs
  • Dreh­ge­ber (Rota­ry Encoder)
  • 5 Wider­stän­de 100 Ω
  • 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)

Defi­nie­re die Variablen:

// Array mit 5 Elementen und den zugehörigen Ports 
byte LED[5] = {3, 4, 5, 6, 7};

// Anzahl der LEDs feststellen
byte LEDMax = sizeof(LED);

// Interrupt-Pin
# define EncoderPinA 2
# define EncoderPinB 8

// Leuchtdauer beim Start: 100 Millisekunden
volatile unsigned int Leuchtdauer = 100;

// Sprung in Schritten, wenn eine Bewegung erkannt wird
int SprungSchritte = 10;

Der set­up-Teil:

void setup()
{
  for (int i = 0; i < LEDMax; i++) 
  {
    pinMode(LED[i], OUTPUT);
  }
  pinMode(EncoderPinA, INPUT_PULLUP);
  pinMode(EncoderPinB, INPUT_PULLUP);

  // Interrupt-Pin EncoderPinA zuordnen
  attachInterrupt(digitalPinToInterrupt(EncoderPinA), DrehgeberLesen, CHANGE);
}

Die durch den Inter­rupt aus­ge­lös­te Funk­ti­on Dreh­ge­ber­Le­sen(). Beach­te die Kommentare.

void DrehgeberLesen()
{
  /*
    wenn beide Drehgeber-Pins gleich sind -> Bewegung vorwärts
    sind sie unterschiedlich -> Bewegung rückwärts.
    Drehung nach links -> Leuchtdauer vergrößern
    Drehung nach rechts -> Leuchtdauer verkleinern
  */
  if (digitalRead(EncoderPinA) == digitalRead(EncoderPinB)) 
  {
    Leuchtdauer += SprungSchritte;
  }
  else Leuchtdauer -= SprungSchritte;
  if (Leuchtdauer < 100) Leuchtdauer = 100;
}

Die Funk­ti­on Lauflicht():.

void Lauflicht()
{
  for (int i = 0; i < LEDMax; i++)
  {
    // aktuelle LED i einschalten
    digitalWrite(LED[i], HIGH);
    delay(Leuchtdauer);
    digitalWrite(LED[i], LOW);
  }
}

Der loop-Teil star­tet das Lauflicht.

void loop()
{
  // Lauflicht starten
  for (int i = 0; i < LEDMax; i++)
  {
    Lauflicht();
  }
}

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 23. Nov 2023 @ 13:38