Schönen guten Tag.
Ich arbeite zur Zeit an meiner Thesis und komme einfach auf keine Lösung meines Problems. Kurzer Überblick:
Ein Teil der Arbeit handelt davon mittels eines Encoders (Drehgebers), eine Menüwahl durchzuführen. Zur besseren Visualisierung habe ich neben dem Encoder 3 LEDs angebracht, die als Statusanzeige dienen und einem die Menühführung erleichtern sollen. Programmiert wird das ganze auf einem Arduino Uno. Die Syntax ist etwas anders aber in großen Teilen der AVR Programmierung in C# sehr ähnlich.
In der Grafik, die hoffentlich eingefügt wurde, ist der Aufbau zu sehen. Rechts der Encoder und links daneben die 3 Status LEDs.
Das Auslesen des Encoders funktioniert in beide Richtungen einwandfrei. Ich habe also immer den aktuellen Wert aus der Drehbewegung des Encoders zur Verfügung.
Nun zu meinem Problem. Ich möchte die LEDs in Drehrichtung des Encoders "mit laufen" lassen. D.h. wenn ich nach oben drehe, soll fortlaufend die nächste LED angehen. Es ist immer nur eine LED gleichzeitig eingeschalten!! Wenn ich nach unten drehe, dasselbe in die Abwärtsrichtung. Leuchtet beispielsweise die oberste LED und ich drehe weiterhin aufwärts, so soll das ganze von neuem beginnen und die unterste aufleuchten. In die entgegengesetzte Richtung dasselbe Spielchen.
Was ich nicht hin bekomme ist eine Abfrage zu schreiben, die mir anhand des aktuellen Wertes des Encoders sagt, dass in die positive bzw. negative Richtung gedreht wurde und anhand dessen die passende LED einschaltet.
Was ich bis jetzt habe ist:
void loop() //das Programm ist zunächst nur für 2 LEDs, da ich mir bis zur Lösung den Schreibaufwand sparen wollte
{
if(drehgeber > drehgeber_alt) //diese IF-Abfrage funktioniert und ist erst einmal nur für die positive Drehrichtung
{ //für die negative Drehrichtung sieht das wohl sehr ähnlich aus bis auf das Größer-Gleich-Zeichen
drehgeber_alt = drehgeber;
if(digitalRead(10) == HIGH && digitalRead(11) //die anderen beiden machen in der Konstellation natürlich keinen Sinn
{
digitalWrite(11,HIGH);
digitalWrite(10,LOW);
}
if(digitalRead(11) == HIGH) //was sich hier einstellt ist, dass die LED an Pin 10 dauerhaft an ist, was wie gesagt logisch ist, da die 2 IF-Abfragen
{ //Käse sind
digitalWrite(10,HIGH);
digitalWrite(11,LOW);
}
}
}
Für jeden hilfreichen Tipp wäre ich sehr dankbar.
Mit besten Grüßen
Ich arbeite zur Zeit an meiner Thesis und komme einfach auf keine Lösung meines Problems. Kurzer Überblick:
Ein Teil der Arbeit handelt davon mittels eines Encoders (Drehgebers), eine Menüwahl durchzuführen. Zur besseren Visualisierung habe ich neben dem Encoder 3 LEDs angebracht, die als Statusanzeige dienen und einem die Menühführung erleichtern sollen. Programmiert wird das ganze auf einem Arduino Uno. Die Syntax ist etwas anders aber in großen Teilen der AVR Programmierung in C# sehr ähnlich.
In der Grafik, die hoffentlich eingefügt wurde, ist der Aufbau zu sehen. Rechts der Encoder und links daneben die 3 Status LEDs.
Das Auslesen des Encoders funktioniert in beide Richtungen einwandfrei. Ich habe also immer den aktuellen Wert aus der Drehbewegung des Encoders zur Verfügung.
Nun zu meinem Problem. Ich möchte die LEDs in Drehrichtung des Encoders "mit laufen" lassen. D.h. wenn ich nach oben drehe, soll fortlaufend die nächste LED angehen. Es ist immer nur eine LED gleichzeitig eingeschalten!! Wenn ich nach unten drehe, dasselbe in die Abwärtsrichtung. Leuchtet beispielsweise die oberste LED und ich drehe weiterhin aufwärts, so soll das ganze von neuem beginnen und die unterste aufleuchten. In die entgegengesetzte Richtung dasselbe Spielchen.
Was ich nicht hin bekomme ist eine Abfrage zu schreiben, die mir anhand des aktuellen Wertes des Encoders sagt, dass in die positive bzw. negative Richtung gedreht wurde und anhand dessen die passende LED einschaltet.
Was ich bis jetzt habe ist:
void loop() //das Programm ist zunächst nur für 2 LEDs, da ich mir bis zur Lösung den Schreibaufwand sparen wollte
{
if(drehgeber > drehgeber_alt) //diese IF-Abfrage funktioniert und ist erst einmal nur für die positive Drehrichtung
{ //für die negative Drehrichtung sieht das wohl sehr ähnlich aus bis auf das Größer-Gleich-Zeichen
drehgeber_alt = drehgeber;
if(digitalRead(10) == HIGH && digitalRead(11) //die anderen beiden machen in der Konstellation natürlich keinen Sinn
{
digitalWrite(11,HIGH);
digitalWrite(10,LOW);
}
if(digitalRead(11) == HIGH) //was sich hier einstellt ist, dass die LED an Pin 10 dauerhaft an ist, was wie gesagt logisch ist, da die 2 IF-Abfragen
{ //Käse sind
digitalWrite(10,HIGH);
digitalWrite(11,LOW);
}
}
}
Für jeden hilfreichen Tipp wäre ich sehr dankbar.
Mit besten Grüßen