aLSTRIx:
Wenn ich den Code so einsetze, startet der5 Rainbow-Effekt erst gar nicht, kann aber den nächsten Case mit dem Button aufrufen.
Doch, das geht, aber wegen blockierendem Code (for mit delay) spielt der Zufall Dir einen Streich.
aLSTRIx:
- Wie kann ich unter "case 4" den Befehl "rainbow" in einer Schleife laufen lassen (Loop) und
- diese Schleife zu jeder Zeit mit dem Push-Button wieder verlassen.
Du hast ein konzeptionelles Problem. Mit startShow() wird die Show einmalig gestartet, aber nicht fortgesetzt. Außerdem sind alle Shows blockierend programmiert, was das Erkennen von Tastendrücken erschwert.
Nur für die Animation rainbow habe ich Dein Programm aus #0 entsprechend verändert. Dazu wird makeShow auch bei nicht gedrücktem Taster aufgerufen und die for-Schleifen zur Schleife loop geöffnet:
#include <Adafruit_NeoPixel.h>
#define BUTTON_PIN 2
#define PIXEL_PIN 6
#define PIXEL_COUNT 10
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_RGB + NEO_KHZ800);
bool oldState = HIGH;
int showType = 0;
uint16_t i, j; // Zaehler fuer Farben und Durchlaefe
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
strip.begin();
strip.show(); // Initialize all pixels to 'off'
}
void loop() {
// Get current button state.
bool newState = digitalRead(BUTTON_PIN);
// Check if state changed from high to low (button press).
if (newState == LOW && oldState == HIGH) {
// Short delay to debounce button.
delay(20);
// Check if button is still low after debounce.
newState = digitalRead(BUTTON_PIN);
if (newState == LOW) {
showType++;
i = 0; // auf Anfang
j = 0; // auf Anfang
if (showType > 9)
showType = 0;
}
}
makeShow(showType); // immer
// Set the last button state to the old state.
oldState = newState;
}
void makeShow(int i) {
switch (i) {
case 0: colorWipe(strip.Color(0, 0, 0), 5); // Black/off
break;
case 1: colorWipe(strip.Color(255, 0, 0), 5); // Red
break;
case 2: colorWipe(strip.Color(0, 255, 0), 5); // Green
break;
case 3: colorWipe(strip.Color(0, 0, 255), 5); // Blue
break;
case 4: theaterChase(strip.Color(127, 127, 127), 5); // White
break;
case 5: theaterChase(strip.Color(127, 0, 0), 5); // Red
break;
case 6: theaterChase(strip.Color( 0, 0, 127), 5); // Blue
break;
case 7: rainbow(20);
break;
case 8: rainbowCycle(20);
break;
case 9: theaterChaseRainbow(50);
break;
}
}
// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
for (i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, c);
strip.show();
delay(wait);
}
}
void rainbow(uint8_t wait) {
strip.setPixelColor(i, Wheel((i + j) & 255));
i++;
if (i == strip.numPixels()) {
strip.show();
delay(wait);
i = 0;
j++;
}
}
// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
i, j;
for (j = 0; j < 256 * 5; j++) { // 5 cycles of all colors on wheel
for (i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
}
strip.show();
delay(wait);
}
}
//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
for (int j = 0; j < 10; j++) { //do 10 cycles of chasing
for (int q = 0; q < 3; q++) {
for (int i = 0; i < strip.numPixels(); i = i + 3) {
strip.setPixelColor(i + q, c); //turn every third pixel on
}
strip.show();
delay(wait);
for (int i = 0; i < strip.numPixels(); i = i + 3) {
strip.setPixelColor(i + q, 0); //turn every third pixel off
}
}
}
}
//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
for (int j = 0; j < 256; j++) { // cycle all 256 colors in the wheel
for (int q = 0; q < 3; q++) {
for (int i = 0; i < strip.numPixels(); i = i + 3) {
strip.setPixelColor(i + q, Wheel( (i + j) % 255)); //turn every third pixel on
}
strip.show();
delay(wait);
for (int i = 0; i < strip.numPixels(); i = i + 3) {
strip.setPixelColor(i + q, 0); //turn every third pixel off
}
}
}
}
// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if (WheelPos < 85) {
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if (WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
Die anderen Animationen anzupassen, möchte ich Dir überlassen ![]()