Problème Arduino

Bonjour ,

je viens de commencer le développement Arduino j’ai quelque petits problème avec la syntaxe du langage C je viens voir si quelqu’un peut m’aider pour débuter j’ai fais un petit programme avec une télécommande infrarouge et des leds la télécommande infrarouge sert a changer différents modes d’éclairage et a l’éteindre mais j’ai un petit problème une fois qu’un mode est actif impossible de changer de mode ou bien de l’éteindre je sais que c’est a cause du bloc que l’on joue en boucle mais je ne sais pas comment y remédier je vous met mon code en bas merci pour votre aide et vos conseils.

#include <IRremote.h>

const char DIN_RECEPTEUR_INFRAROUGE = 2;
const int LED1 = 3;
const int LED2 = 4;
const int LED3 = 5;
const int LED4 = 6;
const int LED5 = 7;
const int LED6 = 8;
const int LED7 = 9;


IRrecv monRecepteurInfraRouge (DIN_RECEPTEUR_INFRAROUGE);

decode_results messageRecu;

void setup()
{
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED5, OUTPUT);
  pinMode(LED6, OUTPUT);
  pinMode(LED7, OUTPUT);
  Serial.begin(9600);
  monRecepteurInfraRouge.enableIRIn();
  monRecepteurInfraRouge.blink13(true);
}

void loop()
{
  if (monRecepteurInfraRouge.decode(&messageRecu))
  {
    Serial.println(messageRecu.value, HEX);
    if (messageRecu.value == 0xFF30CF){
      digitalWrite(LED1, HIGH);
      delay(100);
      digitalWrite(LED2, HIGH);
      delay(100);
      digitalWrite(LED3, HIGH);
      delay(100);
      digitalWrite(LED4, HIGH);
      delay(100);
      digitalWrite(LED5, HIGH);
      delay(100);
      digitalWrite(LED6, HIGH);
      delay(100);
      digitalWrite(LED7, HIGH);
      delay(100);
      digitalWrite(LED1, LOW);
      delay(100);
      digitalWrite(LED2, LOW);
      delay(100);
      digitalWrite(LED3, LOW);
      delay(100);
      digitalWrite(LED4, LOW);
      delay(100);
      digitalWrite(LED5, LOW);
      delay(100);
      digitalWrite(LED6, LOW);
      delay(100);
      digitalWrite(LED7, LOW);
      delay(100);
      return;
    }

    if (messageRecu.value == 0xFF18E7){
      digitalWrite(LED1, HIGH);
      digitalWrite(LED3, HIGH);
      digitalWrite(LED5, HIGH);
      digitalWrite(LED7, HIGH);
      digitalWrite(LED2, LOW);
      digitalWrite(LED4, LOW);
      digitalWrite(LED6, LOW);
      delay(500);
      digitalWrite(LED1, LOW);
      digitalWrite(LED3, LOW);
      digitalWrite(LED5, LOW);
      digitalWrite(LED7, LOW);
      digitalWrite(LED2, HIGH);
      digitalWrite(LED4, HIGH);
      digitalWrite(LED6, HIGH);
      delay(500);
      return;
    }

    if (messageRecu.value == 0xFF7A85){
      digitalWrite(LED1, LOW);
      digitalWrite(LED2, LOW);
      digitalWrite(LED3, LOW);
      digitalWrite(LED4, LOW);
      digitalWrite(LED5, LOW);
      digitalWrite(LED6, LOW);
      digitalWrite(LED7, LOW);
      return;
    }

    monRecepteurInfraRouge.resume();
  }

}

Bonjour,

Il ne faut pas utiliser de delay(). Il faut mémoriser le mode sur réception du message de la télécommande et ensuite faire un traitement suivant le mode en implémentant un mini automate d'état (voir le tuto de J-M-L)

Je vais voir ça merci beaucoup

