Contrôle afficheur 7 segments via télécommande

Bonjour,
Dans le cadre de mes études je dois réaliser plusieurs projets en m'aidant des montages du livret issu du kit débutant. Un des projet est le contrôle d'un afficheur 7 segments via la télécommande IR. Pour cela je devais m'aider des montages 4 et 12 du livret, cependant je ne parviens pas à faire un code qui fonctionne. Je vous laisse le dernier code que j'ai essayé, celui-ci ne fonctionne pas donc si vous avez des solutions ou suggestions, je suis preneuse !

Le but du code est d'afficher, sur le 7 segments, le chiffre qui a été appuyé sur la télécommande.

#include"Adafruit_NECremote.h"
#define brocheIR 7

Adafruit_NECremote remote (brocheIR);

int donnee = 2;
int latch = 3;
int clock = 4;
int chiffre;
byte dec_digits[] = {0b00000011,0b10011111,0b00100101,0b00001101,0b10011001,0b01001001,0b01000001,0b00011111, 0b00000000, 0b00001001};

void setup(void) {
Serial.begin(115200);
Serial.println("Pret a recevoir");
  pinMode(latch, OUTPUT);
  pinMode(clock, OUTPUT);
  pinMode(donnee, OUTPUT);
  chiffre = 5;
}

int derniercode = -1;

void loop(void) {
int c = remote.listen (5);

  if (c=0){
    Serial.println ("0");
    derniercode = c;
    chiffre = c;
    digitalWrite(latch,LOW);
    shiftOut(donnee,clock,MSBFIRST,dec_digits[chiffre]);
    digitalWrite(latch, HIGH);
    delay(300);
  }
  
  if (c=1){
    Serial.println ("1");
    derniercode = c;
    chiffre = c;
    digitalWrite(latch,LOW);
    shiftOut(donnee,clock,MSBFIRST,dec_digits[chiffre]);
    digitalWrite(latch, HIGH);
    delay(300);
  }
  
  if (c=2){
    Serial.println ("2");
    derniercode = c;
    chiffre = c;
    digitalWrite(latch,LOW);
    shiftOut(donnee,clock,MSBFIRST,dec_digits[chiffre]);
    digitalWrite(latch, HIGH);
    delay(300);

  }
  
  if (c=3){
    Serial.println ("3");
    derniercode = c;
    chiffre = c;
    digitalWrite(latch,LOW);
    shiftOut(donnee,clock,MSBFIRST,dec_digits[chiffre]);
    digitalWrite(latch, HIGH);
    delay(300);

  }
  
  if (c=4){
    Serial.println ("4");
    derniercode = c;
    chiffre = c;
    digitalWrite(latch,LOW);
    shiftOut(donnee,clock,MSBFIRST,dec_digits[chiffre]);
    digitalWrite(latch, HIGH);
    delay(300);

  }
  
  if (c=5){
    Serial.println ("5");
    derniercode = c;
    chiffre = c;
    digitalWrite(latch,LOW);
    shiftOut(donnee,clock,MSBFIRST,dec_digits[chiffre]);
    digitalWrite(latch, HIGH);
    delay(300);

  }
  
  if (c=6){
    Serial.println ("6");
    derniercode = c;
    chiffre = c;
    digitalWrite(latch,LOW);
    shiftOut(donnee,clock,MSBFIRST,dec_digits[chiffre]);
    digitalWrite(latch, HIGH);
    delay(300);

  }
  
  if (c=7){
    Serial.println ("7");
    derniercode = c;
    chiffre = c;
    digitalWrite(latch,LOW);
    shiftOut(donnee,clock,MSBFIRST,dec_digits[chiffre]);
    digitalWrite(latch, HIGH);
    delay(300);

  }
  
  if (c=8){
    Serial.println ("8");
    derniercode = c;
    chiffre = c;
    digitalWrite(latch,LOW);
    shiftOut(donnee,clock,MSBFIRST,dec_digits[chiffre]);
    digitalWrite(latch, HIGH);
    delay(300);

  }
  
  if (c=9){
    Serial.println ("9");
    derniercode = c;
    chiffre = c;
    digitalWrite(latch,LOW);
    shiftOut(donnee,clock,MSBFIRST,dec_digits[chiffre]);
    digitalWrite(latch, HIGH);
    delay(300);
  }
}





c'est == pour tester une égalité
= c'est pour une affectation de valeur

