Tasterstatus HIGH schalten ?
Hallo Leute bei dem unten Angegebenen Sketch sieht man das wen count richtig ist und der Taster gedrückt ist die LEDS in Reihenfolge blinken sollen.
Ich möchte das die LEDS nicht mehr aufhören zu blinken was muss ich da noch ergänzen?
int taster1=7;
int taster2=8;
int tasterstatus2=0;
int led1=12;
int led2=11;
int led3=10;
int led4=9;
bool oldButtonState = HIGH;
bool newButtonState;
int count = 0;
void setup() {
pinMode (taster1,INPUT);
pinMode (taster2,INPUT);
pinMode (led1,OUTPUT);
pinMode (led2,OUTPUT);
pinMode (led3,OUTPUT);
pinMode (led4,OUTPUT);
}
void loop() {
newButtonState = digitalRead(taster1);
tasterstatus2 = digitalRead(taster2);
if (oldButtonState == HIGH && newButtonState == LOW) {
count++;
oldButtonState = newButtonState;
if (count == 1) {
digitalWrite(led1, HIGH);
}
if (count == 2) {
digitalWrite(led1, LOW);
digitalWrite (led2,HIGH);
}
if (count == 3 ){
digitalWrite (led2,LOW);
digitalWrite (led3,HIGH);
}
if (count == 4){
digitalWrite (led3,LOW);
digitalWrite (led4,HIGH);
}
if (count == 5){
digitalWrite (led4,LOW);
count = 0;
}
if ((tasterstatus2 == HIGH) && (count == 1)){
digitalWrite (led1,HIGH);
digitalWrite (led2,LOW);
digitalWrite (led3,LOW);
digitalWrite (led4,LOW);
delay (1000);
digitalWrite (led1,LOW);
digitalWrite (led2,HIGH);
delay (1000);
digitalWrite (led2,LOW);
digitalWrite (led3,HIGH);
delay (1000);
digitalWrite (led3,LOW);
digitalWrite (led4,HIGH);
delay (1000);
digitalWrite (led4,LOW);
}
if ((tasterstatus2 == HIGH ) &&( count == 2)){
digitalWrite (led1,LOW);
digitalWrite (led2,HIGH);
digitalWrite (led3,LOW);
digitalWrite (led4,LOW);
delay (1000);
digitalWrite (led3,HIGH);
digitalWrite (led2,LOW);
delay (1000);
digitalWrite (led3,LOW);
digitalWrite (led4,HIGH);
delay (1000);
digitalWrite (led4,LOW);
digitalWrite (led1,HIGH);
delay (1000);
digitalWrite (led1,LOW);
}
if ((tasterstatus2 == HIGH) && (count == 3)){
digitalWrite (led1,LOW);
digitalWrite (led2,LOW);
digitalWrite (led3,HIGH);
digitalWrite (led4,LOW);
delay (1000);
digitalWrite (led3,LOW);
digitalWrite (led4,HIGH);
delay (1000);
digitalWrite (led4,LOW);
digitalWrite (led1,HIGH);
delay (1000);
digitalWrite (led1,LOW);
digitalWrite(led2,HIGH);
delay (1000);
digitalWrite (led2,LOW);
delay (1000);
}
if ((tasterstatus2 == HIGH) && (count == 4)){
digitalWrite (led1,LOW);
digitalWrite (led2,LOW);
digitalWrite (led3,LOW);
digitalWrite (led4,HIGH);
delay (1000);
digitalWrite (led4,LOW);
digitalWrite (led1,HIGH);
delay (1000);
digitalWrite (led1,LOW);
digitalWrite (led2,HIGH);
delay (1000);
digitalWrite (led2,LOW);
digitalWrite (led3,HIGH);
delay (1000);
digitalWrite (led3,LOW);
}
1 Antwort
- Zum einen fehlen Dir in dem Code zwei geschlossene Klammern. Der Code ist also nicht vollständig.
- Deine "if (oldButtonState == HIGH && newButtonState == LOW) {" ist nur einmal erfüllt, danach nie wieder, denn oldButtonState wird zwar danach auf den Tasterstatus gesetzt, aber nie wieder zurückgesetzt, egal was it dem Taster ist.
- Dein Zähler zählt also auch nur einmal eins hoch.
- Was der Zähler überhaupt bewirken soll, erschließt sich mir auch noch nicht, denn die Blinkreihenfolge ist immer die gleiche, nur eine andere StartLED. Bei zyklischem endlosen Blinken würde sich also letztlich gar nichts ändern.
- Delay ist für so eine Steuerung sehr schlecht, da bei jedem Delay der Code solange stoppt. Es werden also keine Taster eingelesen, keine Statusänderungen abgearbeitet ect... Erst wenn alle Delays durch sind und der Zyklus am Ende angekommen ist, liest er am Anfang wieder ein. Also nur dann werden Taster erfasst.
Alles in allem ist sehr viel Code überflüsseg, und die Funktionsweise erschließt sich mit nicht, was er letztlich machen soll. Schreibe mal eine vollständige Funktionsbeschreibung. Also Taster(x) soll folgende Funktoin ausführen, Taster(y) sool den Blinkablauf ein/Ausschalten oder so... ect...
Puh, so ist zwar der Code vollständig, aber falsch strukturiert für das, was Du vor hast... Alles VOR dem "else if" wird nur ausgeführt, wenn die aller erste If-Bedingung erfüllt ist. Also nur ein Zyklus nach Tastendruck. Und dann erst wieder, wenn die Taste1 neu gedrückt wird. Unabhängig was mit Taste2 ist. Der Code für die Blinkabläufe muss also hinter die geschlossene Klammer vom "else if"
Dann ist die Frage, ab wann der Blinkzyklus laufen soll.. Erst nach dem anwählen des Zählers, wenn Taste2 betätigt wurde? Soll Taste2 das auch wieder stoppen? Oder soll es gestoppt werden, wenn ein neues Programm per Taste1 angewählt wurde? Dazu hast Du auch noch nichts geschrieben. Ich kann keine Gedanken lesen und einen vollständige Funktionseschreibung lieferst Du einfach nicht... Wie soll man dann helfen? So wird das nix. Also schreibe mal einen vollständigen Ablauf, also Taste sowieso soll "..." machen und dann soll z.B. das blinken stoppen.. Starten soll das blinken erst, wenn... oder so ähnlich.. Das ist momentan alles ungeklärt... Oder soll es nur blinken, so lange man den Taster2 gedrückt hält???
Also
Ich will das man mit dem count die LEDS wechseln kann.
Wenn dann der taster2 gedrückt wird soll ab diesem Zeitpunkt der Blinkzyklus beginnen und nicht mehr aufhören.
Na dann setze mit dem Taster2 eine variable auf HIGH
if(tasterstaus2==HIGH){
blinkenEIN=HIGH
}
und verknüpfe die Blinkfogen mit
if(count==x && blinkenEIN==HIGH)
statt auf den Tasterstatus zu prüfen...
Wenn Du das dann aus haben willst, musst Du nur irgendwo noch mal definieren, wann blinkenEIN wieder zurückgesetzt werden soll.
Aber wie gesagt, die Blinksequenzen müssen aus aus der ersten if raus, damit die Abfragen überhaupt geprüft werden...
Alternativ kannst Du auch statt tasterstatus2 einzulesen, direkt digitalRead nehmen. Dann sparst Du Dir eine Variable im Programmspeicher...
}