Bonjour tout le monde,
Je me suis lancé récemment dans un projet qui permet l'ouverture d'un coffre grâce à des moteurs d'essuis-glace et piloté par une télécommande. Je veux lui ajouter une bande à leds piloter par l'arduino mais l'ajout du code dans mon programme me pose quelques soucis.
Pour le moment, l'arduino vérifie si un signal de télécommande est transmis. Si c'est le cas, elle active certains relais et recommence à attendre un nouveau signal. J'aimerai qu'elle exécute aussi un bout de programme permettant l'activation de mon ruban led mais la carte doit également vérifier si elle reçoit un signal.
Mes deux programmes ci-dessous (un qui controle l'ouverture du coffre et un qui contrôle les leds) fonctionne correctement séparement et j'aimerais maintenant les combinés. Pouvez-vous m'aider svp ?
Contrôle coffre :
#include <IRremote.h>
const char RECEPTEUR_INFRAROUGE = 2;
boolean play = true;
boolean pause = true;
boolean lampe = false;
unsigned long delais = 0;
const int relais1_2 = 3;
const int relais3 = 4;
const int relais4 = 5;
IRrecv monRecepteurInfraRouge(RECEPTEUR_INFRAROUGE);
decode_results messageRecu;
void setup()
{
pinMode(relais1_2, OUTPUT);
pinMode(relais3, OUTPUT);
pinMode(relais4, OUTPUT);
digitalWrite(relais1_2, HIGH);
digitalWrite(relais3, HIGH);
digitalWrite(relais4, HIGH);
Serial.begin(9600);
monRecepteurInfraRouge.enableIRIn();
monRecepteurInfraRouge.blink13(true);
}
void loop()
{
unsigned long tmppresent = millis();
if(monRecepteurInfraRouge.decode(&messageRecu))
{
Serial.println(messageRecu.value, HEX);
if(messageRecu.value == 0x71) //0x71 et 0x871 proviennent d'un même bouton, il produit un signal ou l'autre
{
pause = !pause;
digitalWrite(relais3, pause);
Serial.println(pause);
}
if(messageRecu.value == 0x871)
{
pause = !pause;
digitalWrite(relais3, pause);
Serial.println(pause);
}
if(messageRecu.value == 0x59) //0x59 et 0x859 proviennent d'un même autre bouton, il produit un signal ou l'autre
{
play =! play;
delais = tmppresent;
lampe = true;
digitalWrite(relais1_2, play);
Serial.println(play);
}
if(messageRecu.value == 0x859)
{
play =! play;
delais = tmppresent;
lampe = true;
digitalWrite(relais1_2, play);
Serial.println(play);
}
delay(2000);
monRecepteurInfraRouge.resume();
}
if(play == false)
{
digitalWrite(relais4, LOW); //si bouton appuyer, alors une lampe s'allume
if((play == false) && (tmppresent-delais > 100000)) //si 100sec écoulées, alors lampe s'éteint
{
digitalWrite(relais4, HIGH);
}
}
if((play == true) && (lampe == true))
{
digitalWrite(relais4, LOW);
if((play == true) && (tmppresent-delais > 35000))
{
digitalWrite(relais4, HIGH);
}
}
delay(5);
}
Ruban led :
#include <Adafruit_NeoPixel.h>
#define PIN 6
// Parameter 1 = number of pixels in strip
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
strip.begin();
strip.show(); // Initialize all pixels to 'off'
}
void loop() {
rainbowCycle(20);
}
// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
uint16_t 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);
}
}
// 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) {
if(WheelPos < 85) {
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
} else if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
} else {
WheelPos -= 170;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
}
Dans l'idée, j'aimerai intégré le "rainbowCycle(20)" comme ceux ci :
if(play == false)
{
digitalWrite(relais4, LOW); //si bouton appuyer, alors une lampe s'allume
rainbowCycle(20);
if((play == false) && (tmppresent-delais > 100000)) //si 100sec écoulées, alors lampe s'éteint
{
digitalWrite(relais4, HIGH);
}
}
if((play == true) && (lampe == true))
{
digitalWrite(relais4, LOW);
if((play == true) && (tmppresent-delais > 35000))
{
digitalWrite(relais4, HIGH);
strip.show();
}
}
Avec bien sûr les "void" qui vont bien après le loop.
Comment puis-je combiner les deux programmes pour allumer les leds et traiter un signal IR en même temps ?
Merci