Feu tricolore et télécommande

bonjour je suis educateur dans un club et j'aimerais bien fair un feu tricolore qui indique la position du du chien assi debout couché je galère un peu j'ai un elego uno avec tinkercad j'ai réussi a faire fonctionné mes 6 led a 4 s d'intervalle avec un lancement de la télécommande ces déjà superbe je ces pas si cest possible d'avoir deux programme programme 1 j'appuie sur le 1 et j' ai 2 led a 4secondes programme 2 j'appuie sur le 2 et j'ai 4 led a 4 seconde d'intervalle et j'appuie sur le 3 et j'ai 6 led a 4 secondes d'intervalle

merci a vous

Bonsoir patglaz

Il faut mettre ton projet Tinkercad publique afin que je puisse y accéder, et fournir le lien.

Cordialement
jpbbricole

j'essaye de faire ça

merci

Bonjour patglaz

Comme ceci, je ne peux pas accéder à ton code. Il faut rendre ta simulation publique ou tu mets ton code en ligne sur le forum, entre les balises.

Cordialement
jpbbricole

Bonjour patglaz

Pour faire ça, tu cliques sur ton projet puis,
image
image
image
image
image
puis
image
et coller (ctrl V) le lien dans un post.

A+
Cordialement
jpbbricole

voila je voulais faire j'appuis sur le 0 j'ai 2 led a 4 secondes ou j'appuis sur 3 et j'ais 6 led a 4 secondes mon code

NDLM: code enlevé

Bonjour patglaz

Ton code est mal introduit dans ton message.
Corriges en cliquant les balises
image