Par rapport au tuto de J-M-L, c'est beaucoup plus simple car il n'y a que le temps qui intervient dans le traitement des différents modes. Si tu as besoin de plus de renseignements, n'hésites pas.

J’ai encore un problème j’ai fait tout ce qu’il fallait j’ai un peu mieux compris comment ça marche , je constate de l’amélioration mais j’ai encore un problème par exemple ma chenille est sensée continuer et dés que je ré-appuies sur le bouton le mode doit changer mais la chenille ce fait qu’un fois et je ne peux pas l’interrompre. Merci de votre aide ;

#include <IRremote.h>

const char DIN_RECEPTEUR_INFRAROUGE = 2;
const int LED1 = 3;
const int LED2 = 4;
const int LED3 = 5;
const int LED4 = 6;
const int LED5 = 7;
const int LED6 = 8;
const int LED7 = 9;

enum {REPOS, ETAT_CHENILLE, ETAT_CLIGNOTE} etatLed;


IRrecv monRecepteurInfraRouge (DIN_RECEPTEUR_INFRAROUGE);

decode_results messageRecu;

void mettreAuRepos()
{
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, LOW);
  digitalWrite(LED5, LOW);
  digitalWrite(LED6, LOW);
  digitalWrite(LED7, LOW);
  etatLed = REPOS;
}

void setup()
{
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED5, OUTPUT);
  pinMode(LED6, OUTPUT);
  pinMode(LED7, OUTPUT);
  Serial.begin(9600);
  monRecepteurInfraRouge.enableIRIn();
  monRecepteurInfraRouge.blink13(true);
  mettreAuRepos();
}

void loop()
{
  if (monRecepteurInfraRouge.decode(&messageRecu))
  {
    Serial.println(messageRecu.value, HEX);
    if (messageRecu.value == 0xFF30CF) {
      switch (etatLed) {
        case REPOS:
          digitalWrite(LED1, HIGH);
          delay(100);
          digitalWrite(LED2, HIGH);
          delay(100);
          digitalWrite(LED3, HIGH);
          delay(100);
          digitalWrite(LED4, HIGH);
          delay(100);
          digitalWrite(LED5, HIGH);
          delay(100);
          digitalWrite(LED6, HIGH);
          delay(100);
          digitalWrite(LED7, HIGH);
          delay(100);
          digitalWrite(LED1, LOW);
          delay(100);
          digitalWrite(LED2, LOW);
          delay(100);
          digitalWrite(LED3, LOW);
          delay(100);
          digitalWrite(LED4, LOW);
          delay(100);
          digitalWrite(LED5, LOW);
          delay(100);
          digitalWrite(LED6, LOW);
          delay(100);
          digitalWrite(LED7, LOW);
          delay(100);
          etatLed = ETAT_CHENILLE;
          break;

        case ETAT_CHENILLE:
          digitalWrite(LED1, HIGH);
          digitalWrite(LED3, HIGH);
          digitalWrite(LED5, HIGH);
          digitalWrite(LED7, HIGH);
          digitalWrite(LED2, LOW);
          digitalWrite(LED4, LOW);
          digitalWrite(LED6, LOW);
          delay(500);
          digitalWrite(LED1, LOW);
          digitalWrite(LED3, LOW);
          digitalWrite(LED5, LOW);
          digitalWrite(LED7, LOW);
          digitalWrite(LED2, HIGH);
          digitalWrite(LED4, HIGH);
          digitalWrite(LED6, HIGH);
          delay(500);
          etatLed = ETAT_CLIGNOTE;
          break;

        case ETAT_CLIGNOTE:
          mettreAuRepos();
          break;
      }

    }

    monRecepteurInfraRouge.resume();
  }

}

Oui, mais là tu traites toujours les clignotements des leds dans la réception des touches.
Il faut séparer les deux et ne pas utiliser de delay() comme ceci par exemple:

#include <IRremote.h>

