loop() - Funktion neu starten

Hi Leute, ich bin neu hier und ich hoffe ihr könnt mir helfen :stuck_out_tongue:

Ich schreibe bis im Oktober/November meine Maturitätsarbeit (das schweizer Abi ^^) und habe mir dazu vorgenommen einen Quadrocopter auf Arduino-Basis zu bauen und natürlich zu programmieren.

Da ich gelesen habe, dass in Deutschland autonome (Flug-) Geräte, in deren Programmablauf nicht eingegriffen werden kann, verboten sind, dachte ich mir, dass ich lieber eine externe Fernsteuerung mit einbaue (natürlich auch um ein bisschen damit zu spielen :wink: ).

Um während dem automatischen Programmablauf in die Steuerung eingreifen zu können wird ein externer Interrupt ausgelöst (durch einen Schalter auf der Fernbedienung) und beendet, sobald dieser Schalter wieder in seine Ausgangsstellung gebracht wird.
Mein Problem dabei ist aber, dass nach der ISR die loop()-Funktion weiter ausgeführt wird, ich diese aber gerne neu gestartet hätte, da essentielle Sensordaten zu Beginn der loop-Schleife ermittelt werden.

Ich könnte mir denken, dass diese Sensorwerte immer wieder ermittelt werden, doch würde das das Programm nicht enorm “verkomplizieren“?

Ich hoffe ihr könnt mir helfen :slight_smile:

Gruss

flashi

Wenn Du die loop()-Routine nicht sowieso sehr häufig ausführst (und somit kurz nach der Interrupt-Routine auch der loop() wieder von vorne beginnt), solltest Du dessen Strukturierung überdenken. Schmeiss alle delay()s raus und mach den loop() so schnell wie möglich. Dann sollte sich Dein Problem von selbst erledigen.

Hi pylon

Danke erstmal für deine Antwort.

Das Problem ist, dass die Hauptfunktion rein theoretisch nicht wiederholt werden soll/müsste, da sie im Prinzip eine einzige Anweisung enthält, die bis zum Eintreffen einer bestimmtem Situation weitergeführt wird und danach nicht mehr benötigt wird.

Definiere eine Modus-Variable (autonom/ferngesteuert) und nach dieser führst Du den einen oder den anderen Programmteil aus. 90% des Codes sind sowieso identisch in den beiden Modi.
Grüße Uwe

Ich sehe da keinerlei Sinn dahinter, einen Interrupt zu nutzen, da reicht auch einfaches Polling locker aus. Deine Reaktionsfähigkeit, den Schalter an der Fernbedienung umzulegen, steht ja in keinem Verhältnis zur Geschwindigkeit der Interruptauslösung. :wink: Ob du autonom oder remote fliegst, legst du in einer Statusvariablen ab, je nach Status wird dann in der loop gewählt, wie die Rotoren gesteuert werden.
Mein Vorredner hat ja schon den Schubs in die richtige Richtung gegeben: Vermeidung von unnötigen delays im Programmcode.

ach so habt ihr das gemeint! :drooling_face: $)

achso, an das aufteilen hab ich gar nicht gedacht.

Danke vielmals auch an Uwe un sth77, ich hoffe nächstes mal eure Hirnzellen ein bisschen mehr zu fordern :slight_smile:

schöne Grüsse