Anfängerfrage... 2Taster entprellen... Hoch-Runterzählen

Hallo,
ich stehe am Anfang meiner Weiterbildung zum Techniker und bin gerade dabei einen Prüfstand für ABS-Sensoren zu bauen.
Ich versuche einen Sketch zu schreiben für den Arduino Uno.

Ich habe:
2Taster
3 Led´s
1 Motor

Es soll 3 Stufen geben.
Stufe 1: 1Led und ein PWM Signal am Motor
Stufe 2: 2Led´s und PWM
Stufe 3: 3Led´s…

Nach der 3.Stufe soll es nicht weiter hoch gehen egal wie oft ich den Taster für hoch drücke.
Taster runter soll natürlich die Stufen runter schalten bis 0

Ich habe einen externen Pulldown widerstand an die Taster gelegt.

Der Sketch ist im Anhang…

Wäre klasse wenn jemand sich das mal anschauen könnte damit ich für die nächsten Projekte was draus lernen kann.

Gruß Lars

// constants won't change. They're used here to
// set pin numbers:
const int tasterHoch = 2;     // the number of the pushbutton pin
const int tasterRunter = 3;     // the number of the pushbutton pin
const int ledPin1 =  11;      // the number of the LED pin
const int ledPin2 =  12;      // the number of the LED pin
const int ledPin3 =  13;      // the number of the LED pin
const int MotorPin =  6;      // the number of the LED pin
int zaehler = 0;
int buttonStateH = 0;
int buttonStateD = 0;

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(MotorPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(tasterHoch, INPUT);
  pinMode(tasterRunter, INPUT);
}

void loop() {
  // read the state of the pushbutton value:
  buttonStateH = digitalRead(tasterHoch);
  buttonStateD = digitalRead(tasterRunter);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonStateH == HIGH) {
        delay(5);
        if (buttonStateH) {

          if (buttonState == LOW)
          {
            if (buttonState) {
          
       zaehler ++;
        }
          }
        }
  }
   if (buttonStateD == HIGH) {
        delay(5);
        if (digitalRead(tasterRunter)) {

          if (buttonState == LOW)
          {
            if (digitalRead(tasterRunter)) {
          
       zaehler --;
        }
          }
        }
  }
          zaehler = min (3 , zaehler);
          zaehler = max (0 , zaehler);
// *********************************************************** zaehler = 0 ****************************        
          if (zaehler == 0) {
          digitalWrite (ledPin1, LOW);
          digitalWrite (ledPin2, LOW);
          digitalWrite (ledPin3, LOW); 
          analogWrite (MotorPin, 0);
          }
// *********************************************************** zaehler = 1 ****************************        
          if (zaehler == 1) {
          digitalWrite (ledPin1, HIGH);
          digitalWrite (ledPin2, LOW);
          digitalWrite (ledPin3, LOW); 
          analogWrite (MotorPin, 100);
          }
 // *********************************************************** zaehler = 2 ****************************        
          if (zaehler == 2) {
          digitalWrite (ledPin1, HIGH);
          digitalWrite (ledPin2, HIGH);
          digitalWrite (ledPin3, LOW); 
          analogWrite (MotorPin, 150);
          }
 // *********************************************************** zaehler = 3 ****************************        
          if (zaehler == 3) {
          digitalWrite (ledPin1, HIGH);
          digitalWrite (ledPin2, HIGH);
          digitalWrite (ledPin3, HIGH); 
          analogWrite (MotorPin, 200);
          }
  }

Button_Hammes2.ino (2.85 KB)

Hallo,
die “Klasse” die wir liefern könnten wäre um Längen besser, wenn Du Deinen Sketch in CodeTag´s
(Editor, oben links </>) setzten würdest.
Sollten es zuviele Zeichen sein, kannst Du ihn auch teilen.
Viel Spaß dabei
Andreas

Hi

Ich war Mal so frei und habe mir ein weiteres Verzeichnis in meiner Arduino-Umgebung eingefangen …

Ob Dir ein Delay(5) reicht, ist abzuwarten. 5ms ist nicht sonderlich lang für mechanische Taster.
Dann das Setzen Deiner LEDs kannst Du mit drei Abfragen mit je zwei Anweisungen ‘erschlagen’.
Wenn Stufe >=1 LED1 HIGH (bei 1,2,3), sonst LED1 LOW (bei 0)
Wenn Stufe >=2 LED2 HIGH (bei 2,3), sonst LOW (0,1)
Wenn Stufe >2 LED3 HIGH (bei 3), sonst LOW (0,1,2)

