Die Geschwindigkeit eines Lauflichts soll durch einen Drehgeber (Rotary-Encoder) gesteuert werden. Die Drehung vorwärts beschleunigt das Lauflicht, die Drehung rückwärts verlangsamt das Lauflicht. Durch die Kopplung eines Pins an einen Interrupt kann das Lauflicht durch Drehen des Drehgebers unterbrochen und neu gestartet werden.
So sieht es aus:
Ein Drehgeber setzt mechanische Bewegung in elektrische Impulse. Hier wird ein 2-Kanal-Drehgeber eingesetzt, der Vorwärts- und Rückwärtsbewegungen erkennen kann.
Benötigte Bauteile:
- 5 LEDs
- Drehgeber (Rotary Encoder)
- 5 Widerstände 100 Ω
- Leitungsdrähte
Beachte die ⇒Vorwiderstände verschiedener LEDs
Baue die Schaltung auf.
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
Definiere 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 setup-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 Interrupt ausgelöste Funktion DrehgeberLesen(). Beachte 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 Funktion 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 startet das Lauflicht.
void loop()
{
// Lauflicht starten
for (int i = 0; i < LEDMax; i++)
{
Lauflicht();
}
}
Verwandte Anleitungen:
- Interrupt: Lauflicht
- Interrupt: Licht ein- und ausschalten
- Interrupt: Licht schalten mit Bewegungsmelder
- Interrupt: Morsegerät
- Interrupt: Farbenspiel mit einem NeoPixel-Ring
- Interrupt: Lauflicht mit Fernbedienung
Letzte Aktualisierung: