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
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 ..
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 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.
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 ..
// 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.
@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
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);
}
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