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