Hallo zusammen,
Ich habe mich bei meinem derzeitigem Projekt an einem anderem aus diesem Forum orientiert, da er etwa dieselbe Problemstellung hatte, wie ich. Aber eben nur fast...
(Mit einem Taster mehrere Funktionen ausführen - Deutsch - Arduino Forum)
Meine Problemstellung:
Mit einem Taster drei (bestehende) Programmteile durchschalten und wenn der Bewegungssender bewegung meldet, die LED blinken lassen entsprechend des Programmteils.
Das Script:
int buttonPin = 8; //Taster "buttonPin" an Pin 2 angeschlossen
int ledPin = 7; //LED "ledPin" an Pin 13 angeschlossen
int sensorPin = 9; //Pin für den Bewegungssender
//Variablen des Zwischenspeichers:
int buttonPushCounter = 0; //Zählt Tastendrücke
int buttonState = 0; //Aktueller Tastenstatus
int lastButtonState = 0; //Vorheriger Tastenstatus
int sensorState = LOW; //Sensorstatus zu Beginn
unsigned long previousMillis = 0; //Speichert vergangene Zeit
const long interval = 500; //Intervall wo Tasterdrücke registriert wurden
void setup() {
Serial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
pinMode(sensorPin, INPUT);
sensorState=digitalRead(sensorPin);
}
void loop() {
unsigned long currentMillis = millis(); //Zählt Millisekunden
buttonState = digitalRead(buttonPin); //Taster an buttonPin wird gelesen und in Zwischenspeicher buttonState gespeichert
if (buttonState != lastButtonState) { //Wenn buttonState nicht gleich lastButtonState, dann...
if (buttonState == LOW) { //Wenn buttonState gleich gedrückt, dann...
buttonPushCounter ++; //buttonPushCounter +1
lastButtonState = buttonState; //Speichert buttonState in lastButtonState
previousMillis = currentMillis; //Speichere jetzige Millisekunden in previousMillis
delay(50);
}
else {
lastButtonState = buttonState;
}
}
if (currentMillis - previousMillis >= interval && buttonState == lastButtonState) { //Wenn gezählte Millisekunden minus vorherige Millisekunden (gespeicherte, vergangene Zeit) grösser/gleich interval ist und buttonState gleich lastButtonState ist, dann...
//Taster wird 1 Mal gedrückt:
if (buttonPushCounter == 1) { //Wenn buttonPushCounter gleich 1, dann...
digitalWrite(ledPin, HIGH); //Schalte ledPin an
delay(200);
digitalWrite(ledPin, LOW);
Serial.println();
Serial.println("kurz");
}
//Taster wird 2 Mal gedrückt:
if (buttonPushCounter == 2) { //Wenn buttonPushCounter gleich 2, dann...
digitalWrite(ledPin, HIGH); //Schalte ledPin an
delay(200);
digitalWrite(ledPin, LOW);
delay(200);
digitalWrite(ledPin, HIGH);
delay(200);
digitalWrite(ledPin, LOW);
Serial.println();
Serial.print("mittel");
}
//Taster wird 3 Mal gedrückt:
if (buttonPushCounter == 3) { //Wenn buttonPushCounter gleich 3, dann...
digitalWrite(ledPin, HIGH); //Schalte ledPin an
delay(200);
digitalWrite(ledPin, LOW);
delay(200);
digitalWrite(ledPin, HIGH);
delay(200);
digitalWrite(ledPin, LOW);
delay(200);
digitalWrite(ledPin, HIGH);
delay(200);
digitalWrite(ledPin, LOW);
Serial.println();
Serial.print("lang");
}
//Taster wird 4 Mal gedrückt:
if (buttonPushCounter == 4) { //Wenn buttonPushCounter gleich 4, dann...
digitalWrite(ledPin, HIGH); //Schalte ledPin an
delay(200);
digitalWrite(ledPin, LOW);
delay(200);
digitalWrite(ledPin, HIGH);
delay(200);
digitalWrite(ledPin, LOW);
delay(200);
digitalWrite(ledPin, HIGH);
delay(200);
digitalWrite(ledPin, LOW);
delay(200);
digitalWrite(ledPin, HIGH);
delay(200);
digitalWrite(ledPin, LOW);
Serial.println();
Serial.print("float overflow");
}
buttonPushCounter = 0; //Setze buttonPushCounter auf 0
if (digitalRead(sensorState == HIGH)&(lastButtonState == 1)){
digitalWrite (ledPin, HIGH);
delay (2000);
digitalWrite (ledPin, LOW);
delay (2000);
digitalWrite (ledPin, HIGH);
delay (1000);
}
if (digitalRead(sensorState == HIGH)&(lastButtonState == 2)){
digitalWrite (ledPin,HIGH);
delay (2000);
digitalWrite (ledPin, LOW);
delay (2000);
digitalWrite (ledPin,HIGH);
delay (2000);
digitalWrite (ledPin, LOW);
delay (2000);
digitalWrite (ledPin,HIGH);
delay (2000);
}
if (digitalRead(sensorState == HIGH)&(lastButtonState == 3)){
digitalWrite (ledPin,HIGH);
delay (2000);
digitalWrite (ledPin, LOW);
delay (2000);
digitalWrite (ledPin,HIGH);
delay (2000);
digitalWrite (ledPin, LOW);
delay (2000);
digitalWrite (ledPin,HIGH);
delay (2000);
digitalWrite (ledPin, LOW);
delay (2000);
digitalWrite (ledPin,HIGH);
delay (2000);
digitalWrite (ledPin, LOW);
delay (1000);
}
if (digitalRead(sensorState == HIGH)&(lastButtonState == 4)){
digitalWrite (ledPin, LOW);
delay (2000);
}
}
}
Was macht er?
Nun, solange ich den eigenen Teil weg lasse (mit if (digitalRead(sensorState == HIGH)&(lastButtonState == 1)){, usw. ) funktioniert die Schaltung, so wie ich will. Im seriellen Monitor zeigt er mir an, sobald ein Programm durch mehrfach Druck ausgelöst wird.
Alles andere Blinkt quasi nur noch, manchmal zeigt er mir am seriellen Monitor an, das ein Programm durchkommt.
Frage:
Was muss ich für einen Befehl eintragen, damit er mich bei erkannter Bewegung an den Taster lässt? Währen des Drückens am Taster ist es wurscht ob er Blinkt. Es geht ja um das Durchschalten.
Vielen Dank schonmal!
VG
Thomas
sketch_nov08a.ino (4.69 KB)