Buonasera a tutti,
Mi chiamo Francesco e sono un autodidatta di Arduino (di mestiere sono un chimico), mi diletto ogni tanto con i miei arduino a realizzare piccoli progetti semplici. In questi mesi ho lavorato ad un sistema di led con telecomando IR per illuminare un diorama Lego. Dopo mesi di errori e sbattimenti sono riuscito a completare il codice ma ho incontrato un problema al di là delle mie conoscenze.
Nello scenario sono collegati numerosi led e ad ogni gruppo di led legato ad una funzione specifica (es: lampadari soffitto) ho assegnato un tasto del telecomando IR e fin qui tutto bene
E' presente anche una striscia RGB (anodica perchè il 4o pin va alimentato non va a massa???) che viene accesa di rosso con un pulsante, di blu con un altro e invece fa effetto fade con il terzo pulsante.
Il problema è questo, funziona tutto a meraviglia finchè non premo il pulsante dell'effetto fade: l'effetto fade si verifica ma manda in blocco tutto il resto, gli altri led che sono accesi non rispondono più al comando accensione/spegnimento e la stessa striscia rimane bloccata sul un colore.
Allego il codice ed un piccolo video per chiarezza.
Più che risolvere il problema sarei interessato a capire cosa si fa in questi casi? Come si riesce ad individuare il problema?
Grazie!!!
https://www.facebook.com/reel/658126203025868
#include <Adafruit_NeoPixel.h>
#include <IRremote.h>
#define timer 1000
#define num_pins 12
#define GREEN 10
#define BLUE 9
#define RED 8
#define delayTime 20
byte ledPinSX[] = {40, 41, 42, 43, 44, 45};
byte ledPinDX[] = {48, 49, 50, 51, 52, 53};
byte ledDelay = 1500;
byte direzioneSX = 1;
byte actualLedSX = 0;
byte direzioneDX = 1;
byte actualLedDX = 0;
byte lamp[] = {34, 35, 36};
unsigned long timeOccured;
IRrecv irrecv(22);
decode_results res;
void translateIR() { // describing Remote IR codes
switch(res.value) {
case 0xFFA25D: Serial.println("POWER"); break;
case 0xFFE21D: Serial.println("FUNC/STOP"); break;
case 0xFF629D: Serial.println("VOL+"); break;
case 0xFF22DD: Serial.println("FAST BACK"); break;
case 0xFF02FD: Serial.println("PAUSE"); break;
case 0xFFC23D: Serial.println("FAST FORWARD"); break;
case 0xFFE01F: Serial.println("DOWN"); break;
case 0xFFA857: Serial.println("VOL-"); break;
case 0xFF906F: Serial.println("UP"); break;
case 0xFF9867: Serial.println("EQ"); break;
case 0xFFB04F: Serial.println("ST/REPT"); break;
case 0xFF6897: Serial.println("0"); break;
case 0xFF30CF: Serial.println("1"); break;
case 0xFF18E7: Serial.println("2"); break;
case 0xFF7A85: Serial.println("3"); break;
case 0xFF10EF: Serial.println("4"); break;
case 0xFF38C7: Serial.println("5"); break;
case 0xFF5AA5: Serial.println("6"); break;
case 0xFF42BD: Serial.println("7"); break;
case 0xFF4AB5: Serial.println("8"); break;
case 0xFF52AD: Serial.println("9"); break;
case 0xFFFFFFFF: Serial.println(" REPEAT");break;
default: Serial.println(" other button ");
}// End Case
delay(500); // Do not get immediate repeat
} //END translateIR
void setup()
{
Serial.begin(9600);
Serial.println("IR Receiver Button Decode");
irrecv.enableIRIn();
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(27, OUTPUT);
pinMode(28, OUTPUT);
pinMode(29, OUTPUT);
pinMode(36, OUTPUT); //lamps 1-2
pinMode(37, OUTPUT); //lamps 3-4
pinMode(38, OUTPUT); //lamps 4-6
pinMode(46, OUTPUT); //light repeater blaster
pinMode(47, OUTPUT); //high repeater blaster
for (byte x=0; x<3; x++){
pinMode(lamp[x], OUTPUT);
}
for (byte x=0; x<6; x++){
pinMode(ledPinSX[x], OUTPUT);
pinMode(ledPinDX[x], OUTPUT);
timeOccured = millis();
}
}
void loop()
{
if (irrecv.decode(&res)) // have we received an IR signal?
{
translateIR();
Serial.println(res.value, HEX); // display it on serial monitor in hexadecimal
irrecv.resume();// receive the next value
delay(500);
}
if (res.value == 0xFF30CF){ //button 1 lamp led ON
for (byte x=0; x<3; x++) {
digitalWrite(lamp[x], HIGH);
}
}
if (res.value == 0xFF7A85){ //button 3 airstrip ON
for (byte x=0; x<6; x++) {
digitalWrite(ledPinSX[x], HIGH);
digitalWrite(ledPinDX[x], HIGH);
}
}
if (res.value == 0xFF10EF){ //button 4 machine guns
digitalWrite(46, HIGH);
digitalWrite(47, HIGH);
}
if (res.value == 0xFF38C7){ //button 5 blue MF engine
digitalWrite(11, HIGH);
digitalWrite(8, 255); //red
digitalWrite(9, 0); //green
digitalWrite(10, 0); //blue
}
if (res.value == 0xFF5AA5){ //button 6 red MF engine
digitalWrite(11, HIGH);
digitalWrite(8, 0); //red
digitalWrite(9, 255); //green
digitalWrite(10, 255); //blue
}
if (res.value == 0xFF4AB5){ //button 8 MF leds
digitalWrite(28, HIGH);
digitalWrite(29, HIGH);
}
if (res.value == 0xFF52AD){ //button 9 kiber cage
digitalWrite(27, HIGH);
}
if (res.value == 0xFF42BD){ //button 7 fade MF engine
digitalWrite(11, HIGH);
int redVal = 255;
int blueVal = 0;
int greenVal = 0;
for( int i = 0 ; i < 255 ; i += 1 ){
greenVal += 1;
redVal -= 1;
analogWrite( GREEN, 255 - greenVal );
analogWrite( RED, 255 - redVal );
delay( delayTime );
}
redVal = 0;
blueVal = 0;
greenVal = 255;
for( int i = 0 ; i < 255 ; i += 1 ){
blueVal += 1;
greenVal -= 1;
analogWrite( BLUE, 255 - blueVal );
analogWrite( GREEN, 255 - greenVal );
delay( delayTime );
}
redVal = 0;
blueVal = 255;
greenVal = 0;
for( int i = 0 ; i < 255 ; i += 1 ){
redVal += 1;
blueVal -= 1;
analogWrite( RED, 255 - redVal );
analogWrite( BLUE, 255 - blueVal );
delay( delayTime );
}
}
if (res.value == 0xFF6897){ //button 0 all leds OFF
digitalWrite(27, LOW);
digitalWrite(28, LOW);
digitalWrite(29, LOW);
digitalWrite(46, LOW);
digitalWrite(47, LOW);
digitalWrite(11, LOW);
for (byte x=0; x<3; x++) {
digitalWrite(lamp[x], LOW);
}
for (byte x=0; x<6; x++) {
digitalWrite(ledPinSX[x], LOW);
digitalWrite(ledPinDX[x], LOW);
}
} //end button 0
if (res.value == 0xFF18E7 && (millis() - timeOccured) > ledDelay){ //button 2 fade airstrip
cambiaStatoLed();
timeOccured = millis();
}
}
void cambiaStatoLed(){
for (byte x=0; x<6; x++) {
digitalWrite(ledPinSX[x], LOW);
digitalWrite(ledPinDX[x], LOW);
}
digitalWrite(ledPinSX[actualLedSX], HIGH);
actualLedSX += direzioneSX;
if (actualLedSX == 5) {
direzioneSX = -1;
}
if (actualLedSX == 0) {
direzioneSX = 1;
}
digitalWrite(ledPinDX[actualLedDX], HIGH);
actualLedDX += direzioneDX;
if (actualLedDX == 5) {
direzioneDX = -1;
}
if (actualLedDX == 0) {
direzioneDX = 1;
}
}