const char DIN_RECEPTEUR_INFRAROUGE = 2;
const int LED1 = 3;
const int LED2 = 4;
const int LED3 = 5;
const int LED4 = 6;
const int LED5 = 7;
const int LED6 = 8;
const int LED7 = 9;


IRrecv monRecepteurInfraRouge (DIN_RECEPTEUR_INFRAROUGE);

decode_results messageRecu;

void setup()
{
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED5, OUTPUT);
  pinMode(LED6, OUTPUT);
  pinMode(LED7, OUTPUT);
  Serial.begin(9600);
  monRecepteurInfraRouge.enableIRIn();
  monRecepteurInfraRouge.blink13(true);
}

void loop()
{
  static unsigned long tempsDebut;
  static byte mode = 0;
  if (monRecepteurInfraRouge.decode(&messageRecu))
  {
    Serial.println(messageRecu.value, HEX);
    tempsDebut = millis();
    if (messageRecu.value == 0xFF30CF) {
      mode = 1;
    }

    if (messageRecu.value == 0xFF18E7) {
      mode = 2;
    }

    if (messageRecu.value == 0xFF7A85) {
      mode = 0;
    }

    monRecepteurInfraRouge.resume();
  }

  switch (mode)
  {
    case 0:
      digitalWrite(LED1, LOW);
      digitalWrite(LED2, LOW);
      digitalWrite(LED3, LOW);
      digitalWrite(LED4, LOW);
      digitalWrite(LED5, LOW);
      digitalWrite(LED6, LOW);
      digitalWrite(LED7, LOW);
      break;

    case 1:
      if (millis() - tempsDebut < 100)
        digitalWrite(LED1, HIGH);
      else if (millis() - tempsDebut < 200)
        digitalWrite(LED2, HIGH);
      else if (millis() - tempsDebut < 300)
        digitalWrite(LED3, HIGH);
      else if (millis() - tempsDebut < 400)
        digitalWrite(LED4, HIGH);
      else if (millis() - tempsDebut < 500)
        digitalWrite(LED5, HIGH);
      else if (millis() - tempsDebut < 600)
        digitalWrite(LED6, HIGH);
      else if (millis() - tempsDebut < 700)
        digitalWrite(LED7, HIGH);
      else if (millis() - tempsDebut < 800)
        digitalWrite(LED1, LOW);
      else if (millis() - tempsDebut < 900)
        digitalWrite(LED2, LOW);
      else if (millis() - tempsDebut < 1000)
        digitalWrite(LED3, LOW);
      else if (millis() - tempsDebut < 1100)
        digitalWrite(LED4, LOW);
      else if (millis() - tempsDebut < 1200)
        digitalWrite(LED5, LOW);
      else if (millis() - tempsDebut < 1300)
        digitalWrite(LED6, LOW);
      else if (millis() - tempsDebut < 1400)
        digitalWrite(LED7, LOW);
      else
        tempsDebut = millis();
      break;

    case 2:
      if (millis() - tempsDebut < 500)
      {
        digitalWrite(LED1, HIGH);
        digitalWrite(LED3, HIGH);
        digitalWrite(LED5, HIGH);
        digitalWrite(LED7, HIGH);
        digitalWrite(LED2, LOW);
        digitalWrite(LED4, LOW);
        digitalWrite(LED6, LOW);
      }
      else if (millis() - tempsDebut < 1000)
      {
        digitalWrite(LED1, LOW);
        digitalWrite(LED3, LOW);
        digitalWrite(LED5, LOW);
        digitalWrite(LED7, LOW);
        digitalWrite(LED2, HIGH);
        digitalWrite(LED4, HIGH);
        digitalWrite(LED6, HIGH);
      }
      else
        tempsDebut = millis();
      break;
  }

}

edit: J’ai utilisé un byte pour le mode, mais sémantiquement c’est mieux d’utiliser un enum comme tu l’as fait.

AHHH tes un génie je n'avais pas compris maintenant que tu me montre je comprend beaucoup mieux merci beaucoup tu me sauve