Tastatur um Stunden einer Uhr einzustellen

Guten Tag zusammen!

Mein Ziel ist es mit zwei Tasten die Stunden einer Uhr einzustellen.

Taste up : 00 bis 23
Taste down: 23 bis 00

es klappt jedenfalls nur zum Teil.

ich finde den Fehler leider nicht selber.

Stefan

// Sketch um von 00 bis 23 zu zaehlen bei Taste up
// und wieder von 23 bis auf 00 bei Taste down


const int  button_up_input = 9;                                    // Taste up = Eingang 9
const int  button_down_input = 8;                                  // Taste down = Eingang 8


int state_button_down = digitalRead(button_up_input);            // lese pushbutton down von input pin:
int state_button_up = digitalRead( button_down_input);           // lese pushbutton up von input pin:

int buttonPushCounter = 00;                                        // taehler fur Tasten Druecke
int buttonState_up = 0;                                            // Aktueller Status der Taste
int buttonState_down = 0;                                          // Aktueller Status der Taste
int lastButtonState = 00;                                          // vorheriger Status der Taste

long lastDebounceTime = 0;                                         // das letze mal als der ausgang pin geaendert wurde

void setup() {

  Serial.begin(115200);

  pinMode(button_up_input, INPUT);                                // initialisiere den button Pin als eingang:
  pinMode(button_down_input, INPUT);                               // initialisiere den button Pin1 als eingang:

  Serial.println("Sunden:");

  Serial.println(lastButtonState);
}

void loop() {

  buttonState_up = digitalRead(button_up_input);
  buttonState_down = digitalRead(button_down_input);

  if (buttonState_up != lastButtonState) {                   // vergleiche buttonState mit vorherigem Status

    if (buttonState_up == HIGH)  {                             // wenn sich der status geaendert hat dann increment counter

   

      buttonPushCounter++;

      Serial.println(buttonPushCounter);
    }

    delay(250);
  }

  lastButtonState = buttonState_up;                      // speichere aktuellen status als letzten status , fuer nchsten durchlauf im loop



  if (buttonState_down != lastButtonState) {              // vergleiche buttonState mit vorherigem Status

    if (buttonState_down == HIGH) {                       // wenn sich der status geaendert hat dann decrement counter

      buttonPushCounter -= 1;

      Serial.println(buttonPushCounter);
    }

    delay(50);

    if (buttonPushCounter < 10) {

      Serial.print("0");
    }

    if (buttonPushCounter > 10) {

      Serial.print("");

    }

    if (buttonPushCounter < 1) {

      buttonPushCounter = 00;

    }

    if (buttonPushCounter > 22) {

      buttonPushCounter = 22;

    }
  }
  lastButtonState = buttonState_down;                    // speichere den aktuellen Status als letzen Status, fuer naechssten durchlauf im lopp
}
  • Für 2 Tasten solltest du auch 2 * lastButtonState Variable spendieren
int state_button_down = digitalRead(button_up_input);            // lese pushbutton down von input pin:

int state_button_up = digitalRead( button_down_input);          // lese pushbutton up von input pin:

  • Funktionsaufrufe in der Definition von globalen Variablen willst du nicht wirklich. Wann sollen die aufgerufen werden ? In setup() wäre früh genug, und sogar noch überflüssig.

  • Den buttonPushCounter würde ich gleich beim Verändern auf den gültigen Bereich begrenzen

Hallo michael_x,

erstmal Danke!

Für 2 Tasten solltest du auch 2 * lastButtonState Variable spendieren

habe ich nachgeholt und diese Funktionsaufrufe geloescht.

int state_button_down = digitalRead(button_up_input);            // lese pushbutton down von input pin:
int state_button_up = digitalRead( button_down_input);           // lese pushbutton up von input pin:

Dennoch das zählen klappt nach wie vor nicht flüssig meist bei übergang von 9 > 10 und von 10 > 9 passiert
dann folgendes ..

Erst mal runter zaehlen ..

14
13
12
11
10
9 < ...
08
07
06
05
06 .... > wieder hoch zaehlen
07
08
09
010 < ...
11
12

bzw. wenn man bei 0 die down Taste drückt

0
-1
0-1
0-1
0-1
0-1
0-1

