Go Down

Topic: Multi-tâches (Read 307 times) previous topic - next topic

Esteban8020

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 :
Code: [Select]
#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 :

Code: [Select]
#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 :

Code: [Select]
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

airess

#1
Apr 18, 2019, 06:47 pm Last Edit: Apr 18, 2019, 06:48 pm by airess
Bonjour juste une question pourquoi ne pas partitionnement ton programme?

En gros:

Code: [Select]
void ouverture_coffre ()
{ // ton programme pour l'ouverture porte}

void led()
{ // ton programme pour les led}

void loop()
{ ouverture_coffre ();
 led() ;
}


En gros dans void loop tu mets tout tes programmes qui tourne en boucle simultanément.

J-M-L

En gros dans void loop tu mets tout tes programmes qui tourne en boucle simultanément.
parce que si ouverture_coffre (); ou led() ; est bloquant....
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Esteban8020

Oui c'est ça le truc, il faudrait que le programme "leds" tourne en arrière plan sans bloqué le programme principal qui lit et agit selon les informations reçues de la télécommande. Et c'est ce que je n'arrive pas à faire...

J-M-L

Oui c'est ça le truc, il faudrait que le programme "leds" tourne en arrière plan sans bloqué le programme principal qui lit et agit selon les informations reçues de la télécommande. Et c'est ce que je n'arrive pas à faire...
faut décomposer ce programme "leds" en petit bouts --> découper la boucle for et enlever les delays() pour gérer ça avec millis() et laisser faire 1 action quand c'est le bon moment dans la loop()
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

lesept

#5
Apr 18, 2019, 08:43 pm Last Edit: Apr 18, 2019, 08:47 pm by lesept
Si tu lis l'anglais, il y a un bon tuto pour faire ce genre de chose tout en haut du forum "programming questions" (Message épinglé)

Edit : c'est mon jour de bonté, je t'ai ajouté le lien. Tu verras que c'est pas simple et que tu as intérêt à refaire un nouveau code articulé autour de ton besoin de multi tâches
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

J-M-L

#6
Apr 18, 2019, 10:41 pm Last Edit: Apr 18, 2019, 10:43 pm by J-M-L
Il n'y a pas de multi-tâche - Les actions sont exécutées les une après les autres mais très rapidement - C'est au programmeur Que revient la tâche d'organiser Le séquencement.
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up