Warum ist das falsch(Arduino 3 mal Taster drücken,damit Lampe leuchtet)?
Was ist im Code denn falsch,dass das nicht funktioniert(also das ich erst 3 mal den taster drücken muss damit die led angeht)
3 Antworten
Nun, du liest Buttonpressed gar nicht ein, sondern prüfst, ob es HIGH ist. Da fehlt das digitalRead und eine Variable, wo der Status drin gespeichert wird, und außerdem ist ein Zyklus so schnell, dass digitalRead ggf bei einem Tastendruck schon höher wie drei zählt... Zykluszeiten sind um die Mikrosekunden.. Deshalb meinte ich eben noch, dass Du eine Prüfung einbauen musst, ob der Button gerade gedrückt wurde, oder noch gedrückt ist...
int i;
i = 2;
if (digitalRead(4) == HIGH){
delay(500);
i = i + 1;
delay(500);
}
if (i == 5) {
digitalWrite(8, HIGH);
}
if (digitalRead(5) == HIGH) {
delay(500);
i = i + 1;
delay(500);
}
if (i == 10) {
digitalWrite(8, LOW);
}
Serial.println(i);
-------------------------------------------------
das ist was mir als lösung geschickt worden ist
ist das so richtig(die lösung) ?
Sagen wir so, der Code ist nicht vollständig, zählt beide Taster hoch, setzt sich nie zurück und warum i direkt mit 2 initialisiert wird, ist mir ein Rätsel... Zudem ist die Lösung mit 500ms Delay zum entprellen des Tasters auch nicht schön gelöst, aber einfache Lösung. Nachteil ist, dass der Taster eine Sekunde gesperrt ist und der Code stoppt (500ms vor dem Zähleraddieren und noch mal 500ms danach)
das wurde mir von meinem lehrer geschickt.
Hier mein Code, wie ich es schreiben würde:
int i = 0; //Zählervariable
bool buttonState2 = LOW; //Taster2 Statusspeicher für Flanke
bool button2 = LOW; //Taster2 Status eingelesen
void setup() {
// put your setup code here, to run once:
pinMode (2, INPUT); //Pin2 als Eingang
pinMode (3, INPUT); //Pin3 als Eingang
pinMode (4, OUTPUT); //Pin4 als Ausgang
}
void loop() {
// put your main code here, to run repeatedly:
button2 = digitalRead(2); //Taster an Pin 2 einlesen und speichern
delay(3); // kurzes Delay zum entprellen, eig nicht unbedingt nötig..
/* Im nachstehenden if wird geprüft, ob der Taster gedrückt wurde, aber zuvor noch nicht gedrückt wurde.
* Wird der Taster fest gehalten, so ist buttonState2 bereits HIGH und die Bedingung nicht mehr erfüllt.
* Es wird verhindert, dass der Zähler in jedem Zyklus weiter zählt
*/
if (button2 == HIGH && buttonState2 == LOW) { //Flankenauswertung steigend
buttonState2 = HIGH; //Tasterdruck nachführen für Flankenauswertung
i = i + 1; // Zähler addieren
}
if (button2 == LOW && buttonState2 == HIGH) { //Flankenauswertung fallend
buttonState2 = LOW; //Rücksetzen der Tasternachführung, Zähler wieder scharf
}
if (i == 3) { //prüft, ob Zähler den Wert erreicht hat
digitalWrite(4, HIGH); //Ausgang einschalten
delay(2000); //2sek Verzögerung
digitalWrite(4, LOW); //Ausgang ausschalten
i = 0; //Zähler auf 0 setzen, damit wieder er wieder von vorne zählen kann
}
}
Ich gehe den Code von oben nach unten durch. Zuerst ist
Zeile 4: Buttonpressed = 2
Zeile 20: if(Buttonpressed = HIGH){....}
Es steht also in der if eigentlich
Zeile 20: if(2= HIGH){....}
Die If wird also ausgeführt wenn 2 == HIGH ist. Ist es das oder ist das Blödsinn?
Weiterhin steht bei der if ein = statt einem == Vergleichszeichen.
Ich merke gerade, dass ich zu flüchtig geschaut habe... Hast noch mehr gefunden wie ich... ^^
Der schwerste Fehler:
i=1+1.
Du setzt damit i jedesmal auf 2. Du meinst sicher "i= i+1" oder in kurzfrom "i++" oder "i+=1".
Dann fehlt da ein debounce, da sonst ein druck zu mehreren gezählten tastendrücken führen kann (z.B. mit nem Delay o.ä.).
Und i wird nie höher wie 2... Denn Du weist i nicht i+1 zu, sondern 1+1 und das bleibt immer 2