Bonjour à tous,
je réalise un petit projet pour amuser mon filleul et aussi pour m'amuser
J'aime bien les défis donc, je débute avec Arduino
mais je comprends plus ou moins ce que je fais malgré un parcours plutôt autodidacte. Je repars de différents bouts de codes que j'ai adapté.
Le projet : Eclairage d'un meuble à l'aide de 9 LED RGB contrôlées par télécommande IR.
Le programme
#include <IRremote.hpp>
#define RED 9
#define BLUE 10
#define GREEN 11
int IR_RECEIVE_PIN = 3; // Réception signal IR
int redValue = 255;
int greenValue = 255;
int blueValue = 255;
boolean x = 0;
void setup() // Initialisation
{
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(BLUE, OUTPUT);
//séquence d'intialisation
analogWrite(RED, 0);
analogWrite(GREEN, 255);
analogWrite(BLUE, 255);
delay(500);
analogWrite(RED, 255);
analogWrite(GREEN, 0);
analogWrite(BLUE, 255);
delay(500);
analogWrite(RED, 255);
analogWrite(GREEN, 255);
analogWrite(BLUE, 0);
delay(500);
Serial.begin(9600);
Serial.println("IR Receiver Button Decode");
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); //Initialisation réception IR
} /*--(end setup )---*/
void loop() /*----( LOOP: RUNS CONSTANTLY )----*/
{
if (IrReceiver.decode()) // have we received an IR signal?
{
translateIR();
IrReceiver.resume(); // receive the next value
}
} /* --(end main loop )-- */
/*-----( Fonction )-----*/
void translateIR() // Actions en fonction du code IR reçu
{
switch (IrReceiver.decodedIRData.decodedRawData) //lecture du code
{
case 0xBA45FF00: // POWER
Serial.println("POWER");
analogWrite(RED, 255);
analogWrite(GREEN, 255);
analogWrite(BLUE, 255);
break;
case 0xB847FF00:
Serial.println("FUNC/STOP");
/*int i = 0;
while (i < 10) {
i += 1;*/
clignote();
//}
break;
case 0xB946FF00: Serial.println("VOL+"); break;
case 0xBB44FF00: Serial.println("FAST BACK"); break;
case 0xBF40FF00:
Serial.println("PLAY/PAUSE");
x = 0;
do {
loopRGB();
Serial.println("loopRGB en cours");
if (IrReceiver.decode()) // have we received an IR signal?
{
IrReceiver.resume(); // receive the next value
}
IrReceiver.printIRResultShort(&Serial);
if (IrReceiver.decodedIRData.decodedRawData != 0xBF40FF00) { // Vérification du code IR reçu, différent de Play/pause ?
x = true;
Serial.println("Je suis dans le if");
}
} while (x == false);
Serial.println("Sortie du do while");
break;
case 0xBC43FF00:
Serial.println("FAST FORWARD");
analogWrite(RED, random(256));
analogWrite(GREEN, random(256));
analogWrite(BLUE, random(256));
break;
case 0xF807FF00:
Serial.println("DOWN");
break;
case 0xEA15FF00: Serial.println("VOL-"); break;
case 0xF609FF00: Serial.println("UP"); break;
case 0xE619FF00: Serial.println("EQ"); break;
case 0xF20DFF00: Serial.println("ST/REPT"); break;
case 0xE916FF00:
Serial.println("0");
analogWrite(RED, 0);
analogWrite(GREEN, 0);
analogWrite(BLUE, 0);
break;
case 0xF30CFF00: //1
Serial.println("1");
analogWrite(RED, 255);
analogWrite(GREEN, 255);
analogWrite(BLUE, 0);
break;
case 0xE718FF00:
Serial.println("2");
analogWrite(RED, 0);
analogWrite(GREEN, 255);
analogWrite(BLUE, 255);
break;
case 0xA15EFF00:
Serial.println("3");
analogWrite(RED, 255);
analogWrite(GREEN, 0);
analogWrite(BLUE, 255);
break;
case 0xF708FF00:
Serial.println("4");
analogWrite(RED, 255);
analogWrite(GREEN, 0);
analogWrite(BLUE, 0);
break;
case 0xE31CFF00:
Serial.println("5");
analogWrite(RED, 0);
analogWrite(GREEN, 255);
analogWrite(BLUE, 0);
break;
case 0xA55AFF00:
Serial.println("6");
analogWrite(RED, 0);
analogWrite(GREEN, 0);
analogWrite(BLUE, 255);
break;
case 0xBD42FF00:
Serial.println("7");
analogWrite(RED, 127);
analogWrite(GREEN, 255);
analogWrite(BLUE, 127);
break;
case 0xAD52FF00:
Serial.println("8");
analogWrite(RED, 127);
analogWrite(GREEN, 127);
analogWrite(BLUE, 255);
break;
case 0xB54AFF00:
Serial.println("9");
analogWrite(RED, 255);
analogWrite(GREEN, 127);
analogWrite(BLUE, 127);
break;
case 0xFFFFFFFF: Serial.println("REPEAT"); break;
default:
Serial.println(" other button ");
//Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
//IrReceiver.printIRResultShort(&Serial);
} // End Case
delay(500); // Do not get immediate repeat
} //END translateIR
void loopRGB() {
#define delayTime 5 // fading time between colors
redValue = 255; // choose a value between 1 and 255 to change the color.
greenValue = 0;
blueValue = 255;
for (int i = 0; i < 255; i += 1) // fades out red bring green full when i=255
{
redValue -= 1;
greenValue += 1;
// The following was reversed, counting in the wrong directions
// analogWrite(RED, 255 - redValue);
//analogWrite(GREEN, 255 - greenValue);
analogWrite(RED, redValue);
analogWrite(GREEN, greenValue);
delay(delayTime);
}
redValue = 0;
greenValue = 255;
blueValue = 255;
for (int i = 0; i < 255; i += 1) // fades out green bring blue full when i=255
{
greenValue -= 1;
blueValue += 1;
// The following was reversed, counting in the wrong directions
//analogWrite(GREEN, 255 - greenValue);
//analogWrite(BLUE, 255 - blueValue);
analogWrite(GREEN, greenValue);
analogWrite(BLUE, blueValue);
delay(delayTime);
}
redValue = 0;
greenValue = 0;
blueValue = 255;
for (int i = 0; i < 255; i += 1) // fades out blue bring red full when i=255
{
// The following code has been rearranged to match the other two similar sections
blueValue -= 1;
redValue += 1;
// The following was reversed, counting in the wrong directions
// analogWrite(BLUE, 255 - blueValue);
// analogWrite(RED, 255 - redValue);
analogWrite(BLUE, blueValue);
analogWrite(RED, redValue);
delay(delayTime);
}
}
void clignote() { // on est d'accord, en l'état ça ne clignote pas encore :D
analogWrite(RED, random(256);
analogWrite(GREEN, random(256);
analogWrite(BLUE, random(256);
}
}
Ce qui fonctionne :
- J'ai passé le problème des calculs de résistances et tout s'allume correctement.
- Je peux récupérer les valeurs de la télécommande et "voyager" dans un switch case
- Je peux appeler une fonction loopRGB() pour faire varier la couleur des LED en continu (c'est beauuuu
) - Je peux générer une valeur aléatoire pour le choix des couleurs via RANDOM()
Ce qui pose problème
- La fonction loopRGB() se lance bien, mais je n'arrive pas à continuer le programme une fois sorti de la fonction. J'ai essayé de n'appeler que la fonction sans succès. J'ai tenté un do while, j'arrive à en sortir mais le programme se bloque ensuite, il semble qu'il n'arrive plus à lire les valeurs de la télécommande. En tous cas, rien ne s'affiche en sortie.
Bout de code concerné :
case 0xBF40FF00:
Serial.println("PLAY/PAUSE");
x = 0;
do {
loopRGB();
Serial.println("loopRGB en cours");
if (IrReceiver.decode()) // have we received an IR signal?
{
IrReceiver.resume(); // receive the next value
}
IrReceiver.printIRResultShort(&Serial);
if (IrReceiver.decodedIRData.decodedRawData != 0xBF40FF00) { // Vérification du code IR reçu, différent de Play/pause ?
x = true;
Serial.println("Je suis dans le if");
}
} while (x == false);
Serial.println("Sortie du do while");
break;
2ème problème : lorsque j'appuie plusieurs fois sur le bouton pour changer de couleur, tout se bloque et je dois redémarrer l'arduino. Je ne sais pas trop où ça peut coincer.
Bout de code concerné :
case 0xBC43FF00:
Serial.println("FAST FORWARD");
analogWrite(RED, random(256));
analogWrite(GREEN, random(256));
analogWrite(BLUE, random(256));
break;
Si vous avez quelque pistes, je suis preneur car là je ne sais plus quoi tester ou vers quelle ressource me tourner ![]()
Merci d'avance.

