Télécommande 7 Segments

De FunLab Documentation
Aller à : navigation, rechercher

Troisième tuto sur l'utilisation d'un Category:Capteur Category:Infrarouge et une télécommande pour piloter un afficheur.


Le but est d'afficher la valeur du bouton d'une télécommande (de zéro à neuf) sur un afficheur 7 segments.

Img aff digits ir.jpg


Composants

Pour ce tuto vous aurez besoin des composants suivants:

  • un Arduino Uno (ou Mega, peu immporte)
  • le câble d'alimentation USB de l'Arduino
  • un Capteur_infrarouge
  • une télécommande
  • un afficheur 7 segments
  • un registre 74HC595
  • des jumpers (des câbles)

Note : la télécommande utilisée ici est la même que celle-ci : [1]

Les branchements

Suivre les branchements décrits dans le premier tutoriel Tutoriel Arduino & afficheur 7 segments

Ensuite ajouter le capteur sur le breadboard comme dans le tuto n°2 : Tutoriel Arduino & capteur infrarouge. Brancher le pin de gauche sur l'entrée 10 de l'Arduino.

Programme

aff_digits_IR.ino
//**************************************************************//
// Name : Afficheur 7 segments piloté par télécommande
// Author : F. Lassinot 
// Inspiré de :
// shiftOutCode, Hello World 
// Author : Carlyn Maw,Tom Igoe, David A. Mellis 
// Date : 25 Oct, 2006 
// Modified: 23 Mar 2010 
// Version : 2.0 
// Et de :
// IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
// An IR detector/demodulator must be connected to the input RECV_PIN.
// Version 0.1 July, 2009
// Copyright 2009 Ken Shirriff
//****************************************************************
#include <IRremote.h>

//déclaration et définition des variables
int RECV_PIN = 10;

//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;
// valeurs envoyées au registre pour afficher les leds
int mesValeurs[] = {63, 12, 91, 94, 108, 118, 119, 28, 127, 126};

int valeurIR = 0;

const int v0 = 16738455;
const int v1 = 16724175;
const int v2 = 16718055;
const int v3 = 16743045;
const int v4 = 16716015;
const int v5 = 16726215;
const int v6 = 16734885;
const int v7 = 16728765;
const int v8 = 16730805;
const int v9 = 16732845;
const int vRejeu = 4294967295;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup() {
 //set pins to output so you can control the shift register
 pinMode(latchPin, OUTPUT);
 pinMode(clockPin, OUTPUT);
 pinMode(dataPin, OUTPUT);
 Serial.begin(9600);
 irrecv.enableIRIn(); // Start the receiver
}

void loop() {
 
// Réception du signal
 if (irrecv.decode(&results)) {
 // Affichage de la valeur
 Serial.println(results.value, HEX);
 Serial.println(results.value);
 valeurIR = results.value;
 irrecv.resume(); // Receive the next value
 
 // Correspondance de la valeur reçue et du chiffre à afficher
 switch ( valeurIR ) {
 case v0:
 affDigit(mesValeurs[0]);
 break;
 case v1:
 affDigit(mesValeurs[1]);
 break;
 case v2:
 affDigit(mesValeurs[2]);
 break;
 case v3:
 affDigit(mesValeurs[3]);
 break;
 case v4:
 affDigit(mesValeurs[4]);
 break;
 case v5:
 affDigit(mesValeurs[5]);
 break;
 case v6:
 affDigit(mesValeurs[6]);
 break;
 case v7:
 affDigit(mesValeurs[7]);
 break;
 case v8:
 affDigit(mesValeurs[8]);
 break;
 case v9:
 affDigit(mesValeurs[9]);
 break;
 case vRejeu:
 // on ne change pas la valeur
 break;
 default:
 break;
 }

 delay(100); // on attend un dixième de seconde
 }
}

// fonction d'affichage du chiffre
// nombre : un int à envoyer à l'afficheur pour afficher le chiffre
void affDigit(int nombre) {
 // take the latchPin low so 
 // the LEDs don't change while you're sending in bits:
 digitalWrite(latchPin, LOW);
 // shift out the bits:
 shiftOut(dataPin, clockPin, MSBFIRST, nombre);
 //take the latch pin high so the LEDs will light up:
 digitalWrite(latchPin, HIGH);
 // pause before next value:
 delay(500);
}

Explication du code

Le code se divise en 4 parties :

 - déclaration et définition des variables
- le setup
- La récupération du signal envoyé par la télécommande
- L'interprétation du signal et l'envoi vers le registre

Le fonctionnement de l'affichage sur le 7 segments à l'aide du registre est identique au tuto n°1. La lecture du signal est identique au tuto n°2.

La seule vraie différence est dans le traitement du signal :

   // Correspondance de la valeur reçue et du chiffre à afficher
  switch ( valeurIR ) {
  case v0:
    affDigit(mesValeurs[0]);
    break;
  case v1:
    affDigit(mesValeurs[1]);
    break;

Le switch permet d'envoyer la valeur de "mesValeurs" à afficher correspondant à "valeurIR" lue à partir de la télécommande. C'est la fonction affDigit qui se charge d'afficher chaque valeur.

Foire Aux Questions

Si vous avez des questions, posez-les ici!