Kann man ein skript anhalten und fortführen?

Ist es möglich einen skript auf dem arduino per knopfdruck anzuhalten und nach ner kurzen zeit wieder per knopfdruck von der angehaltenen stelle zu starten??? Wenn ja denn scheribt mal bitte eine Erklärung wie das geht.Würde mich freuen. Vielen dank im vorraus.

Mfg

strohhirn

Klar geht das, du musst das aber in der Programmierung berücksichtigen. Also einfach einen Taster pollen (auf die Entprellung achten), den Status beim Tastendruck wechseln und je nach Status entweder pausieren oder das Programm laufen lassen.

Ok schon ma gut das es geht, aber ich kenne mich noch nich so gut mit arduino aus, könnte mir bitte einer erklären wie man das macht?

Am einfachsten ist es vermutlich, wenn Du den Teil den Du notfalls "anhalten" willst in eine Funktion auslagerst (z.B. void do_it() ). Innerhalb von "loop()" wird jedesmal der Taster abgefragt und der Status entweder auf stop oder start gesetzt. Z.B. über eine Variable status die entweder "0" ist (stop) oder "1" (start). Dann kannst Du ganz einfach mittels "if(status==1) do_it();" die vorher definierte Funktion do_it() aufrufen, wenn sie tatsächlich laufen soll. Solange der Status nicht geändert wird, passiert das bei jedem Durchlauf von loop(). Wird durch das Betätigen des Tasters der status geändert, wird die Funktion nicht mehr aufgerufen.

Aber startet das programm den nicht von vorne wenn ich wieder start drücke ?? Ich möchte aber dass er auf knopfdruck bei einer bestimmten stelle wartet und denn auch ab da weiter geht. z.B. eine led soll 10 mal blinken ich drücke den knopf nach dem 6 mal, dann drück ich noch mal und die led blink noch 4 mal.

schon ma gut das es geht

Gut, dass es nicht geht. Jedenfalls nicht so wie du es dir wohl vorgestellt hast.

An Anhalten und Fortführen solltest du besser gar nicht denken. ( Du brauchst noch nicht mal ein delay() … )
Und Reset ist kein Start, sondern ein Reset ( für Notfälle )

Dein “Skript” wird nie fertig, aber loop() sollte so oft wie möglich durchlaufen und meistens feststellen, dass im Augenblick nichts zu tun ist.

Na gut, mit 6 Analog.read() dauert es schonmal eine Millisekunde, dann könnte in dieser Zeit auch noch ein Zeichen ( Bei 9600 ) mit Serial.read() zu lesen sein. Und ganz ab und zu ist mal eine Sekunde rum und es ist Zeit, wieder was mit Serial.print oder auf dem LCD Display auszugeben, oder so.
Selbst heftiges Blinken ist in der Praxis meistens: nichts tun.

Oder du entdeckst, dass ein Taster gedrückt wurde, merkst dir, dass dieser Taster für die nächsten 20 oder 100 millis zu ignorieren ist (entprellen) und rufst deine SpezialFunktion für den nächsten Schritt auf.

Edit: schau dir “Blink without delay()” (der Link oben) an, versteh wie das funktioniert, und füge dann dort Taster-Abfragen ein, die das Blinken steuern.

@michael_x: Du setzt wohl alles daran, den Threadstarter zu verwirren... ;) Von LCDs,seriellen Verbindungen usw. war bisher nicht die Rede.

Wie gesagt, es ist alles eine Frage der Programmierung. Auch dein LED-Beispiel könnte man entsprechend aufbauen. Mir ist jedoch noch unklar, wofür man das gebrauchen könnte.

@strohhirn: Kannst Du uns bitte erklären was Du konkret machen möchtest? Ein Microcontroller funktioniert ein wenig anders, als ein Computer. Hier hast Du in der Regel ein Programm auf dem µC, das in alle Ewigkeit abgearbeitet wird, solange der Controller mit Strom versorgt wird und läuft. Nicht wie bei einem Computer wo Du mal das eine Programm und dann wieder ein anderes startest. Das setzt beim µC immer ein erneutes Übertragen des neuen Programms in den Flash-Speicher voraus. Ein "Anhalten" in dem Sinne wie Du es evtl. meinst, bedeutet dann eigentlich, das dein Programm des µC weiter läuft, aber bestimmte Funktionen (bzw. Funktionalitäten) nicht ausgeführt werden, bis eine bestimmte Bedingung (z.B. das Drücken Deines Tasters) diese Funktion wieder aktivieren.

Du setzt wohl alles daran, den Threadstarter zu verwirren.

@sth77 Na ja, nicht alles. Und von LCD war keine Rede, stimmt. Einspruch angenommen, Euer Ehren.

Aber eine "skript anhalten" Vorstellung sollte man schon, so gut es geht, verwirren ;)

