Uhr einstellen

Hallo Liebe Community,

ich bin gerade dabei eine Uhr zu programmieren. Dabei bin ich leider auf ein Problem gestoßen und zwar:
In meinem loop habe ich den Aufruf zu meiner set-Methode in der ich die Zeit einstellen kann.
Leider funktioniert das nicht so wie ich es mir vorgestellt habe. Eigentlich wollte ich, dass das Programm sozusagen in die set-Funktion reingeht und dort so lange "gefangen" ist bis ich den set-Knopf so lange gedrückt habe dass die Schleifenbedingung nicht mehr erfüllt ist. Das Problem ist, dass das Programm 1.die tmpSet variable nicht inkrementiert und 2. garnicht in die Funktion reingeht, damit ich etwas verändern kann.

Dazu muss ich noch sagen, dass das folgende Programm unvollständig ist und ich euch bitte mir nur das Problem mit meiner Set Methode erläutern zu können.

#include <TimerOne.h>

///////Variablendeklaration////////
//Uhrzeitsangabe
struct uhr{
  volatile int sekunde=50;
  int minute=59;
  int stunde=23;
}Uhrzeit1;

//Einstellungsknöpfe
int setButton=7;
int setButtonStatus;
int tmpSet=0;
int downButton;
int downButtonStatus;
int tmpDown=0;
int upButton;
int upButtonStatus;
int tempUp=0;

///////////Funktionen//////////
//Funktionsliste
void zaehler(void);
void uhrzeit(void);
void set(void);

void zaehler(){
  Uhrzeit1.sekunde++;
}

void uhrzeit(){
  if(!(Uhrzeit1.sekunde<60)){
      Uhrzeit1.minute++;
      Uhrzeit1.sekunde=0;
      if(!(Uhrzeit1.minute<60)){
        Uhrzeit1.stunde++;
        Uhrzeit1.minute=0;
        if(Uhrzeit1.stunde>23){
          Uhrzeit1.sekunde=0;
          Uhrzeit1.minute=0;
          Uhrzeit1.stunde=0;
        }
      }
  }
}

void set(){
  while(tmpSet>0){
    if(tmpSet==1){
      if(downButtonStatus==1){
        delay(20);
        Uhrzeit1.minute--;
      }
      else if(upButtonStatus==1){
        delay(20);
        Uhrzeit1.minute++;
      }
      else if(setButtonStatus==1){
        delay(20);
        tmpSet++;
      }
    }
    else if(tmpSet==2){
      if(downButtonStatus==1){
        delay(20);
        Uhrzeit1.stunde--;
      }
      else if(upButtonStatus==1){
        delay(20);
        Uhrzeit1.stunde++;
      }
      else if(setButtonStatus==1){
        delay(20);
        tmpSet=0;
      }
    }
  }
}

void ausgabe(){
  Serial.print(Uhrzeit1.stunde);
  Serial.print(" : ");
  Serial.print(Uhrzeit1.minute);
  Serial.print(" : ");
  Serial.println(Uhrzeit1.sekunde);
}

void setup() {
  Serial.begin(9600);
  
  Timer1.initialize(1000000);
  Timer1.attachInterrupt(zaehler);

  pinMode(setButton, INPUT);
}


void loop() {
  setButtonStatus=digitalRead(setButton);
  uhrzeit();
  if(setButtonStatus==HIGH){
    delay(100);
    tmpSet++;
    Timer1.stop();
    set();
    Timer1.resume();
  }
  
  ausgabe();
  
}

Schon einmal vielen Dank ich freue mich wenn ihr mir helfen könnt

  pinMode(setButton, INPUT);

Hast Du einen PullDown-Widerstand verbaut?

Ja ich habe ich

Das funktioniert so nie, wie Du Dir das vorstellst: innerhalb Deiner set()-Methode liest Du Deine Taster gar nicht aus. Er geht (vermutlich) rein, setButtonStatus ist ja HIGH....inkrementiert tmpSet, bleibt in der while(), geht in die zweite if()-Anweisung (tmpSet==2), setButtonStatus ist natürlich immer noch HIGH, setzt tmpSet auf 0 und geht raus, ohne etwas gemacht zu haben.
Um Dir das zu verdeutlichen: gib mal an den entscheidenden Stellen etwas über die serielle Konsole aus, dann sollte Dir der Fehler klar werden

Vielen Dank du hast mir den Abend gerettet. Ja ich habe wohl übersehen, dass ich den Wert in dieser Variablen nur einmal gespeichert habe.

Dann funktioniert es nun? Dann top...Viel Spaß und Erfolg weiterhin :slight_smile: