Mit einem Taster für einen gewissen Zeitraum ein anderes Programm ausführen

Hallo erstmals

und zwar ich habe ein Arduino Programm geschrieben dass soweit wie es soll funktioniert.

Aber ich möchte zusätzlich wenn man einen Taster kurz betätigt dass dieser Programmteil aufhöhrt zu arbeiten und zb. für 30 Sekunden etwas anderes macht.

Wie löse ich so etwas

MFG Felix

Pack den anderen Teil der ausgeführt werden soll in eine Funktion und frage in jedem Durchlauf von loop() den Taster ab. Wenn er gedrückt ist, dann rufe die Funktion auf.
Etwas komplizierter wird es, wenn bestimmte Sachen auch während Deiner zusätzlichen Funktion weiter ausgeführt werden sollen. Das können wir aber nur beurteilen, wenn wir wissen wie Dein Programm aufgebaut ist.

Wichtig ist, das Du möglichst wenige und kurze "delay()" aufrufe (am besten gar keine) in Deinem Programm hast. Solche Verzögerungen blockieren den kompletten Programmablauf und es wird schwierig auf einen Tastendruck zu reagieren.

Also ich frage einfach im Loop ab ob der Taster betätigt wurde und anhand dieser wird ein anderes Programm ausgeführt.

Nur wie löse ich es das wenn dieser Taster betätigt wird dass das andere Unterprogramm 30 Sekunden ausgeführt wird?

hallo!

schau dir mal die Funktionen "while" und "millis" an.

ulli.

Danke vielmals

stock95:
Wie löse ich so etwas

Du kannst eine eigene Funktion mit einer While-Schleife aufrufen, die nur 30 Sekunden lang läuft.

Zum Beispiel so eine Funktion:

void DreissigSekunden()
{
  long startzeit,endezeit;
  startzeit=millis();
  endezeit=startzeit+30000;
  Serial.println();
  Serial.println("30 Sekunden-Schleife gestartet...");
  while (millis()<endezeit)
  {
    delay(1000); 
  }
  Serial.println("Nach 30 Sekunden beendet.");
}

Alles in der While-Schleife wird 30 Sekunden lang abgearbeitet, in diesem Fall nur ein Delay von je 1000 Millisekunden.

Warnung: Der millis()-Timer läuft alle ca. 50 Tage über und fängt dann bei Null an. Das Timing mit dem millis()-Timer zu machen bietet sich nur für Programme an, die häufiger als alle 50 Tage resettet werden. Oder Programme, bei denen es nichts ausmacht, dass die Funktion ggf. auch mal weniger als 30 Sekunden läuft, wenn man den Taster genau drückt, weniger als 30 Sekunden bevor der Timer alle 50 Tage überläuft.

Um etwas ausführlicher zu werden:

//Taster an Pin 3 gegen Masse angeschlossen
#define button_pin 3

//30 Sekunden (30000 Millisekunden) für die Unterfunktion
#define dauer_unterfunktion 30000

void setup() {
   //Taster-Pin als Eingang mit internem PULLUP-Widerstand auf HIGH
   pinMode(button_pin,INPUT_PULLUP);

}

void loop() {

  //prüfen ob taster gedrückt:
  //Achtung! Da PullUp Widerstand -> Eingang LOW-Aktiv
  if(digitalRead(button_pin) == LOW) {
   // wenn Taster gedrückt, dann Unterfunktion aufrufen
    unterfunktion();  
}

}


void unterfunktion() {
  //startzeit merken
  long start = millis();
 
  //wiederholen solange noch keine 30000 millisekunden vergangen sind
  while( (start + dauer_unterfunktion) > millis()) {
    //hier der Code der 30 sekunden lang ausgeführt werden soll
  }
}

Besser ist es eigentlich, wenn alle Programme, sowohl das "Haupt-Progamm", wie die "30 sec Extra-Funktion", in zigtausend Durchläufe aufgeteilt werden, die jeweils meist fetstellen, dass gar nichts zu tun ist, weil

  • kein neuer Taster betätigt wurde
  • der nächste Zustandswechsel eines Ausgangs (z.B. LED von AUS nach EIN) erst in ein paar Millisekunden fällig ist (das ist noch lange hin und bis dahin sind wir offen für alles = stellen wir noch oft fest dass immer noch nichts zu tun ist )
  • man den Temperatursensor erst in einer Sekunde wieder lesen muss
  • usw.

In loop() stellst du nur fest, ob noch deine Extra-Funktion dran ist ( hast du dir beim letzten Mal gemerkt ) und rufst dann diese auf oder das was du Haupt-Programm nennst.

Du kannst auf diese Art auch mehrere Programme parallel ausführen, wenn das sinnvoll ist: statt oder im letzten Satz machst du ein und dann...

Hallo, und guten Tag.
Ich brauche Eure Hilfe.
Mein Hobby ist Fotografieren, bin Rentner und bei dem Wetter?
Ich wollte mal mit Tropfen versuchen.
Ich habe ein Atmega 16U2 Uno R3 Arduino, ein Breadbord und ein 4 Relais Modul,
Mit Elektrik kenne ich mich einigermaßen gut aus mein Problem ist das Programmieren.
Ich habe 1 Tropfen mit der Hand ausgelöst, der fiel durch eine Fotozelle diese löste den Blitz.
(Kamera im dunklem 2 sec.) funktioniert.
Meine Vorstellung.
Taster drücken die die 2 bis 3 Magnetventille öffnen mit verschiedenen Zeiten und die Fotozelle
Löst den Blitz aus. ( oder direkt den blitz auslösen)
Ist da jemand bereit mir zu Helfen. ( bin auch bereit einen kleinen Obolus zu leisten)
Für eure Mühe bedanke ich mich im Vor raus. Dieter

Tropdusel:
Hallo, und guten Tag.
Ich brauche Eure Hilfe.

Schönen guten tag.

Dass du unsere Hilfe evtl gut gebrauchen kannst, verstehe ich.
Aber dass du deswegen einen 3 Jahre alten Thread hijacken musst, nicht.

Eröffne besser einen neuen Thread.

Du meinst also sowas:

Leider zeigt er seinen Code nicht oder ich hab ihn übersehen

Kontrolle Platinenlayout (Taster / Blitz / Kamera)

Frag mal bei den Leuten nach ob die was loswerden wollen, Mücke hat glaub ich keine mehr.

Software kannste besser da auch nachfragen.