Und um zu sehen, was grade ganz anders läuft als gedacht, ist Serial das einfachste Werkzeug. Und Blinken ist ein schöner Start, siehe strohhirns eigene Erläuterung, wie er sich das vorstellt.

@strohhirn: Schonmal überlegt was passieren soll nachdem der Taster 2 mal gedrück wurde und es 10 mal geblinkt hat ? "Nix", ist auch eine gültige Antwort, aber selbst das musst du dann so programmieren.

Du kannst den Sketch so programmieren, daß dieser bei Tastendruck oder anderen Bedingungen gewisse Aktivitäten nicht durchführt und bei einer anderen Bedingung weitermacht. Das sind aber immer Sachen die bei der Programmierung vorgesehen und fehlerfrei implementiert werden müssen. Dies auch weil sicher einige Programmteile nicht unterbrochen werden dürfen zb Datenübertragung, LCD Ansteuerung, Inizialisierungen von HW ecc.

Es gibt keinen Magischen Befehl der alles einfriert.

Vom Sleepmodus als Lösungsansatz will ich hier nicht sprechen.

Grüße Uwe

@uwefed

Aha ok habe verstanden, wie man das macht kann ich mir selber denken.

Vielen dank an alle die sich die mühe gemacht haben eine ordentliche antwort zu verfassen.

Mfg

strohhirn

Wenn du sowas umsetzten willst. Würde ich eine Schrittkette basteln die alle xxxMillisekunden ein Schritt weiter “geht” Wenn der Taster dann gdrückt wurde bleibt die Schrittkette stehen beim nächsten drücken läuft sie halt weiter. Ist zwar nicht ganz das was du willst aber wohl mit “wenig” Aufwand das Ergbniss das deinem Wunsch am nächsten kommt.

Es ist halt so das der Atmega immer wieder das Programm abläuft und zwar immer so schnell er kann.<== Ein schöner Satz :slight_smile:
Bei einem kleinen Programm kann es so sein das der Prozessor das Programm 1000-1500mal durchläuft. Auch beim Blink without delay. Er läuft halt so lange am “umschalten” der LED vorbei bis wieder die halbe Sekunde vergangen ist (Wäre dann im angenommen Fall gut 6-7000mal).

=> Praktisch gesehen
Mit Hilfe von Blink without delay im gewünschten Zeitabstand eine Variable hochzählen lassen.
und dann mit hilfe von if-Statement oder switch-case. die Entsprechenden Aktionen ausführen und das dann natürlich immer nur einmal.

hi,

ich würd's schnell mal so realiesieren:

void loop() {
    led1an();
    Taste();
    led2an();
    Taste
    ...
    usw.
}

void Taste() {
    if Tastegedrueckt TueNix();
}

void TueNix() {
    while (NOT Tastegedrueckt) {
        delay(10);
    }

die funktion tastegedrueckt prüft auf tastendruck und gibt dann halt je nachdem wahr oder falsch zurück. außerdem muß diese funktion auch warten, bis man die taste losläßt. ist eine quick&dirty-lösung mit nachteilen, aber würde auf die schnelle mal arbeiten...

gruß stefan

Dein Quick&Very Dirty-Code hat überhaupt nichts mit der Aufgabenstellung zu tun. Es geht darum, auf einmaligen Tastendruck den Programmablauf anzuhalten, beim wiederholten Tastendruck an der letzten Stelle weiterzumachen. Bei deinem Sketch müsste man die Taste gedrückt halten. Wozu man dann noch zwei Funktionen braucht, ist ebensowenig einleuchtend. Das würde bei aktiviertem Pullup wohl auch so klappen: if (digitalRead(Pin)==LOW) while (digitalRead(Pin)==LOW); Aber wie gesagt, ist was völlig anderes.

Wieso nicht die Taster per Interrupt abfragen und die ISR solange nicht verlassen bis weitergearbeitet werden soll? Bzw. je nachdem wie sehr angehalten werden soll könnte man diese spezielle ISR auch unterbrechbar machen (für andere Interrupts).

Udo, das funktioniert nicht 100%; Das heißt es funktioniert das Unterbrechen. Aber es funktioniert nicht 100% jeder Sketch in jedem x-beliebigen Moment unterbrechen und zu garantieren daß nach dem Fortfahren alles 100% funktioniert. Zeitkritische Sketchteile dürfen nicht unterbrochen werden. Der Sketch muß extra für diesen Zweck optimiert werden bzw in bestimmten Teilen muß der Interrupt gesperrt werden.

Grüße Uwe

Jeder Sketch muss damit fertig werden weil der Timerinterrupt ja auch immer schon unterwegs ist. Ein Sketch der damit nicht fertig wird ist sowieso schon instabil/unzuverlässig.