Da eine Abfrage wohl mehr Takte benötigt, als das dauernde Setzen des Port, kann man Das sogar schon so stehen lassen.

Alternativ verschachtelt man in der Abfrage der Taster:
3->2 LED3 AUS
2->1 LED2 AUS
1->0 LED1 AUS
0->1 LED1 AN
1->2 LED2 AN
2->3 LED3 AN
Da man ja nur 1x diese Änderung sieht, schaltet man auch nur dieses eine Mal an den LEDs rum.
Dafür muß man sich natürlich den ‘letzten Zustand’ merken.

MfG

Habe meinen Beitrag editiert und den Code direkt eingefügt. led´s und das PWM haben sehr gut geklappt nur das entprellen hatte nicht finktioniert. Dann habe ich mir die Sketchzeile aus einem Beispiel mit reingeschrieben und jetzt läuft nix mehr -.-

versuch es mal so

/*
 *© Ardubu Nov 2017
 *Taster wird zwischen GND und pin_x angeschlossen
 *interner Pullup Widerstand aktiviert
 *der counter zählt von 0 bis 3 jeden Tastendruck
*/

#define DEBUG //Nur zur Fehlersuche aktivieren
#define tasterHoch 2   //Taster an D2 und GND
#define tasterRunter 3 //Taster an D3 und GND
#define ledPin1 11     // LED an D11
#define ledPin2 12     // LED an D12
#define ledPin3 13     // LED an D13
#define MotorPin 6    // the number of the Mootor pin
#define debounce_delay 15 //Entprellzeit für den Taster in ms
  bool tasterHochState, tasterRunterState, tasterHochState_alt,  tasterRunterState_alt;// Variablendeklaration (global)
  uint8_t counter; //Zählt wie oft die Taste gedrückt wurde
void setup() {
  #ifdef DEBUG
  Serial.begin(115200);
  Serial.println("Setup");
  #endif
  pinMode(tasterHoch, INPUT_PULLUP);
  pinMode(tasterRunter, INPUT_PULLUP);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
 }

void loop() {

 static uint32_t debounce_time;
 if (millis()-debounce_time>debounce_delay)tasterHochState = digitalRead(tasterHoch); //einlesen des Tasters
    
 if (tasterHochState != tasterHochState_alt) // bei Pegelwechsel 
    {
     debounce_time=millis();
     #ifdef DEBUG
               Serial.println(counter);
     #endif
     if(!tasterHochState)//wenn Taster gedrückt
       {counter++;
        counter   = min (3 , counter  );
       }
        tasterHochState_alt = tasterHochState; // state aktualisieren
     }
 if (millis()-debounce_time>debounce_delay)tasterRunterState = digitalRead(tasterRunter); //einlesen des Tasters   
   
 if (tasterRunterState != tasterRunterState_alt) // bei Pegelwechsel 
    {
     debounce_time=millis();
     #ifdef DEBUG
               Serial.println(counter);
     #endif
     if(!tasterRunterState)//wenn Taster gedrückt
       {counter--;
        if(counter<1||counter>250) counter=0;
       }
        tasterRunterState_alt = tasterRunterState; // state aktualisieren
     }  

// *********************************************************** counter   = 0 ****************************       
          if (counter   == 0) {
          digitalWrite (ledPin1, LOW);
          digitalWrite (ledPin2, LOW);
          digitalWrite (ledPin3, LOW);
          analogWrite (MotorPin, 0);
          }
// *********************************************************** counter   = 1 ****************************       
          if (counter   == 1) {
          digitalWrite (ledPin1, HIGH);
          digitalWrite (ledPin2, LOW);
          digitalWrite (ledPin3, LOW);
          analogWrite (MotorPin, 100);
          }
 // *********************************************************** counter   = 2 ****************************       
          if (counter   == 2) {
          digitalWrite (ledPin1, HIGH);
          digitalWrite (ledPin2, HIGH);
          digitalWrite (ledPin3, LOW);
          analogWrite (MotorPin, 150);
          }
 // *********************************************************** counter   = 3 ****************************       
          if (counter   == 3) {
          digitalWrite (ledPin1, HIGH);
          digitalWrite (ledPin2, HIGH);
          digitalWrite (ledPin3, HIGH);
          analogWrite (MotorPin, 200);
          }        
}//Ende loop

Vielen vielen Dank an euch alle aber besonders an "ardubu"! Sketch funktioniert genauso wie gewünscht ;) hast mir super weitergeholfen