Savoir utiliser un récepteur/émetteur IR avec Arduino
Savoir commander plusieurs appareils sans fil indépendants
Etc.
Fonctionnement
Le mini-projet dédié au contrôle d’une carte relais 8 canaux en utilisant une télécommande infrarouge (IR). L’émetteur (la télécommande) permet de contrôler d’une façon indépendante la mise en marche ou en arrêt de l’un ou l’ensemble des relais. Nous utiliserons des LED alimentées à 5V afin d’observer l’état des relais. On peut également utiliser une charge AC/DC (Exemples : Monteur AC/DC, lampe, ventilateur, chauffage électrique, etc.) à la place d’une LED.
Émetteur IR ou télécommande
Nous avons utilisé une télécommande constituée de 21 boutons (7×3). Uniquement 8 boutons (« 1 » à « 8 ») seront effectivement utilisés pour le contrôle des relais. Ci-dessous le tableau des codes de la télécommande :
Chaque touche de la télécommande permet la mise en marche ou l’arrêt du canal correspondant. L’appui sur la touche inverse l’état du relais, puis garde en mémoire l’état actuel. Ci-dessous un exemple et l’extrait du code Arduino consacré à la touche « 1 ».
Si l’état précédent est égal à« 0 », le relais il passe à « 1 » puis il maintient la valeur « 1 »
Si l’état précédent est égal à« 1 », le relais il passe à « 0 » puis il maintient la valeur « 0 »
...
case 0xFF30CF: // Canal 1
if (Chan_1_etat==0)
{
// Mise en arrêt du relais (canal 1)
digitalWrite(Chan_1, LOW);
// Initialisation de l'état
Chan_1_etat=1;
}
else
{
// Mise en marche du relais (canal 1)
digitalWrite(Chan_1, HIGH);
// Initialisation de l'état
Chan_1_etat=0;
}
break;
case 0xFF18E7: // Canal 2
...
Programme Arduino
#include "IRremote.h"
// Numéro du pin sortie du récepteur
long int res_val;
const int receiver = 11;
// Indicateurs des états des cannaux (logique négative)
int Chan_1_etat=1;
int Chan_2_etat=1;
int Chan_3_etat=1;
int Chan_4_etat=1;
int Chan_5_etat=1;
int Chan_6_etat=1;
int Chan_7_etat=1;
int Chan_8_etat=1;
// Liaison Arduino-Relais des 8 cannaux
const int Chan_1 = 2;
const int Chan_2 = 3;
const int Chan_3 = 4;
const int Chan_4 = 5;
const int Chan_5 = 6;
const int Chan_6 = 7;
const int Chan_7 = 8;
const int Chan_8 = 9;
// Déclaration d'un objet IRrecv
IRrecv irrecv(receiver);
decode_results results;
void setup()
{
// Délaration des canaux en sorties
pinMode(Chan_1, OUTPUT);
pinMode(Chan_2, OUTPUT);
pinMode(Chan_3, OUTPUT);
pinMode(Chan_4, OUTPUT);
pinMode(Chan_5, OUTPUT);
pinMode(Chan_6, OUTPUT);
pinMode(Chan_7, OUTPUT);
pinMode(Chan_8, OUTPUT);
// Init du récepteur
irrecv.enableIRIn();
// Initialisation des canaux
digitalWrite(Chan_1, HIGH);
digitalWrite(Chan_2, HIGH);
digitalWrite(Chan_3, HIGH);
digitalWrite(Chan_4, HIGH);
digitalWrite(Chan_5, HIGH);
digitalWrite(Chan_6, HIGH);
digitalWrite(Chan_7, HIGH);
digitalWrite(Chan_8, HIGH);
}
void loop()
{
// Lecture de la télécommande
if (irrecv.decode(&results))
{
// Récupération du code
res_val = results.value;
// Commmande des cannaux
ChanCmd(res_val);
// Réception de la nouvelle valeur
irrecv.resume();
}
}
void ChanCmd(long Chan_code)
{
switch(res_val)
{
case 0xFF30CF: // Canal 1
if (Chan_1_etat==0)
{
// Mise en arrêt du relais (canal 1)
digitalWrite(Chan_1, LOW);
// Initialisation de l'état
Chan_1_etat=1;
}
else
{
// Mise en marche du relais (canal 1)
digitalWrite(Chan_1, HIGH);
// Initialisation de l'état
Chan_1_etat=0;
}
break;
case 0xFF18E7: // Canal 2
if (Chan_2_etat==0)
{
digitalWrite(Chan_2, LOW);
Chan_2_etat=1;
}
else
{
digitalWrite(Chan_2, HIGH);
Chan_2_etat=0;
}
break;
case 0xFF7A85: // Canal 3
if (Chan_3_etat==0)
{
digitalWrite(Chan_3, LOW);
Chan_3_etat=1;
}
else
{
digitalWrite(Chan_3, HIGH);
Chan_3_etat=0;
}
break;
case 0xFF10EF: // Canal 4
if (Chan_4_etat==0)
{
digitalWrite(Chan_4, LOW);
Chan_4_etat=1;
}
else
{
digitalWrite(Chan_4, HIGH);
Chan_4_etat=0;
}
break;
case 0xFF38C7: // Canal 5
if (Chan_5_etat==0)
{
digitalWrite(Chan_5, LOW);
Chan_5_etat=1;
}
else
{
digitalWrite(Chan_5, HIGH);
Chan_5_etat=0;
}
break;
case 0xFF5AA5: // Canal 6
if (Chan_6_etat==0)
{
digitalWrite(Chan_6, LOW);
Chan_6_etat=1;
}
else
{
digitalWrite(Chan_6, HIGH);
Chan_6_etat=0;
}
break;
case 0xFF42BD: // Canal 7
if (Chan_7_etat==0)
{
digitalWrite(Chan_7, LOW);
Chan_7_etat=1;
}
else
{
digitalWrite(Chan_7, HIGH);
Chan_7_etat=0;
}
break;
case 0xFF4AB5: // Canal 8
if (Chan_8_etat==0)
{
digitalWrite(Chan_8, LOW);
Chan_8_etat=1;
}
else
{
digitalWrite(Chan_8, HIGH);
Chan_8_etat=0;
}
break;
}
}