ein problem habe ich geloest..

nur noch 2 das erste beim übergang von 10 > 9 wird immer noch 9 angezeigt
und wenn man bei 0 angekommen ist wird eine -1 angezeigt.

// Sketch um von 00 bis 23 zu zaehlen bei Taste up
// und wie der von 23 bis auf 00 bei Taste down


const int  button_up_input = 9;                                    // Taste hoch = Eingang 9
const int  button_down_input = 8;                                  // Taste hoch = Eingang 8


int buttonPushCounter = 00;                                        // zaehler fur Tasten Druecke
int buttonState_up = 0;                                            // Aktueller Status der Taste
int buttonState_down = 0;                                          // Aktueller Status der Taste
int lastButtonState = 00;                                          // vorheriger Status der Taste

long lastDebounceTime = 0;                                         // das letze mal als der ausgang pin geaendert wurde
long debounceDelay = 250;                                          // Entprellzeit

void setup() {

  Serial.begin(115200);

  pinMode(button_up_input, INPUT);                                // initialisiere den button Pin als eingang:
  pinMode(button_down_input, INPUT);                               // initialisiere den button Pin1 als eingang:

  Serial.println("Sunden:");

  Serial.println(lastButtonState);
}

void loop() {

  buttonState_up = digitalRead(button_up_input);
  buttonState_down = digitalRead(button_down_input);

  if (buttonState_up != lastButtonState) {                   // vergleiche buttonState mit vorherigem Status

    if (buttonState_up == HIGH)                              // wenn sich der status geaendert hat dann increment counter

    {

      buttonPushCounter++;

      Serial.println(buttonPushCounter);
    }

    delay(150);
  }

  lastButtonState = buttonState_up;                      // speichere aktuellen status als letzten status , fuer nchsten durchlauf im loop



  if (buttonState_down != lastButtonState) {              // vergleiche buttonState mit vorherigem Status

    if (buttonState_down == HIGH) {                       // wenn sich der status geaendert hat dann decrement counter

      buttonPushCounter -= 1;

      Serial.println(buttonPushCounter);
    }

    delay(50);

  if (buttonPushCounter < 9) {

      Serial.print("0");

    }

    if (buttonPushCounter > 10) {

      Serial.print("");

    }

    if (buttonPushCounter < 1) {

      buttonPushCounter = 00;

    }

    if (buttonPushCounter > 22) {

      buttonPushCounter = 22;

    }
  }
  lastButtonState = buttonState_up;                      // speichere den aktuellen Status als letzen Status, fuer naechssten durchlauf im loop
  lastButtonState = buttonState_down;                    // speichere den aktuellen Status als letzen Status, fuer naechssten durchlauf im loop
}

Die Reihenfolge stimmt nicht:
Serial.println(buttonPushCounter);
steht vor
Serial.print("0");
Ein etwas verbesserter Vorschlag:

// Sketch um von 00 bis 23 zu zaehlen bei Taste up
// und wieder von 23 bis auf 00 bei Taste down
const int  button_up_input = 9;                                    // Taste up = Eingang 9
const int  button_down_input = 8;                                  // Taste down = Eingang 8


int state_button_down;            // lese pushbutton down von input pin:
int state_button_up;           // lese pushbutton up von input pin:

int buttonPushCounter = 0;                                        // taehler fur Tasten Druecke
int buttonState_up = 0;                                            // Aktueller Status der Taste
int buttonState_down = 0;                                          // Aktueller Status der Taste
int lastButtonState = 0;                                          // vorheriger Status der Taste

long lastDebounceTime = 0;                                         // das letze mal als der ausgang pin geaendert wurde

void setup() {
  Serial.begin(9600);
  pinMode(button_up_input, INPUT_PULLUP);                                // initialisiere den button Pin als eingang:
  pinMode(button_down_input, INPUT_PULLUP);                               // initialisiere den button Pin1 als eingang:
  Serial.print("Stunden: ");
}

