ich möchte gerne einen Servo per Taster auf position X fahren lassen, und er soll nach einer bestimmten zeit z.B. 5 Sekunden wieder zurück auf ausgangsposition fahren.
Dazu habe ich den Taster an pin 7 und +5V angeschlossen und den Servo an pin 9.
Hier mal mein Sketch der nicht funktioniert:
#include <Servo.h>
int Taster = 7;
int val = 0;
int state = 0;
Servo servo;
void setup() {
pinMode(Taster, INPUT);
servo.attach(9);
servo.write(0);
}
void loop() {
{ val = digitalRead(Taster);
{ if (val == LOW) {
state = 1 - state;
delay(20);
}
if (state == 1)
servo.write(100);
if (state == 0)
delay(5000);
servo.write(0);
}}}
ich möchte gerne einen Servo per Taster auf position X fahren lassen, und er soll nach einer bestimmten zeit z.B. 5 Sekunden wieder zurück auf ausgangsposition fahren.
Dazu habe ich den Taster an pin 7 und +5V angeschlossen und den Servo an pin 9.
Hast Du einen Pulldown Widerstand an den Taster angeschlossen?
void loop() {
{ val = digitalRead(Taster);
{ if (val == LOW) {
state = 1 - state;
delay(20);
}
Du machst unnütz 2 Klammern auf.
So wechselst Du alle 20ms den Zustand von state Der Servo fährt nur nicht dauernd hin und her weil Du ein langes delay() drin hast.
if (state == 0) delay(5000);
Vermeide delay() weil es den controller blockiert. Benutze stattdessen millis() siehe blink witout delay Beispiel und Nachtwächtererklährung.
if (val == LOW) { //<- Wenn Du kein INPUT_PULLUP verwendest, musst Du auf ein HIGH "warten", 5v -> Pin7 = HIGH
state = 1 - state; // Dafür gibt es eine elegantere Lösung aber eines nach dem anderen.
So wie der Code jetzt ausschaut, drückst Du den Taster, dann fährt der Servo auf Pos: 100 und wenn Du nochmaldrückst vergehen 5 Sekunden und dann fährt der Servo zu Pos: 0.
Wenn ich Dich richtig verstanden habe dann soll der Servo nach 5 Sekunden von selber wieder auf Pos: 0 fahren!?
ja stimmt der Servo soll beim Drücken des Tasters auf 100 fahren und dann nach 5 sek wieder auf Null.
Habe den Sketch jetzt ein bisschen Modifiziert. Aber es passier einfach gar nichts.
#include <Servo.h>
const int Taster = 7;
int val = 0;
int state = 0;
Servo servo;
void setup() {
pinMode(Taster, INPUT_PULLUP);
servo.attach(9);
servo.write(0);
}
void loop() {
{ val = digitalRead(Taster);
if (val == LOW)
state = 1 - state;
delay(20);
}
if (state == 1)
servo.write(100);
if (state == 0)
delay(5000);
servo.write(0);
}
Als Basis hatte ich diesen Sketch verwendet, der auch Funktioniert. Der Servo fährt per Taster auf 100 Grad und bei neuem drücken wieder auf Null.
#include <Servo.h>
const int Taster = 7;
int val = 0; // speichert den Zustand des Tasters
int old_val = 0; // speichert den vorherigen wert von val
int state = 0; // 0 = Servo Position eins 1 = Servo Position zwei
Servo servo;
void setup() {
pinMode(Taster, INPUT_PULLUP);
servo.attach(9);
servo.write(0);
}
void loop() {
{ val = digitalRead(Taster); // liest den Input aus und cheked ob er gedrückt ist.
if ((val == LOW) && (old_val == HIGH)) { // HIER IST DIE ABFRAGE GEÄNDERT
state = 1 - state;
delay(20);
}
old_val = val; // aktueller val wird zu val alt
if (state == 1) {
servo.write(100); // Stelle servo auf 180 grad
}
else {
servo.write(0); // stelle servo auf startposition
}
}}
Ich hab Deinen Code mal einige Kommentare und geschweifte Klammern hinzugefügt, wenn die Schaltung stimmt sollte er funktionieren. Wie ist der Taster verdrahtet, so wie in #0 beschrieben, 5V->Taster->Pin7 mit PullUp PullDown (gegen Masse)?
Du musst echt aufpassen wann Du wo eine geschweifte Klammer setzt.
#include <Servo.h>
const int Taster = 7;
int val = 0;
int state = 0;
Servo servo;
void setup() {
pinMode(Taster, INPUT_PULLUP); // Wie schaut die Schaltung aus?
servo.attach(9);
servo.write(0);
}
void loop() {
// { // <- funktioniert nicht
val = digitalRead(Taster);
if (val == LOW) { // if abfrage begin
state = 1 - state;
delay(20);
} // if abfrage ende
if (state == 1) servo.write(100); // <- hier geht es ohne {} weil nur EINE Funktion ausgeführt wird.
if (state == 0) { //<-
delay(5000);
servo.write(0);
} //<-
} // <- loop ende
ja stimmt der Servo soll beim Drücken des Tasters auf 100 fahren und dann nach 5 sek wieder auf Null.
Um automatisch zurückzufahren fehlt noch was, besser gesagt kann man das leichter verwirklichen. Das ist dann ein Ablauf, nicht mehrere.
val = digitalRead(Taster);
if (val == LOW) { // if abfrage begin
state = 1 - state;
delay(20);
} // if abfrage ende
Wenn der Taster gedrückt ist, wechselt state 50 mal je Sekunde den Zustand zwischen 0 und 1.
Das vermeidest du zwar im weiteren durch dein delay(5000), schön ist es aber nicht.
Wozu ist das delay(20) gut, wenn du sowieso auf das delay(5000) angewiesen bist?
In deinem Original-Beispiel hattest du übrigens eine Flankenerkennung drin.
Das wird Dir IMMER das Servo auf 0 fahren.
In der ersten Runde stellst Du das Servo zwar auf 100, setzt aber 'Grundstellung' auf false.
In der nächsten Runde, der Taster ist immer noch gedrückt, stellst Du das Servo wieder auf Null - und wartest jetzt 5 Sekunden.
Ich dachte der Servo soll bei gedrückter Taste ausfahren und wenn die Taste los gelassen wird, soll der Servo nach 5 Sekunden in die Grundstellung zurück fahren.