Timer frage.

Hallo, ich brauch nen timer der nach einem Knopfdruck los geht und nach jeder Sekunde "1" von einer Zahl subtrahieren. Wenn diese Zahl dann auf 0 kommt soll der timer stoppen unde etwas soll geschehen.

Das ganze ist ein Countdown von einer anzahl von Sekunden die mit einem poti eingestellt wird und auf einem 7segment display erscheint. Die Subtraktion und das Erscheinen mussten gleichzeitig passieren. Also wahrend die minuten und sekunden auf dem display erscheinen soll der timer laufen.

Vielen Dank

... was erwartest du nun?
Oder: wie ist deine Frage ?
Gruß JKW

Die Frage ist von wo ich den timer nehme. Was muss ich schreiben, wie teile ich das ganze so dass ich blos eine sekunde habe. Ich hab auf arduino.cc die timer nechgelesen aber nicht sehr viel verstanden. Ginge es besser mit nem RTC module?
Meiner meinung nach musste blos der chip reichen.

naja
du hast eine Funktion die heißt loop(), und die wird immer wieder aufrufen. wenn du nun hier einmal millis() aufrufst wirst du sehen das du sehr einfach mittels
int ss=0;
void loop(){
if(ss!=floor(millis()/1000)){
ss=floor(millis()/1000);
mach_was_auch_immer();
}
}
einen timer bauen der einmal pro sekunde etwas macht.

dann schreibste noch den teil mit "wenn knopf gedrückt, nimm wert von poti und rechnen den in startwert um" und schreibst an der stelle von "was auch immer" deine Subtraktion.
nach dem subtrahieren gibst du den wert aus. ... das ist nicht besonders anspruchsvoll was du da vor hast ( auch für jemanden ohne Erfahrung nicht schwierig ).

Wenn du konkrete Fragen hast helfe ich gern.

Gruß JKW

@jkw, wenn du deinen Programmcode in "Tags" einbaust, sieht besser aus:

int ss=0;

void loop()
 {
   if(ss!=floor(millis()/1000))
    {
      ss=floor(millis()/1000);
      mach_was_auch_immer();
     }
  }

Das ist das "#" Zeichen neben der Schreibmaschine. "Insert Code" ... nur so als Tipp :wink: ... sieht übersichtlicher aus.

Danke, ich wollt's nicht zuuueinfach machen.
8)

Danke fuer den Code, werde ihn heute in den code einbauen. Werde spaeter den ganzen code posten.

Bis jetzt habe ich das geschrieben:

int SS=0;
int MM=0;
int a=0;
int z=0;
float r=0;
int potpin=0;
int potread=0;
int buttonpush=0;
int buttonpin=0;
int lamp=0;
int buzzer=0;

void setup()
{
  pinMode(buttonpin, OUTPUT);
}

void potreadf()
{
  potread=map(potread, 0, 1023, 0, 1400);
  r=potread/60;
  MM=(int) r;
  SS=(r-MM)*60;
}

void displayf()
{
  
}

void loop()
{
  while (buttonpush != 1)
  { 
    potread=analogRead(potpin);
    potreadf();
    displayf();
  };
   
  if (buttonpin=HIGH)
   {
     buttonpush =1;
     digitalWrite(lamp, HIGH);
     z=potread-1;
     potreadf();
     displayf();
     
     if (potread=0)
     {
       digitalWrite(lamp, LOW);
       digitalWrite(buzzer, HIGH);
     }
   }
}

displayf ist die Funktion die die Zeit auf einem 4x7segment Display erscheinen laesst. Fuer nen Test werde cih das ganze an ein LCD haengen oder mit serial Monitor.

Ideen und komentare sind wilkommen.

Habe hier eine etwas veranderte Version;

int SS=0;
int MM=0;
int a=0;
int z=0;
float r=0;
int potpin=0;
int potread=0;
int buttonpush=0;
int buttonpin=2;
int lamp=0;
int buzzer=0;
int buttonstate = 0;
int lastButtonState = 0;
int buttonPushCounter=0;

void setup()
{
  pinMode(buttonpin, INPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(lamp, OUTPUT);
  Serial.begin(1200);
}

void potreadf()
{
  potread=map(potread, 0, 1023, 0, 1400);
  r=potread/60;
  MM=(int) r;
  SS=potread-MM*60;
}

void displayf()
{
  Serial.println(potread);
  Serial.print(MM);
  Serial.print(":");
  Serial.println(SS);
}

void loop()
{
  buttonstate = digitalRead(buttonpin);
  potread=analogRead(potpin);
  
     if (buttonstate = HIGH) {
      
     digitalWrite(lamp, HIGH);
     potread=potread-1;
     potreadf();
     displayf();
    
       if (potread=0)
       {
         digitalWrite(lamp, LOW);
         digitalWrite(buzzer, HIGH);
      
        } 
   
   
  }
   else
    {
     
     potreadf();
     displayf();
      
    }
 }

Die Zeit wird berechnet, wird auf dem seriellen monitor auch gezeigt. Wenn ich aberden pushbutton drucke passiert nichts. Dann musste er von der potread ziffer 1 abziehen. Passiert aber nicht. Bei disem schritt brauche ich den sekunden Takt.

du möchtest doch beim drücken des Tasters starten und dann pro Sekunde einmal runterzählen oder ?

wie wäre es mit

int SS=0;
int MM=0;
int a=0;
int z=0;
float r=0;
int potpin=0;
int potread=0;
int buttonpush=0;
int buttonpin=2;
int lamp=0;
int buzzer=0;
int buttonstate = 0;
int lastButtonState = 0;
int buttonPushCounter=0;

unsigned long last_push=0;

void setup(){
  pinMode(buttonpin, INPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(lamp, OUTPUT);
  Serial.begin(1200);
}
void potreadf()
{
  potread=map(potread, 0, 1023, 0, 1400);
  r=potread/60;
  MM=(int) r;
  SS=potread-MM*60;
}

void displayf()
{
  Serial.println(potread);
  Serial.print(MM);
  Serial.print(":");
  Serial.println(SS);
}

void loop(){
 // set 
  if(digitalRead(buttonpin)){
    potread=analogRead(potpin);
   }
 // reduce 
 if(millis()-last_push>1000){
  last_push=millis();
  potread--;
  potreadf();
  displayf();
  }
 }

ungetestet ..
jkw

Erstmal muss ich den pot-wert lesen und anzeigen, dann erst wenn man den startknopf druckt soll es losgehen. Hab es erstmal mit nem while versucht und dann mit if. Das lesen und anzeigen geht gut aber wenn ich den knopf drucke passiert nichts. Wenn ich ihn drucke musste ja button pin auf high sein, gehnt aber nicht.

Jetzt ist mir was anderes eingefallen. Ich konnte ja erstmal nach dem knopfdruck abfragen, dann wenn ==0 soll er bloss pot lesen und anzeigen fals aber buttonpuin ==1 dann soll er den timer starten(wenn dann potread auf 0 ist soll buttonpin euf 0 kommen). Das muss ich heute abend zu hause ausprobieren.

Habe jetzt verstanden wass du mit millis gemacht hast, bis jetzt waren alle operationen mit millis chinesich fur mich.

Vielen Dank fur deine Hilfe jkw.