Delay im Batteriebetrieb

Hallo, kann mir einer helfen:

Ich habe gerade erst angefangen(1 Woche her) und

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.

Da habt ihr euren Code :slight_smile:

#include <Servo.h>;

Servo motor1;

void setup() {
pinMode(5, INPUT);
pinMode(9, OUTPUT);
pinMode(13, OUTPUT);

motor1.attach(9);

}

void loop() {
 
motor1.write(0);

digitalWrite(13, LOW);
 
 if(digitalRead(5) == LOW) {
   digitalWrite(13, HIGH);      
   delay(5000);       
   motor1.write(90);
   delay(3000);
   motor1.write(0);
}
}

Was für Gründe kann es da geben?
LG

Ab Zeile 57 hast du eine Schleife, die das Problem verursacht.

Du hast Dich verzählt, der Fehler ist in Zeile 42.

Hi

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.

MfG

Moko:
Du hast Dich verzählt, der Fehler ist in Zeile 42.

Ups....dann ist das auch noch eine Kopie, die der TO fehlerhaft übernommen hat.
Der Fehler in Zeile 42 ist schon öfter gewesen.

Hallo,

wie hast Du denn die Pause realisiert , und was passiert in der Zeit sonst noch ?

So macht das keinen Sinn, zeig uns deinen Sketch , raten macht keinen Spaß , Meine Glaskuge ist blind und in Quarantäne.

Heinz

postmaster-ino:
Außerdem muß ich HotSystems widersprechen - bin mir ziemlich sicher, daß Zeile 42 hier der Pferdefuß ist.

Ok....ok,
ich zähl nochmal nach.

Rentner:
So macht das keinen Sinn, zeig uns deinen Sketch , raten macht keinen Spaß , Meine Glaskuge ist blind und in Quarantäne.

Die darfst du eh nicht mehr einsetzen, seit dem neuen DSGVO.

Edit:
Ich seh schon, der TO versteht uns nicht.....und auch keinen Spaß.

HotSystems:
Die darfst du eh nicht mehr einsetzen, seit dem neuen DSGVO.

Ahhhh jetzt weiß ich auch warum sie blind geworden ist.

( so jetzt reichts )

Heinz

Also TO, lass dich nicht ärgern, wenn wir hier ein wenig frozeln.

Aber wie sollen wir helfen, wenn du alles geheim hältst.
Was wir brauchen, wurde doch schon geschrieben.

Oder nochmal es neutral zu sagen, als Moderator darf ich das.
Ohne Sketch und Schaltplan können wir Dir nicht helfen.
Grüße Uwe

Da habt ihr euren Code :slight_smile:

#include <Servo.h>;

Servo motor1;

void setup() {
pinMode(5, INPUT);
pinMode(9, OUTPUT);
pinMode(13, OUTPUT);

motor1.attach(9);

}

void loop() {

motor1.write(0);

digitalWrite(13, LOW);

 if(digitalRead(5) == LOW) {
   digitalWrite(13, HIGH);     
   delay(5000);       
   motor1.write(90);
   delay(3000);
   motor1.write(0);
}
}

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

Gruß Tommy

Hi

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

MfG

Ich tippe immernoch auch das Problem das postmaster-ino in #3 vorgeschlagen hat.
Versuch mal statt
pinMode(5, INPUT);
mal

pinMode(5, INPUT_PULLUP);

Wieso das?
Weil ein unbeschalteter Eingang (Pin mit ungedrückten Taster) irgendetwas zufällig liest.

Grüße Uwe

lugg4s:
Da habt ihr euren Code :slight_smile:

Wieso "euren Code" ?
Das ist doch dein Sketch, du willst doch Hilfe haben.
Also warum so frotzig ?

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. :slight_smile:

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.

#include <Servo.h>;
Servo motor1;
void setup() {
 pinMode(5, INPUT);
 pinMode(9, OUTPUT);
 pinMode(13, OUTPUT);
motor1.attach(9);
motor1.write(0);}
void loop() {
 digitalWrite(13, LOW);
 if(digitalRead(5) == LOW) {
    digitalWrite(13, HIGH);      
    delay(5000);       
    motor1.write(90);
    delay(3000);
    motor1.write(0);
 }}

Hallo,

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.

Heinz

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. :wink: :wink: :wink:
Grüße Uwe