et en collant ton code à cet endroit
image
`
Ou mets
image
au début de ton code et
image
à la fin.

A+
Cordialement
jpbbricole

ça compile ?

//
int ir_remote = 0;

int counter;

int counter2;

void setup()
{
pinMode(2, INPUT);
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);
pinMode(4, OUTPUT);
}

void loop()
{
ir remote = 3;
for (counter = 0; counter < 1; ++counter) {
if (digitalRead(2) == 3) {
digitalWrite(9, HIGH);
delay(4000); // Wait for 4000 millisecond(s)
digitalWrite(9, LOW);
digitalWrite(8, HIGH);
delay(4000); // Wait for 4000 millisecond(s)
digitalWrite(8, LOW);
digitalWrite(7, HIGH);
delay(4000); // Wait for 4000 millisecond(s)
digitalWrite(7, LOW);
digitalWrite(6, HIGH);
delay(4000); // Wait for 4000 millisecond(s)
digitalWrite(6, LOW);
digitalWrite(5, HIGH);
delay(4000); // Wait for 4000 millisecond(s)
digitalWrite(5, LOW);
digitalWrite(4, HIGH);
delay(4000); // Wait for 4000 millisecond(s)
digitalWrite(4, LOW);
}
}

ir remote = 0;
for (counter2 = 0; counter2 < 1; ++counter2) {
if (digitalRead(2) == 0) {
digitalWrite(9, HIGH);
delay(4000); // Wait for 4000 millisecond(s)
digitalWrite(9, LOW);
digitalWrite(8, HIGH);
delay(4000); // Wait for 4000 millisecond(s)
digitalWrite(8, LOW);

}
}

que j'appuie sur le 3 ou le 0 de la télécommande il y a le cycle de 2 led qui fonctionne

le code est toujours mal posté et pas indenté

c'est supposé faire quoi ce truc ??

Testez ce code dans le simulateur wokwi


pour mémoire, le code en question

#include <IRremote.hpp>

enum : uint16_t {
  onoff  = 0x00A2,                        menu    = 0x00E2,
  test   = 0x0022,    plus  = 0x0002,     entree  = 0x00C2,
  retrap = 0x00E0,    joue  = 0x00A8,     avrap   = 0x0090,
  zero   = 0x0068,    moins = 0x0098,     efface  = 0x00B0,
  un     = 0x0030,    deux  = 0x0018,     trois   = 0x007A,
  quatre = 0x0010,    cinq  = 0x0038,     six     = 0x005A,
  sept   = 0x0042,    huit  = 0x004A,     neuf    = 0x0052,
};

enum : uint8_t {AUCUN, PGM1, PGM2} mode = AUCUN;

void pgm1() {
  static const uint32_t periode = 1000;
  static uint32_t chrono = -periode;
  if (millis() - chrono >= periode) {
    Serial.println(F("\tune étape dans PGM1"));
    chrono = millis();
  }
}

void pgm2() {
  static const uint32_t periode = 500;
  static uint32_t chrono = -periode;
  if (millis() - chrono >= periode) {
    Serial.println(F("\tune étape dans PGM2"));
    chrono = millis();
  }
}

void setup() {
  IrReceiver.begin(2, false);
  Serial.begin(115200);
}

void loop() {
  if (IrReceiver.decode()) {
    switch (IrReceiver.decodedIRData.command) {
      case onoff:   Serial.println(F("onoff"));   break;
      case menu:    Serial.println(F("menu"));    break;
      case test:    Serial.println(F("test"));    break;
      case plus:    Serial.println(F("plus"));    break;
      case entree:  Serial.println(F("entree"));  break;
      case retrap:  Serial.println(F("retrap"));  break;
      case joue:    Serial.println(F("joue"));    break;
      case avrap:   Serial.println(F("avrap"));   break;
      case zero:    Serial.println(F("zero"));    break;
      case moins:   Serial.println(F("moins"));   break;
      case efface:  Serial.println(F("efface"));  mode = AUCUN; break;
      case un:      Serial.println(F("un"));      mode = PGM1;  break;
      case deux:    Serial.println(F("deux"));    mode = PGM2;  break;
      case trois:   Serial.println(F("trois"));   break;
      case quatre:  Serial.println(F("quatre"));  break;
      case cinq:    Serial.println(F("cinq"));    break;
      case six:     Serial.println(F("six"));     break;
      case sept:    Serial.println(F("sept"));    break;
      case huit:    Serial.println(F("huit"));    break;
      case neuf:  Serial.println(F("neuf"));      break;
    }
    IrReceiver.resume();
  }

  switch (mode) {
    case AUCUN:         break;
    case PGM1: pgm1();  break;
    case PGM2: pgm2();  break;
  }
}


Bonjour je n'arrive pas
ce que je veux faire c'est

j'appuie sur le 0 de ma télécommande et la led 1 s'allume puis 4 secondes plus tard la led 2
ou
j'appuie sur le 1 de ma télécommande et la led 1 s'allume 4 secondes plus tard la led 2 puis 4 secondes la 3 et 4 secondes la 4
ou
j'appuie sur le 2 identique au 1
ou
j'appuie sur le 3 de ma télécommande
et la led 1s'allume puis 4 secondes la led 2 puis 4 secondes la led 3 puis 4 secondes la led 4 puis 4 secondes led 5 et 4 secondes led 6

Merci

c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

y a t'il quelqu'un qui pourrait me faire ce code

vous pouvez nous en dire un peu plus sur le besoin ?
(et quand les LEDs doivent s'éteindre etc... l'expression des besoins est incomplète)

voilà une tentative

#include <IRremote.hpp>

enum : uint16_t {
  onoff  = 0x00A2,                        menu    = 0x00E2,
  test   = 0x0022,    plus  = 0x0002,     entree  = 0x00C2,
  retrap = 0x00E0,    joue  = 0x00A8,     avrap   = 0x0090,
  zero   = 0x0068,    moins = 0x0098,     efface  = 0x00B0,
  un     = 0x0030,    deux  = 0x0018,     trois   = 0x007A,
  quatre = 0x0010,    cinq  = 0x0038,     six     = 0x005A,
  sept   = 0x0042,    huit  = 0x004A,     neuf    = 0x0052,
};

const byte ledPins[] = {4, 6, 8, 10};
const byte maxEtapes = sizeof ledPins / sizeof * ledPins;

enum {REPOS, ACTION} etat = REPOS;

struct Sequence {
  const byte nombreEtapes;
  const unsigned long dureeEntreEtapes[maxEtapes];
  const unsigned long attenteAvantExtinction;
};
byte sequenceEnCours;
byte etapeEnCours;
unsigned long debut;

Sequence lesSequences[] {
  {2, {0, 4000, 0,    0}, 2000},  // attente 0s, Led 1, attente 4s, Led 2, attente finale 2s, extinction
  {3, {0, 4000, 500, 0}, 5000},  // attente 0s, Led 1, attente 4s, Led 2, attente 0.5s, Led 3, attente finale 5s, extinction
  {4, {0, 4000, 4000, 0}, 2000},  // attente 0s, Led 1, attente 4s, Led 2, attente 4s, Led 3, attente 0s, Led 4, attente finale 2s, extinction
};
const byte nbSequences = sizeof lesSequences / sizeof * lesSequences;


void toutEteindre() {
  for (byte p : ledPins) digitalWrite(p, LOW);
}

void eteindre(const byte indiceLed) {
  digitalWrite(ledPins[indiceLed], LOW);
}

void allumer(const byte indiceLed) {
  digitalWrite(ledPins[indiceLed], HIGH);
}

void choisirSequence(const byte indiceSequence) {
  if (indiceSequence >= nbSequences) return;
  toutEteindre();
  sequenceEnCours = indiceSequence;
  etapeEnCours = 0;
  debut = millis();
  etat = ACTION;
}

void setup() {
  for (byte p : ledPins) pinMode(p, OUTPUT);
  IrReceiver.begin(2, false);
  Serial.begin(115200);
}

void loop() {
  if (IrReceiver.decode()) {
    switch (IrReceiver.decodedIRData.command) {
      case un:      Serial.println(F("un"));    choisirSequence(0);  break;
      case deux:    Serial.println(F("deux"));  choisirSequence(1);  break;
      case trois:   Serial.println(F("trois")); choisirSequence(2);  break;
      default: toutEteindre(); etat = REPOS; break;
    }
    IrReceiver.resume();
  }

  switch (etat) {
    case REPOS: break;
    case ACTION:
      if (etapeEnCours >= lesSequences[sequenceEnCours].nombreEtapes) {
        if (millis() - debut >= lesSequences[sequenceEnCours].attenteAvantExtinction) {
          toutEteindre();
          etat = REPOS;
        }
      } else {
        if (millis() - debut >= lesSequences[sequenceEnCours].dureeEntreEtapes[etapeEnCours]) {
          allumer(etapeEnCours++);
          debut = millis();
        }
      }
  }
}


Bonjour patglaz

Ton idée est qu'à chaque pression d'une touche, il y aie une sorte de show de LED qui s'allument, l'une après l'autre, un certain temps?

J'ai juste?

Cordialement
jpbbricole

ces bien ça pour notre discipline on a plusieurs niveaux ces pour ça le 0 pour brevet le 1 classe 1 le 2 classe 2 et le 3 classe 3

nous devons avec 4 secondes d'intervalle donner des position différentes à notre chien 2 au brevet et jusqu'à 6 en classe 3 pour le moment nous avons un piquet avec au somet les 3 positions et une personne tourne le piquet toute les 4 secondes

essayez la simulation du post 16

je voie ça encore merci

-------- Message d'origine --------