leider komme ich nicht mehr weiter. Mein Problem: Die Schleife vom Servo soll durch Tastendruck "aktiviert" und auch wieder "deaktiviert" werden. Würde mich über jegliche Hilfe freuen. PS: Ich bin Blutiger Anfänger also habt Nachsicht ;).
#include <Servo.h>
int LED = 6;
int SERVO = 9;
int TASTE = 7;
Servo servo1;
void setup() {
pinMode(LED, OUTPUT);
pinMode(TASTE, INPUT);
Serial.begin(9600);
servo1.attach(9);
servo1.write(125);
delay(5000);
servo1.write(90);
delay(200);
servo1.write(125);
delay(750);
}
bool status = false;
void loop()
{
// read the state of the pushbutton value:
if(digitalRead(TASTE) && status ) {
status = false;
} else if(digitalRead(TASTE) && !status ) {
status = true;
}
Serial.println(status);
// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (status == HIGH) {
Serial.println("if");
// turn LED on:
digitalWrite(LED, HIGH);
servo1.write(90);
delay(250);
// servo1.write(125);
// delay(600);
} else {
Serial.println("else");
// turn LED off:
digitalWrite(LED, LOW);
delay(250);
}
}
Bitte setze deinen Sketch in Code-Tags, Schaltfläche </> oben Links im Editorfenster.
Dann ist der Sketch auch auf mobilen Geräten gut zu lesen.
Dein Taster prellt, daher solltest du den entprellen, damit der Sketch nicht ungehindert durchrauscht.
Setze einfach ein kurzes delay() in deine if-Abfrage und if else-Abfrage.
Das sollte für den Anfang genügen.
Wenn dein Schalter nach 5V schließt, brauchst du einen externen Pulldown-Widerstand.
Einfacher ist es den Schalter nach GND schließen zu lassen, den internen Pullup Widerstand mit
pinMode(..., INPUT_PULLUP) zu aktivieren und dann auf LOW für gedrückt auszuwerten.
if(digitalRead(TASTE) && status ) {
status = false;
} else if(digitalRead(TASTE) && !status ) {
status = true;
}
Solange der Taster gedrückt ist, wechselt dein status mit jedem loop-Durchlauf ständig zwischen false und true. Wenn Du ihn dann loslässt ist es reiner Zufall, welchen Wert dein 'status' dann hat.
D.h. wenn Du den status verändert hast, musst Du dir das merken, und musst warten bis der Taster losgelassen wurde. Erst dann darfst Du wieder auf das Drücken reagieren um den status umzuschalten.
Etwa so: (auf die Schnelle und ungetestet )
tasteState = digitalRead(TASTE);
if ( !tasteOld && tasteState ) {
// Taste wurde gerade gedrückt, state umschalten
status = ! status;
}
tasteOld = tasteState;
Entprellt ist dein Taster schon, da in deinem loop immer ein delay(250) durchlaufen wird, und daher der Taster nur alle 250ms abgefragt wird. Wichtig dabei ist nur, dass Du das digitalRead(TASTE) nur 1x im loop aufrufst.
Danke für die schnelle Hilfe... leider habe ich es bis jetzt nur geschafft die LED bei Tastendruck zu Aktivieren und auch wieder zu Deaktivieren. Jetzt wies ich nicht wie ich den Servo dabei einbinden soll. Ist es vielleicht möglich mir das ganze an meinem bestehenden Programm zu überarbeiten? Bis jetzt ist mir jeglicher versuch missglückt und endet in einer Fehlermeldung ^^.
#include <Servo.h>
int LED = 6;
int SERVO = 9;
int TASTE = 7;
Servo servo1;
void setup() {
pinMode(LED, OUTPUT);
pinMode(TASTE, INPUT);
Serial.begin(9600);
servo1.attach(9);
servo1.write(125);
delay(5000);
servo1.write(90);
delay(200);
servo1.write(125);
delay(750);
}
bool status = false;
void loop()
{
// read the state of the pushbutton value:
if(digitalRead(TASTE) && status ) {
status = false;
} else if(digitalRead(TASTE) && !status ) {
status = true;
}
Serial.println(status);
// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (status == HIGH) {
Serial.println("if");
// turn LED on:
digitalWrite(LED, HIGH);
servo1.write(90);
delay(250);
// servo1.write(125);
// delay(600);
} else {
Serial.println("else");
// turn LED off:
digitalWrite(LED, LOW);
delay(250);
}
}
leider komme ich nicht mehr weiter. Mein Problem: Die Schleife vom Servo soll durch Tastendruck "aktiviert" und auch wieder "deaktiviert" werden. Würde mich über jegliche Hilfe freuen. PS: Ich bin Blutiger Anfänger also habt Nachsicht ;).
Als erstes fällt mir auf, dass Du wohl ein Hardware-Fetischist bist und unbedingt Bauteile wie "Pull-Down-Widerstände" verbauen möchtest, die überhaupt nicht notwendig wären, wenn Du nicht so einen Idiotenkram machen würdest:
pinMode(TASTE, INPUT);
Ddas deutet darauf hin, dass Deine Taste auf 5V durchschaltet und Du in der Schaltung einen Pull-Down-Widerstand benötigst, um den unbetätigten Schalter auf LOW zu halten.
Richtig füf Anfänger wäre:
pinMode(TASTE, INPUT_PULLUP);
und KEINEN Pull-Widerstand in der Schaltung verwenden, aber den Schalter gegen GND schalten zu lassen.
Das heißt dann: Unbetätigter Schalter liefert HIGH, wegen pinMode INPUT_PULLUP
betätigter Schalter liefert LOW.
Das spart einen Widerstand im Schaltplan ein.
Und es erspart einem das Verkabeln dieses Widerstands in der Schaltung.
Ist so aber nur für kurze Leitungslängen bis vielleicht ca. 40cm zwischen Arduino und Taster zu empfehlen, für "lange Leitungen zu Tastern verbaut man besser externe Pull-Widerstände zusätzlich.
Ich habe jetzt nochmal eine weile getestet und probiert und habe festgestellt, das mein Problem behoben wurde indem ich einfach eine zweite Abfrage gemacht habe für den Servo und es Funktioniert wie ich es mir vorgestellt habe.
#include <Servo.h>
int LED = 6;
int SERVO = 9;
int TASTE = 7;
Servo servo1;
void setup() {
pinMode(LED, OUTPUT);
pinMode(TASTE, INPUT);
Serial.begin(9600);
servo1.attach(9);
servo1.write(125);
delay(5000);
servo1.write(90);
delay(200);
servo1.write(125);
delay(750);
}
bool status = false;
void loop()
{
if(digitalRead(TASTE) && status ) {
status = false;
} else if(digitalRead(TASTE) && !status ) {
status = true;
}
Serial.println(status);
if (status == HIGH) {
Serial.println("if");
digitalWrite(LED, HIGH);
delay(250);
} else {
Serial.println("else");
// turn LED off:
digitalWrite(LED, LOW);
delay(250);
}
Serial.println(status);
if (status == HIGH) {
Serial.println("if");
servo1.write(90); //1
delay(200);
servo1.write(125);
delay(600);
} else {
Serial.println("else");
}
}