vous devriez regarder comment fonctionne le switch/case en général (et regardez de plus près ce que vous faites dans chaque cas c'est toujours la même chose...)

1 Like

Malheureusement les aidants du forum, n'ont surement pas ce livret, même si il doit être possible de retrouver des captures d'écrans, il est plus judicieux de mettre directement l'image dont tu parle sur le forum, pour que tout le monde sache de quoi tu parle.

Si je peux te donner un conseil, cela serait de tester unitairement les points que tu découvres au lieu d'écrire directement un code complet.
Moins il y a de ligne, moins tu risque de faire de coquille et plus il est facile d'identifier un éventuel bug, puisque peu de ligne peuvent en être la cause.

Merci pour votre réponse ! J'ai ajouté les pages du livret...
Pour ce qui est de testé unitairement, je fais d'abord les montages du livret pour comprendre les différentes lignes et j'essaye ensuite d'assembler les deux montages. Mais là je n'arrive pas à trouver comment faire le lien entre les deux. J'ai tenté plusieurs codes sans succès, alors je ne sais pas si les données du livret suffisent.

avez vous essayé en corrigeant les == ?

J'aurais tendance à dire que je ne vois pas pourquoi les données du livre ne suffiraient pas.
Puisque les deux entités se suffisent à eux même et que dans un cas tu affiche une variable de type entier et dans l'autre tu reçois aussi une variable de type entier.

Le lien est ce que tu reçois du récepteur Infra-rouge et le chiffre que tu veux afficher sur ton 7 segments.

1 Like

Oui j'ai essayé mais il n'y a pas eu de changement lors de l'exécution du code.

hello
cela fait 2 fois que jml te dit de remplacer "=" par "==". :grinning:

il t'a également signalé l'existence de l'instruction
switch case

cherche ICI dans la catégorie "control structure".

postez le code modifié

Tant que tu ne décris pas plus précisément ce que tu obtiens comme comportement, tu risque de ne pas avoir plus d'aide :frowning:
De même ton programme à des sorties sur le moniteur série, pourquoi ne pas nous les communiquer?

Pourquoi semer de la confusion avec de nouvelles instructions qui n'apportent rien au comportement global du programme ?
Son programme doit pouvoir fonctionner avec de simple IF.

pas de confusion - c'est pour continuer son apprentissage (et il n'y a pas le souci de = versus ==)

on aurait aussi pu lui suggérer de regarder le else pour ses if

C'est un point de vue, personnellement je reste convaincu que de continuer un apprentissage, alors que l'étape précédente n'est pas atteinte, entraine de la confusion.

Même lui suggérer des else alors que son code n'est pas fonctionnel comme il le voudrait me parait prématurer.

Différentes approches

Je suis fan de l’apprentissage par "statement" - ie voir toutes les possibilités de sélection ou itération.

Ça permet de comprendre la structure du langage et comprendre à quoi servent les accolades et de comprendre les diverses possibilités. On réfléchit alors à l’algo en organisant des statements

Ça fait comprendre à la fois la syntaxe et la grammaire et comment fonctionne le compilateur

Mon expérience personnelle avec des jeunes et vieux est que ça marche bien mais bien sûr il n’y a pas qu’une seule façon d’apprendre



Je joins les photos du montages... Lorsque j'envoie le code à l'Arduino j'ai uniquement les messages qui s'affichent dans le moniteur en série de l'ordinateur. Et lorsque j'appuie sur la télécommande il ne se passe rien.

#include"Adafruit_NECremote.h"
#define brocheIR 7

Adafruit_NECremote remote (brocheIR);

int donnee = 2;
int latch = 3;
int clock = 4;
int chiffre;
byte dec_digits[] = {0b00000011,0b10011111,0b00100101,0b00001101,0b10011001,0b01001001,0b01000001,0b00011111, 0b00000000, 0b00001001};

void setup(void) {
  Serial.begin(115200);
  Serial.println("Pret a recevoir");
  pinMode(latch, OUTPUT);
  pinMode(clock, OUTPUT);
  pinMode(donnee, OUTPUT);
  chiffre = 5;
  
}

int derniercode = -1;

void loop(void) {
int c = remote.listen (5);

  if (c==0){
    Serial.println ("0");
    derniercode = c;
    digitalWrite(latch,LOW);
    shiftOut(donnee,clock,MSBFIRST,dec_digits[chiffre]);
    digitalWrite(latch, HIGH);
    delay(300);
  }
  
  if (c==1){
    Serial.println ("1");
    derniercode = c;
    chiffre = c;
    digitalWrite(latch,LOW);
    shiftOut(donnee,clock,MSBFIRST,dec_digits[chiffre]);
    digitalWrite(latch, HIGH);
    delay(300);
  }
  
  if (c==2){
    Serial.println ("2");
    derniercode = c;
    chiffre = c;
    digitalWrite(latch,LOW);
    shiftOut(donnee,clock,MSBFIRST,dec_digits[chiffre]);
    digitalWrite(latch, HIGH);
    delay(300);

  }
  
  if (c==3){
    Serial.println ("3");
    derniercode = c;
    chiffre = c;
    digitalWrite(latch,LOW);
    shiftOut(donnee,clock,MSBFIRST,dec_digits[chiffre]);
    digitalWrite(latch, HIGH);
    delay(300);

  }
  
  if (c==4){
    Serial.println ("4");
    derniercode = c;
    chiffre = c;
    digitalWrite(latch,LOW);
    shiftOut(donnee,clock,MSBFIRST,dec_digits[chiffre]);
    digitalWrite(latch, HIGH);
    delay(300);

  }
  
  if (c==5){
    Serial.println ("5");
    derniercode = c;
    chiffre = c;
    digitalWrite(latch,LOW);
    shiftOut(donnee,clock,MSBFIRST,dec_digits[chiffre]);
    digitalWrite(latch, HIGH);
    delay(300);

  }
  
  if (c==6){
    Serial.println ("6");
    derniercode = c;
    chiffre = c;
    digitalWrite(latch,LOW);
    shiftOut(donnee,clock,MSBFIRST,dec_digits[chiffre]);
    digitalWrite(latch, HIGH);
    delay(300);

  }
  
  if (c==7){
    Serial.println ("7");
    derniercode = c;
    chiffre = c;
    digitalWrite(latch,LOW);
    shiftOut(donnee,clock,MSBFIRST,dec_digits[chiffre]);
    digitalWrite(latch, HIGH);
    delay(300);

  }
  
  if (c==8){
    Serial.println ("8");
    derniercode = c;
    chiffre = c;
    digitalWrite(latch,LOW);
    shiftOut(donnee,clock,MSBFIRST,dec_digits[chiffre]);
    digitalWrite(latch, HIGH);
    delay(300);

  }
  
  if (c==9){
    Serial.println ("9");
    derniercode = c;
    chiffre = c;
    digitalWrite(latch,LOW);
    shiftOut(donnee,clock,MSBFIRST,dec_digits[chiffre]);
    digitalWrite(latch, HIGH);
    delay(300);
  }
}

