ich habe einen einfachen Sketch geschrieben mit einem Breaker-Wire, das heißt wenn die Verbindung zu einem Pin unterbrochen wird(d.h. == LOW), wird ein Befehl ausgeführt. In diesem Fall wird ein Servo Motor um 90 Grad gedreht. Aber bevor der Befehl ausgeführt wird soll genau eine Pause von 5000 Millisekunden abgewartet werden.
Mein Problem ist, dass nach der Hardwaremäßigen Unterbrechung vergeht eine unbestimmte Zeit von einigen Sekunden, bevor die 5000 Millisekunden ablaufen. Diese Zeit ist auch noch länger wenn der Arduino
sich im 9v Batteriebetrieb befinden anstatt auf USB.
Die effektive Länge der Pause ist wichtig. Wenn die ungewollte Verzögerung immer gleich wäre, könnte ich sie von der 5000er Pause abziehen, jedoch ist dies nicht der Fall.
Du unterliegst außerdem einem Irrtum - wenn Nichts an dem Pin dran ist, ist Dessen Pegel unbestimmt - für ein sicheres LOW braucht's ein PULL-DOWN - wenn Du die Logik umdrehst, geht's auch mit einem PULL-UP - Den hätte der Arduino auf jedem Pin intern zum Zuschalten.
Außerdem muß ich HotSystems widersprechen - bin mir ziemlich sicher, daß Zeile 42 hier der Pferdefuß ist.
Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.
Außerdem entferne bitte die unnötigen Leerzeilem und formatiere den Code ordentlich (+T in der IDE hilft Dir dabei).
Was soll das dauernde .write(0); in loop()?
Sofern das Servo den Befehl jemals gesehen hat, ist Das bereits dort - mehr, als unnötig Rechenzeit verbraten, macht Das Da nicht.
Also ins setup(); mit dem ersten Aufruf.
Sofern der Arduino nichts Anderes mehr machen soll - kann das delay() drin bleiben.
Wenn der Arduino aber irgendwann auch Mal was sinnvolles machen soll, außer LED an warten Servo auf 90 warten Servo auf 0, dann wird Dir das delay() recht schnell auf die Zehen fallen.
Noch habe ich nicht verstanden, was delay() und Batterie-Betrieb zusammen machen wollen - aber ein Servo braucht, wenn man Es nicht abschaltet (also vom Strom trennt), Strom - blöd für die Batterie.
Man könnte den Arduino auch für die Wartezeit schlafen schicken:
Tastendruck erkannt?
-> LED AN
-> Wecker auf 5 Sekunden stellen, pennen
-> Servo ANschalten, Servo auf 90°
-> Wecker auf 500ms stellen, pennen
-> Servo abschalten
-> Wecker auf 2,5 Sekunden, pennen
-> Servo anschalten und auf 0° stellen
-> Wecker auf 500ms stellen, pennen
-> Servo abstellen
Hier ist blöd, daß der Arduino sinnlos 'im Kreis rennt', bis endlich eine taste gedrückt wird.
Da kann man den Arduino auch schlafen schicken und per Tastendruck aufwecken - bei Uno/Nano mindestens an Pin 2 und 3 möglich (PCINT gehen an allen Pins, müsste damit auch gehen).
Danke für die Antworten! Ihr seit echt klasse. Die "euren Code" Frotzelei war naturlich viel netter gemeint als es geklungen hat...Ich werde mir bei meinen Witzen mehr anstrengen.
Ich habe den breaker wire bisher mit einem pull down Widerstand parallel geschaltet damit pin 5=HIGH auch zuverlässig erkannt wird. Ich werde nun mit PCINT und INPUT_PULLUP probieren und melde mich dann nochmal. Aktuell sieht der Sketch noch so aus, ich hoffe er lässt sich jetzt besser lesen.
wenn Du in der IDE mal strg T drückst ( oder Werkzeuge/autom. Formatieren) kann man es noch etwas besser lesen.
Wenn Du den Schalter zwischen dem Pin und GND ( N schaltend ) anschliesst musst Du einen Pullup Widerstand verwenden, oder den internen Widerstand aktivieren pinMode(pin,INPUT_PULLUP). Der Pullup zieht das Potential des Einganges bei offenen Schalter hoch auf 5V.
Wenn Du den Schalter zwischen dem Pin und 5V ( P schaltend ) anschliesst musst Du einen externen Pulldown (5-10K) verwenden. Der zieht das Potential des Einganges bei offenem Schalter nach GND.
Danke für die Antworten! Ihr seit echt klasse. Die "euren Code" Frotzelei war naturlich viel netter gemeint als es geklungen hat...Ich werde mir bei meinen Witzen mehr anstrengen.
Dann solltest Du vieleicht ein anderes Smiley nehmen.
Grüße Uwe