void loop() {
  buttonState_up = digitalRead(button_up_input);
  buttonState_down = digitalRead(button_down_input);
  if (buttonState_up != lastButtonState) {                   // vergleiche buttonState mit vorherigem Status
    if (buttonState_up == HIGH)  {                             // wenn sich der status geaendert hat dann increment counter
      buttonPushCounter++;
    }
  }
  lastButtonState = buttonState_up;                      // speichere aktuellen status als letzten status , fuer nchsten durchlauf im loop
  if (buttonState_down != lastButtonState) {              // vergleiche buttonState mit vorherigem Status
    if (buttonState_down == HIGH) {                       // wenn sich der status geaendert hat dann decrement counter
      buttonPushCounter--;
    }

    if (buttonPushCounter < 1) {
      buttonPushCounter = 0;
    }

    if (buttonPushCounter > 22) {
      buttonPushCounter = 23;
    }

    if (buttonPushCounter < 10) {
      Serial.print("0");
    }
    Serial.println(buttonPushCounter);
    delay(250);
  }
  lastButtonState = buttonState_down;                    // speichere den aktuellen Status als letzen Status, fuer naechssten durchlauf im lopp
}

Ist Dir schon aufgefallen, daß up und down in der Funktion vertauscht sind?

Hallo agmue!

Du, ich sehe warscheinlich vor lauter Wald nicht die Bäume ...

Jedenfalls Deine Variante funktioniert perfekt !

Das die up down funktion vertausch ist, ist mir noch nicht aufgefallen.. :o

Ich habe nicht daran gedacht buttonPushCounter++; und buttonPushCounter--;
zu verwenden ... ich muss noch sehr viel lernen.

Heute habe ich mir ein c++ Kurs Buch bestellt - Darin werde lesen wenn die Post es bringt ...

Jedenfalls - 1000 Dank

Stefan

stevie72:
Jedenfalls Deine Variante funktioniert perfekt !

Hallo Stefan,
nee, finde ich nicht. Bei "23" und "00" braucht man zwei Tastendrücke, um aus der "Begrenzung" zu gelangen. Ich habe mich nur auf die Sache mit der führenden Null konzentriert.

Hallo !

So ich bins nochmals.
Ich habe die funktion von agmue umgearbeitet in der Form, dass wenn ich incrementiere, für stunden von 00 - 23 nach 23 wieder 00 gefolgt von 01 02 usw.
und wenn ich decrementiere und bei 00 ankomme und weiter decrementiere wieder 23, 22, 21 usw. angezeigt wird. Das selbe für die minuten. 00 - 59

Jeweils in einer eigenen Routine.

Frage: es gibt doch die möglichkeit eine funktion nur einmal zu schreiben und parameter zu übergeben.

so z.b.

void eingabe(int st_min) {

if (buttonState_down && buttonState_up) { // beide Taster gedrückt

.
.
.

" umschalten zwischen 0 und 1 "

}
}

wie sieht der Befehl in c++ aus, der der variable (int st_min) einmal ein 0 und ein anderes mal eine 1 zuweist die man weiter verarbeiten kann ? Oder geht das evtl. sogar mit int st_min = stunden / minuten ?

ich habe mal in assembler programmiert und da gab es swap ..

Grüße,
Stefan

Eine etwas andere Variante:

// Sketch um von 00 bis 23 zu zaehlen bei Taste up
// und wieder von 23 bis auf 00 bei Taste down
const int  button_up_input = 9;                                    // Taste up = Eingang 9
const int  button_down_input = 8;                                  // Taste down = Eingang 8


int state_button_down;            // lese pushbutton down von input pin:
int state_button_up;           // lese pushbutton up von input pin:

int buttonPushCounter = 0;                                        // taehler fur Tasten Druecke
boolean buttonState_up;                                            // Aktueller Status der Taste
boolean buttonState_down;                                          // Aktueller Status der Taste
boolean lastButtonState_up;                                          // vorheriger Status der Taste
boolean lastButtonState_down;                                          // vorheriger Status der Taste

long lastDebounceTime = 0;                                         // das letze mal als der ausgang pin geaendert wurde