avec l'exemple de la biblio adafruit nec remote

#include "Adafruit_NECremote.h"
 
// Connect a 38KHz remote control sensor to the pin below
#define IRpin         4
 
Adafruit_NECremote remote(IRpin);

void setup(void) {
  Serial.begin(9600);
  Serial.println("Ready to decode IR!");
}

int lastcode = -1;

void loop(void) {
  // You can set the listen() time out to 'n' seconds
  int c = remote.listen(5);  // seconds to wait before timing out!
  // Or you can wait 'forever' for a valid code
  //int c = remote.listen();  // Without a #, it means wait forever

  if (c >= 0) {
    Serial.print("Received code #"); 
    Serial.println(c, DEC);
    lastcode = c;
  } else if (c == -3) {
    Serial.print("Repeat (");
    Serial.print(lastcode);
    Serial.println(")");
  } else if (c == -2) {
    Serial.println("Data error");
  } else {
    Serial.println("Timed out waiting!");
  }
}

et une telecommande NEC

quand j'appuie sur 1 le moniteur serie affiche 12 ( en decimal puisque c 'est precisé dans le serialprint)
2 affiche 24, 3 aff 94 etc..
je supprime DEC dans le serialprintln, reçoit les memes chiffres

avec le croquis du montage n12 SEUL que recevez vous comme chiffres dans le moniteur série ?

Je suis globalement d'accord avec toi sur la finalité.
La ou je suis plus dubitatif c'est son application dans un cours forum.
De ma vraiment toutes petites expériences, si on ne comprends pas les bases, les notions plus complexe sont souvent mal maitrisé, à moins d'avoir son référent toujours à coté de soi.

C'est déjà mieux, mais je vais encore te faire une remarque.
Lorsque tu veux montrer du texte à ton écran, sélectionne avec ta souris le texte et fait un copier/coller sur le forum dans les balises adéquats.

Maintenant, il faudrait afficher le code lorsqu'il n'est pas négatif, pour voir quel code tu reçois
Comme ton soucis semble venir de la détection du code, on en revient à ce que je t'avais dit au début.
De tester les choses unitairement, puis dans un second temps en essayant de les mixer.

oui c'est pour cela qu'avant de faire des codes compliqués même si les projets sont plus fun, quand j'aide des apprenants on passe du temps d'abord à comprendre les statements. Quand on lit un code, je leur fait déchiffrer en trouvant les différents statements aussi. c'est un exercice très utile.

mais bon. revenons au code de @allyssa19


@allyssa19 si vous testez cela avec la console ouverte à 115200 bauds

#include"Adafruit_NECremote.h"

const byte brocheDonnee = 2;
const byte brocheLatch = 3;
const byte brocheClock = 4;
const byte brocheIR = 7;
const byte dec_digits[] = {0b00000011, 0b10011111, 0b00100101, 0b00001101, 0b10011001, 0b01001001, 0b01000001, 0b00011111, 0b00000000, 0b00001001};

Adafruit_NECremote capteurIR(brocheIR);

void setup(void) {
  Serial.begin(115200);
  pinMode(brocheLatch, OUTPUT);
  pinMode(brocheClock, OUTPUT);
  pinMode(brocheDonnee, OUTPUT);
  Serial.println("Pret a recevoir");
}


void loop(void) {
  int c = capteurIR.listen(1); // attente max de 1 seconde et réponse négative si rien reçu
  if (c >= 0) {
    Serial.print("Reçu code : ");    Serial.println (c);
    digitalWrite(brocheLatch, LOW);
    shiftOut(brocheDonnee, brocheClock, MSBFIRST, dec_digits[random(10)]); // pour le moment on affiche un chiffre aléatoire
    digitalWrite(brocheLatch, HIGH);
  }
}

que voyez vous ?