Ich versuch hier gerade die rainbow func im Dauerbetrieb laufen zu lassen für den angeschlossenen LED-Strip. Um trotzdem während der while schleife auf neue Inputs über Infrarot reagieren zu können hab ich da n bisschen was geschrieben. Jetzt allerdings das Problem:
Wenn er in der While schleife ist, kann er gesendete Infrarotsignale nicht sinnvoll entschlüsseln. Im Normalen Modus schon. Und langsam fang ich echt an einen absoluten Spaghetti-Code zu produzieren bei der Fehlersuche und ich glaub ich hab mir echt einiges langsam überkompliziert dadurch.
Hier mal der "Code" (Will ihn wirklich nicht so nennen)
// NeoPixel Ring simple sketch (c) 2013 Shae Erisson
// Released under the GPLv3 license to match the rest of the
// Adafruit NeoPixel library
#include <Arduino.h>
#include <IRremote.hpp>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
const int IR_RECEIVE_PIN = 7;
unsigned long key_value = 0;
unsigned long last_code = 0;
unsigned long key_value_old = 0;
unsigned long code_breaker = 0;
int breakOnUpdate = 0;
// Which pin on the Arduino is connected to the NeoPixels?
#define PIN 8 // On Trinket or Gemma, suggest changing this to 1
// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS 256 // Popular NeoPixel ring size
// NeoPixel brightness, 0 (min) to 255 (max)
int BRIGHTNESS = 3; // Set BRIGHTNESS to about 1/5 (max = 255)
// When setting up the NeoPixel library, we tell it how many pixels,
// and which pin to use to send signals. Note that for older NeoPixel
// pixelss you might need to change the third parameter -- see the
// strandtest example for more information on possible values.
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#define DELAYVAL 50 // Time (in milliseconds) to pause between pixels
void setup() {
Serial.begin(9600);
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); // Start the receiver
// These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
// Any other board, you can remove this part (but no harm leaving it):
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
clock_prescale_set(clock_div_1);
#endif
// END of Trinket-specific code.
pixels.begin(); // INITIALIZE NeoPixel pixels object (REQUIRED)
pixels.show(); // Turn OFF all pixels ASAP
pixels.setBrightness(BRIGHTNESS);
}
void loop() {
checkForUpdates();
}
void checkForUpdates() {
if (IrReceiver.decode()) {
Serial.println(IrReceiver.decode());
// IrReceiver.printIRResultShort(&Serial);
IrReceiver.resume(); // Enable receiving of the next value
if (IrReceiver.decodedIRData.numberOfBits > 31) {
Serial.println("32 Bit");
key_value = IrReceiver.decodedIRData.decodedRawData;
code_breaker = IrReceiver.decodedIRData.decodedRawData;
// Serial.print("11Key Value am Start von Decode: ");
// Serial.println(key_value, HEX);
// Serial.print("12Key Value Old am Start von Decode: ");
// Serial.println(key_value_old, HEX);
ledCode(key_value);
} else if (IrReceiver.decodedIRData.numberOfBits > 8 && IrReceiver.decodedIRData.numberOfBits < 31) {
Serial.println("Unter 32 Bit");
if (IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT) {
} else {
IrReceiver.printIRResultShort(&Serial);
code_breaker = IrReceiver.decodedIRData.decodedRawData;
}
} else {
if (IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT) {
Serial.println("Repeat");
ledCode(key_value);
}
}
}
}
void checkForCodeBreaks() {
if (IrReceiver.decode()) {
if (IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT) {
} else {
if (IrReceiver.decodedIRData.numberOfBits > 8) {
code_breaker = IrReceiver.decodedIRData.decodedRawData;
}
}
IrReceiver.resume();
}
}
void ledCode(long key_value) {
Serial.print("1Key Value am Start von ledCode: ");
Serial.println(key_value, HEX);
Serial.print("2Code Breaker am Start von ledCode: ");
Serial.println(code_breaker, HEX);
Serial.print("3key value old am Start von ledCode: ");
Serial.println(key_value_old, HEX);
if (key_value == 0xF807FF00) { // Button An
key_value = key_value_old;
code_breaker = key_value_old;
Serial.println("Breaker");
}
Serial.println(key_value, HEX);
delay(100);
switch (key_value) {
case 0xF906FF00: // Button Aus
pixels.clear();
pixels.show();
break;
case 0xF609FF00: //Farbe Rot
key_value_old = 0xF609FF00;
colorSwitch(pixels.Color(255, 0, 0));
break;
case 0xF708FF00: //Farbe Grün
key_value_old = 0xF708FF00;
colorSwitch(pixels.Color(0, 255, 0));
break;
case 0xF10EFF00: // Farbe Blau Hell
key_value_old = key_value;
colorSwitch(pixels.Color(0, 0, 255));
break;
case 0xF40BFF00:
key_value_old = key_value;
colorSwitch(pixels.Color(128, 128, 128));
break;
case 0xF50AFF00: // Farbe Blau Dunkel
key_value_old = key_value;
colorSwitch(pixels.Color(20, 0, 255));
break;
case 0xF20DFF00: // Farbe Orange
key_value_old = key_value;
colorSwitch(pixels.Color(255, 147, 5));
break;
case 0xF30CFF00: // Farbe Hellgrün
key_value_old = key_value;
colorSwitch(pixels.Color(118, 235, 2));
break;
case 0xEE11FF00: // Farbe Gelb
key_value_old = key_value;
colorSwitch(pixels.Color(252, 244, 3));
break;
case 0xFA05FF00: // Helligkeit hoch
BRIGHTNESS++;
pixels.setBrightness(BRIGHTNESS);
pixels.show();
break;
case 0xFB04FF00: // Helligkeit runter
BRIGHTNESS--;
if (BRIGHTNESS > 0) {
pixels.setBrightness(BRIGHTNESS);
pixels.show();
}
break;
case 0xED12FF00: //Farbe Pink
key_value_old = 0xED12FF00;
colorSwitch(pixels.Color(202, 21, 230));
break;
case 0xE41BFF00: // Button Fade
key_value_old = 0xE41BFF00;
while (breakOnUpdate == 0) { // Repeat 30 times...
checkForUpdates();
if (key_value == 0xE41BFF00 && code_breaker == 0xE41BFF00) {
for (int h = 1; h < 32; h++) {
checkForUpdates();
pixels.setBrightness(h);
delay(10);
pixels.show();
}
for (int g = 32; g > 1; g--) {
checkForUpdates();
pixels.setBrightness(g);
delay(50);
pixels.show();
}
} else {
breakOnUpdate = 1;
key_value = IrReceiver.decodedIRData.decodedRawData;
}
}
pixels.setBrightness(BRIGHTNESS);
pixels.show();
break;
case 0xE817FF00: // Button Strobe
key_value_old = 0xE817FF00;
IrReceiver.resume();
theaterChaseRainbow(50); // Rainbow-enhanced theaterChase variant
break;
case 0xEC13FF00: // Button Smooth
key_value_old = 0xEC13FF00;
// IrReceiver.resume();
rainbow(10); //
break;
case -1935048056:
pixels.clear(); // Set all pixel colors to 'off'
for (int j = 0; j < 256; j++) {
pixels.setPixelColor(j, pixels.Color(0, 150, 0));
}
pixels.show(); // Send the updated pixel colors to the hardware.
break;
}
Serial.print("Key Value am Ende von ledCode: ");
Serial.println(key_value, HEX);
Serial.print("Code Breaker am Ende von ledCode: ");
Serial.println(code_breaker, HEX);
Serial.print("key value old am Ende von ledCode: ");
Serial.println(key_value_old, HEX);
breakOnUpdate = 0;
}
void colorSwitch(uint32_t color) {
for (int i = 0; i < pixels.numPixels(); i++) { // For each pixel in pixels...
pixels.setPixelColor(i, color); // Set pixel's color (in RAM)
}
pixels.show();
}
void theaterChaseRainbow(int wait) {
int firstPixelHue = 0; // First pixel starts at red (hue 0)
while (breakOnUpdate == 0) { // Repeat 30 times...
checkForUpdates();
if (key_value == 0xE817FF00 || key_value == 0xF807FF00 && code_breaker == 0xE817FF00) {
for (int b = 0; b < 3; b++) { // 'b' counts from 0 to 2...
pixels.clear();
// 'c' counts up from 'b' to end of pixels in increments of 3...
for (int c = b; c < pixels.numPixels(); c += 3) {
// hue of pixel 'c' is offset by an amount to make one full
// revolution of the color wheel (range 65536) along the length
// of the pixels (pixels.numPixels() steps):
int hue = firstPixelHue + c * 65536L / pixels.numPixels();
uint32_t color = pixels.gamma32(pixels.ColorHSV(hue)); // hue -> RGB
pixels.setPixelColor(c, color); // Set pixel 'c' to value 'color'
}
pixels.show(); // Update pixels with new contents
delay(wait); // Pause for a moment
firstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames
}
} else {
breakOnUpdate = 1;
}
}
key_value = IrReceiver.decodedIRData.decodedRawData;
}
void rainbow(int wait) {
while (breakOnUpdate == 0) { // Repeat 30 times...
// Hue of first pixel runs 5 complete loops through the color wheel.
// Color wheel has a range of 65536 but it's OK if we roll over, so
// just count from 0 to 5*65536. Adding 256 to firstPixelHue each time
// means we'll make 5*65536/256 = 1280 passes through this loop:
if (key_value == 0xF807FF00) {
key_value = key_value_old;
}
for (long firstPixelHue = 0; firstPixelHue < 5 * 65536; firstPixelHue += 256) {
checkForCodeBreaks();
// Serial.print("Key Value am Start von rainbow: ");
// Serial.println(key_value, HEX);
// Serial.print("Code Breaker am Start von rainbow: ");
// Serial.println(code_breaker, HEX);
// Serial.print("key value old am Start von rainbow: ");
// Serial.println(key_value_old, HEX);
// Serial.print("buttonOn am Start von rainbow: ");
// Serial.println(buttonOn);
if (key_value == 0xEC13FF00 && code_breaker == 0xEC13FF00) {
// pixels.rainbow() can take a single argument (first pixel hue) or
// optionally a few extras: number of rainbow repetitions (default 1),
// saturation and value (brightness) (both 0-255, similar to the
// ColorHSV() function, default 255), and a true/false flag for whether
// to apply gamma correction to provide 'truer' colors (default true).
pixels.rainbow(firstPixelHue);
// Above line is equivalent to:
// pixels.rainbow(firstPixelHue, 1, 255, 255, true);
pixels.show(); // Update pixels with new contents
} else {
breakOnUpdate = 1;
IrReceiver.printIRResultShort(&Serial);
Serial.println(key_value, HEX);
break;
}
}
}
}
Danke für eure Hilfe!