void setup() {
  Serial.begin(9600);
  pinMode(button_up_input, INPUT_PULLUP);                                // initialisiere den button Pin als eingang:
  pinMode(button_down_input, INPUT_PULLUP);                               // initialisiere den button Pin1 als eingang:
  buttonState_up = digitalRead(button_up_input);
  buttonState_down = digitalRead(button_down_input);
  lastButtonState_up = buttonState_up;                      // speichere aktuellen status als letzten status , fuer nchsten durchlauf im loop
  lastButtonState_down = buttonState_down;                    // speichere den aktuellen Status als letzen Status, fuer naechssten durchlauf im lopp
  ausgabe();
}

void loop() {
  buttonState_up = digitalRead(button_up_input);
  buttonState_down = digitalRead(button_down_input);
  if (buttonState_up != lastButtonState_up) {                   // vergleiche buttonState mit vorherigem Status
    if (buttonState_up == LOW)  {                             // wenn sich der status geaendert hat dann increment counter
      buttonPushCounter++;
      ausgabe();
    }
    lastButtonState_up = buttonState_up;                      // speichere aktuellen status als letzten status , fuer nchsten durchlauf im loop
    delay(250);
  }
  if (buttonState_down != lastButtonState_down) {              // vergleiche buttonState mit vorherigem Status
    if (buttonState_down == LOW) {                       // wenn sich der status geaendert hat dann decrement counter
      buttonPushCounter--;
      ausgabe();
    }
    lastButtonState_down = buttonState_down;                    // speichere den aktuellen Status als letzen Status, fuer naechssten durchlauf im lopp
    delay(250);
  }
}

void ausgabe() {
  if (buttonPushCounter < 1) {
    buttonPushCounter = 0;
  }

  if (buttonPushCounter > 22) {
    buttonPushCounter = 23;
  }

  Serial.print("Stunden: ");
  if (buttonPushCounter < 10) {
    Serial.print("0");
  }
  Serial.println(buttonPushCounter);
}

Da gibt es auch eine Funktion, allerdings ohne Parameterübergabe.

stevie72:
Frage: es gibt doch die möglichkeit eine funktion nur einmal zu schreiben und parameter zu übergeben.

So, natürlich mit allen Typen:

boolean eingabe() { boolean a = true; return a;}

Theoretisch, bitte probier mal.

@agmue: mach ich ... erstmal Danke !

@agmue: geht klasse ! Du hast sogar ein key debounce eingebaut welches sehr gut klappt !
Wenn die Taste losgelassen wird dann wird incrementiert oder decrementiert.

Ich mach mich jetzt mal dran, wenn ich beide Taster drücke das ich dann zwischen stunden eingabe und minuten
eingabe umschalten kann... deswegen die frage in posting #7

Danke !

Hallo und Guten Abend!

Mir ist es leider noch nicht gelungen über die zwei Taster die st_min umzuschalten.
Das ist mein bisheriges Sketch
Es schaltet zwar den lastButtonState um aber aber es holpert ...
Ich habe zwar zur kontrolle eine LED eingebunden aber die aendert nicht Ihren Zustand.

// Sketch um von 00 bis 23 zu zaehlen bei Taste up
// und wieder von 23 bis auf 00 bei Taste down
// Wenn beide Tasten gleichzeitig gedrueckt werden dann umschalten lastButtonState später dann st_min.

const int  button_up_input = 9;                                    // Taste up = Eingang 9
const int  button_down_input = 8;                                  // Taste down = Eingang 8
const int ledPin = 13;

int state_button_down;                                             // lese pushbutton down von input pin:
int state_button_up;                                               // lese pushbutton up von input pin:

int buttonSwitchCounter = 0;                                       // counter for the number of button presses
int buttonState = 0;                                               // aktueller status der beiden Taster1 && Taster2
int lastButtonState = 0;                                           // letzter Staus der beiden Taster1 && Taster2 


int stunden = 23;                                                  // 24 Stunden
int minuten = 59;                                                  // 60 minuten
boolean st_min;                                                    // wenn st_min = 0 stunden einstellen - wenn 1 dann minten


int buttonPushCounter = 0;                                         // zaehler fur Tasten Druecke
boolean buttonState_up;                                            // Aktueller Status der Taste
boolean buttonState_down;                                          // Aktueller Status der Taste
boolean lastButtonState_up;                                        // vorheriger Status der Taste
boolean lastButtonState_down;                                      // vorheriger Status der Taste

