Pages: [1]   Go Down
Author Topic: Mit einem Taster für einen gewissen Zeitraum ein anderes Programm ausführen  (Read 920 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Bavaria
Offline Offline
Newbie
*
Karma: 3
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hallo!

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

ulli.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke vielmals
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 138
Posts: 2884
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

Code:
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.
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Um etwas ausführlicher zu werden:

Code:

//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
  }
}

Logged

Germany
Offline Offline
Faraday Member
**
Karma: 56
Posts: 2983
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
 
Logged

Pages: [1]   Go Up
Jump to: