Hi,
aktuell bin ich gerade dabei einen Fuß für ein kleines Modell mit LEDs auszustatten. Statt einfach nur "AN" und "AUS" hätte ich gerne ein paar Effekte dazu...und zwar zwei Fade-Effekte.
Es sind 4 LEDs, die im "Kreis" angeordnet sind.
Im Modus 1 (circle()) sollen die LEDs quasi im Kreis faden, sodass das Modell einmal kurz von jeder Seite angestrahlt wird.
Im Modus 2 (fader()) sollen die LEDs alle gemeinsam ein und aus faden.
Im Modus 3 (on()) sind die LEDs alle an, ohne Effekt.
Das ganze soll mit nur einem Taster (PULLUP) gesteuert werden.
An sich funktioniert es, bis auf eine nervige Sache:
Ich bekomme die beiden Fader-Modi nicht sofort unterbrochen, sondern nur genau dann, wenn die Sequenz beendet wurde.
Hat jemand eine Idee, wie ich diese Fade-Schleifen sofort beim Tastendruck unterbrechen kann und der Arduino den Modus wechselt?
Hier mein Sketch:
int ledPin1 = 3; // LED connected to digital pin 9
int ledPin2 = 5;
int ledPin3 = 6;
int ledPin4 = 9;
int buttonPin = 2;
int buttonState = 0;
byte buttonPressCount = 0;
byte cycle = 0;
int circleRun = 0;
int faderRun = 0;
int onRun = 0;
int offRun = 0;
int fadeValue = 0;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
digitalWrite(buttonPin, HIGH);
}
void circle() {
// fade in from min to max in increments of 5 points:
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin1, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(10);
}
// fade out from max to min in increments of 5 points:
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin1, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(10);
}
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin2, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(10);
}
// fade out from max to min in increments of 5 points:
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin2, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(10);
}
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin3, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(10);
}
// fade out from max to min in increments of 5 points:
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin3, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(10);
}
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin4, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(10);
}
// fade out from max to min in increments of 5 points:
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin4, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(10);
}
}
void fader() {
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
analogWrite(ledPin1, fadeValue);
analogWrite(ledPin2, fadeValue);
analogWrite(ledPin3, fadeValue);
analogWrite(ledPin4, fadeValue);
delay(10);
}
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) {
analogWrite(ledPin1, fadeValue);
analogWrite(ledPin2, fadeValue);
analogWrite(ledPin3, fadeValue);
analogWrite(ledPin4, fadeValue);
delay(10);
}
}
void on() {
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin4, HIGH);
}
void off() {
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
buttonPressCount = 0;
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == LOW) {
if (buttonPressCount == 1) {
Serial.println("1 - Circle");
cycle = 1;
}
if (buttonPressCount == 2) {
Serial.println("2 - Fader");
cycle = 2;
}
if (buttonPressCount == 3) {
Serial.println("3 - ON");
cycle = 3;
}
if (buttonPressCount == 4) {
Serial.println("4 - OFF");
cycle= 0;
Serial.println("0");
}
buttonPressCount++;
delay(300);
}
switch (cycle) {
case 0:
off();
break;
case 1:
circle();
break;
case 2:
fader();
break;
case 3:
on();
break;
}
}
Ich habe bereits versucht, circle() und fader() mit einem "while(buttonState != LOW)" zu versehen - ohne Erfolg, das gleiche gilt für eine if-Bedingung der gleichen Art.
Soweit ich das verstehe, muss der Arduino (Pro Micro übrigens) den ganzen Fade-Kram zu ende machen, bevor er etwas anderes wahrnehmen kann...oder liege ich da falsch?
Gruß,
Jannomag