long lastDebounceTime = 0;                                         // das letze mal als der ausgang pin geaendert wurde

void setup() {
  Serial.begin(115200);
  pinMode(button_up_input, INPUT_PULLUP);                          // button Pin als Eingang:
  pinMode(button_down_input, INPUT_PULLUP);                        // button Pin1 als Eingang:
  buttonState_up = digitalRead(button_up_input);
  buttonState_down = digitalRead(button_down_input);
  lastButtonState_up = buttonState_up;                             // speichere aktuellen status als letzten status , fuer nchsten durchlauf im loop
  lastButtonState_down = buttonState_down;                         // speichere den aktuellen Status als letzen Status, fuer naechssten durchlauf im lopp
  ausgabe();                                                       // via RS232 ausgeben
}

void loop() {
  
  buttonState_up = digitalRead(button_up_input);                  // Eingang Button up einlesen
  buttonState_down = digitalRead(button_down_input);              // Eingang Button down einlesen



    if (buttonState_down && buttonState_up != lastButtonState) {
      if (buttonState_down && buttonState_up == HIGH) {
        
        buttonSwitchCounter++;
        
        Serial.println("on");

      }
      else {
       
        Serial.println("off");
      }
  
    
    lastButtonState = buttonState_down && buttonState_up;         // aktuellen Status als letzen speichern


// nur zum Debugging

Serial.print("lastButtonState"); Serial.print( " ");Serial.println(lastButtonState);
Serial.print("buttonState_down && buttonState_up"); Serial.print( " "); Serial.println(buttonState_down && buttonState_up);
Serial.print("buttonSwitchCounter");Serial.print( " "); Serial.println(buttonSwitchCounter);

// ende debugging



    if (lastButtonState == 1) {                                   
      digitalWrite(ledPin, HIGH);                                // LED einschalten
    } else {
      digitalWrite(ledPin, LOW);                                 // LED ausschalten
    }



    Serial.println("");
    lastButtonState_down = buttonState_down;                    // speichere den aktuellen Status als letzen Status, fuer naechssten durchlauf im lopp
    delay(250);
  }

  if (buttonState_up != lastButtonState_up) {                   // vergleiche buttonState mit vorherigem Status
    if (buttonState_up == LOW)  {                             // wenn sich der status geaendert hat dann increment counter
      buttonPushCounter++;
      ausgabe();
    }
    lastButtonState_up = buttonState_up;                      // speichere aktuellen status als letzten status , fuer nchsten durchlauf im loop
    delay(250);
  }
  if (buttonState_down != lastButtonState_down) {              // vergleiche buttonState mit vorherigem Status
    if (buttonState_down == LOW) {                       // wenn sich der status geaendert hat dann decrement counter
      buttonPushCounter--;
      ausgabe();
    }

    lastButtonState_down = buttonState_down;                    // speichere den aktuellen Status als letzen Status, fuer naechssten durchlauf im lopp
    delay(250);
  }
}

void ausgabe() {


  if (buttonPushCounter < 1) {
    buttonPushCounter = 0;
  }

  if (buttonPushCounter > 22) {
    buttonPushCounter = 23;
  }

  Serial.print("Stunden: ");
  if (buttonPushCounter < 10) {
    Serial.print("0");
  }
  Serial.println(buttonPushCounter);
}

Hallo,

Ich habe meinen Plan geändert: Ich nehme jetzt zwei zusätzliche Taster. Einen für Select und einen für OK.
Das vereinfacht auch die Handhabung. Ich habe also 4 Taster. Up - Down - Select - OK

Grüße, Stefan

Gute Entscheidung, die Bedingung "zwei Taster gleichzeitig" ist nicht so einfach zu realisieren.

Möglicherweise wäre die Beschäftigung mit endlichen Automaten für Dich sinnvoll, mir hat es das Programmieren erleichtert (Beispiel):

enum ZUSTAENDE {ANZEIGE, STUNDEN_STELLEN, MINUTEN_STELLEN};
byte zustand = ANZEIGE;

Mit Select gehst Du dann von Zustand zu Zustand.

Vielen Dank agmue!

Das Beispiel ist klasse. Genau wonach ich gesucht habe.

Danke für die Hilfe!

Stefan