Guten Abend,
ich versuche mich zur Zeit an einem Projekt mit den WS2812B.
Im Prinzip nutze ich 2 Taster. Mit dem Haupttaster (button2) soll es möglich sein zwischen verschiedenen "Effekten" zu wechseln. Per default soll der "Effekt" "StaticStripColor" laufen und der Streifen immer gelb leuchten. Der button1 soll hierbei die Farbe der LEDs wechseln. Durch drücken des button2 soll dann der "Effekt" gewechselt.
Nun das Problem. Nach drücken des button2 wechselt der Effekt, doch bleibt dann stecken. Im SerialMonitor wird dann auch nur noch "Modus 1" ausgegeben. Egal wie oft ich den button2 drücke, die Loop bleibt beim Effekt stecken.
Die Effekte funktionieren einzeln. Außerdem habe ich die Effekte einmal auskommentiert und nur im SerialMonitor den aktuellen Status des buttonCounters ausgeben. Das funktioniert auch.
Kann mir bitte jemand dabei helfen meinen Fehler zu finden? Bin für anderweitige Änderungsvorschläge natürlich offen.
LG, Carlos
#include <Adafruit_NeoPixel.h>
#define PIN_LEDs_strip 6 //arduino pin to send data to the LED_strip
#define NUMPIXELS_strip 14 //amount of LEDs on the strip
// initialize the LED strip
Adafruit_NeoPixel pixels1(NUMPIXELS_strip, PIN_LEDs_strip, NEO_GRB + NEO_KHZ800);
// variables to use button1
int button1 = 2; // button 1 is connected to pin 2 of the arduino
int pinState1; // pin status variable
int buttonState1; // last button status variable
int buttonCounter1 = 0; // counts the times how often the button was pressed
// variables to use button2
int button2 = 13; // button 2 is connected to pin 13 of the arduino
int pinState2; // pin status variable
int buttonState2; // last button status variable
int buttonCounter2 = 0; // counts the times how often the button was pressed
void setup() {
//Setup for LED strip
pixels1.begin(); // start the LED strip
pixels1.setBrightness(10); // set the brightness 0....255
// Setup for button1: basically to change the color of the strip
pinMode(button1, INPUT); // set button1 as input
buttonState1 = digitalRead(button1); // read the beginning status of button1
// Setup for button2: basically to change the effect of the strip
pinMode(button2, INPUT); // set button2 as input
buttonState2 = digitalRead(button2); // read the beginning status of button2
Serial.begin(9600); // start the serial communication with 9600bps
}
void loop() {
pinState1 = digitalRead(button1); // read out the button1 and save the pin state
pinState2 = digitalRead(button2); // read out the button2 and save the pin state
if (pinState2 != buttonState2) { // status of the button has changed
if (pinState2 == LOW) { // asks if the is pressed
buttonCounter2++; // variable buttonCounter counts up by 1
Serial.print("Modus: ");
Serial.println(buttonCounter2);
}
}
buttonState2 = pinState2; // save the status
switch (buttonCounter2) {
case 1: CylonBounce(255, 0, 0, 2, 10, 50);
delay(100);
break;
case 2: RunningLights(255, 0, 0, 50);
delay(100);
break;
case 3: SnowSparkle(0, 255, 0, 20, random(100, 1000));
delay(100);
break;
case 4: RGBLoop();
delay(100);
break;
default: staticStripColor();
delay(100);
buttonCounter2 = 0;
break;
}
}
void setPixel(int Pixel, byte red, byte green, byte blue) {
pixels1.setPixelColor(Pixel, pixels1.Color(red, green, blue));
}
void setAll(byte red, byte green, byte blue) {
pixels1.clear();
for (int i = 0; i < NUMPIXELS_strip; i++) {
setPixel(i, red, green, blue);
}
pixels1.show();
delay(100);
}
// ----- Effekte -----
void staticStripColor() {
if (pinState1 != buttonState1) { // status of the button has changed
if (pinState1 == LOW) { // asks if the is pressed
buttonCounter1++; // variable buttonCounter counts up by 1
Serial.print("Color: ");
Serial.println(buttonCounter1);
}
}
buttonState1 = pinState1; // save the status
switch (buttonCounter1) {
case 1: setAll(255, 0, 0); //red
break;
case 2: setAll(0, 255, 0); //green
break;
case 3: setAll(0, 0, 255); //blue
break;
case 4: setAll(255, 0, 255); //magenta
break;
case 5: setAll(0, 255, 255); //cyan
break;
case 6: setAll(255, 255, 255); //whitw
break;
default: setAll(255, 255, 0); //yellow
buttonCounter1 = 0;
break;
}
}
void RGBLoop() {
for (int j = 0; j < 3; j++ ) {
// Fade IN
for (int k = 0; k < 256; k++) {
switch (j) {
case 0: setAll(k, 0, 0); break;
case 1: setAll(0, k, 0); break;
case 2: setAll(0, 0, k); break;
}
pixels1.show();
delay(3);
}
// Fade OUT
for (int k = 255; k >= 0; k--) {
switch (j) {
case 0: setAll(k, 0, 0); break;
case 1: setAll(0, k, 0); break;
case 2: setAll(0, 0, k); break;
}
pixels1.show();
delay(3);
}
}
}
void CylonBounce(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) {
for (int i = 0; i < NUMPIXELS_strip - EyeSize - 2; i++) {
setAll(0, 0, 0);
setPixel(i, red / 10, green / 10, blue / 10);
for (int j = 1; j <= EyeSize; j++) {
setPixel(i + j, red, green, blue);
}
setPixel(i + EyeSize + 1, red / 10, green / 10, blue / 10);
pixels1.show();
delay(SpeedDelay);
}
delay(ReturnDelay);
for (int i = NUMPIXELS_strip - EyeSize - 2; i > 0; i--) {
setAll(0, 0, 0);
setPixel(i, red / 10, green / 10, blue / 10);
for (int j = 1; j <= EyeSize; j++) {
setPixel(i + j, red, green, blue);
}
setPixel(i + EyeSize + 1, red / 10, green / 10, blue / 10);
pixels1.show();
delay(SpeedDelay);
}
delay(ReturnDelay);
}
void SnowSparkle(byte red, byte green, byte blue, int SparkleDelay, int SpeedDelay) {
setAll(red, green, blue);
int Pixel = random(NUMPIXELS_strip);
setPixel(Pixel, 0xff, 0xff, 0xff);
pixels1.show();
delay(SparkleDelay);
setPixel(Pixel, red, green, blue);
pixels1.show();
delay(SpeedDelay);
}
void RunningLights(byte red, byte green, byte blue, int WaveDelay) {
int Position = 0;
for (int j = 0; j < NUMPIXELS_strip * 2; j++)
{
Position++; // = 0; //Position + Rate;
for (int i = 0; i < NUMPIXELS_strip; i++) {
setPixel(i, ((sin(i + Position) * 127 + 128) / 255)*red,
((sin(i + Position) * 127 + 128) / 255)*green,
((sin(i + Position) * 127 + 128) / 255)*blue);
}
pixels1.show();
delay(WaveDelay);
}
}
