Introduction: Récupérer Les Codes Infra-Rouge Et 433mhz
Le but est d’afficher les codes des télécommandes du style commande de lampe, porte de garage et autre fonctionnant sous 433 mhz (RX433) mais aussi ceux des télécommandes infra-rouge de télévision au autre.
On pourra donc ensuite, grâce à une autre montage, envoyer ces codes et piloter n’importe quoi !
Step 1: Le Montage
Simple, un Arduino Nano, une diode réceptrice infra-rouge et un récepteur 433 mhz.
Step 2: Le Code Arduino
//InfraRouge
#include
int recvPin = 11; //pin Arduino pour récepteur InfraRouge (TOSP4838)
IRrecv irrecv(recvPin);
//RX433
#include
RCSwitch mySwitch = RCSwitch();
decode_results results;
void setup ( )
{
Serial.begin(9600);
irrecv.enableIRIn();
irrecv.blink13(true);//allume la LED interne lors de l'envoie InfraRouge
mySwitch.enableReceive(0); // Récepteur RX433 (XY-MK-5V) sur pin 2 de Arduino Uno et Nano
}
// affichage des codes InfraRouge
void ircode (decode_results *results)
{
// Panasonic
if (results->decode_type == PANASONIC) {
Serial.print(results->address, HEX);
Serial.print(":");
}
Serial.print(results->value, HEX);
}//void
// afficahge des codes encodés
void encoding (decode_results *results)
{
switch (results->decode_type) {
default:
case UNKNOWN: Serial.print("Inconnu"); break ;
case NEC: Serial.print("NEC"); break ;
case SONY: Serial.print("SONY"); break ;
case RC5: Serial.print("RC5"); break ;
case RC6: Serial.print("RC6"); break ;
case DISH: Serial.print("DISH"); break ;
case SHARP: Serial.print("SHARP"); break ;
case JVC: Serial.print("JVC"); break ;
case SANYO: Serial.print("SANYO"); break ;
case MITSUBISHI: Serial.print("MITSUBISHI"); break ;
case SAMSUNG: Serial.print("SAMSUNG"); break ;
case LG: Serial.print("LG"); break ;
case WHYNTER: Serial.print("WHYNTER"); break ;
case AIWA_RC_T501: Serial.print("AIWA_RC_T501"); break ;
case PANASONIC: Serial.print("PANASONIC"); break ;
case DENON: Serial.print("Denon"); break ;
}
}
// dump les résultats
void dumpInfo (decode_results *results)
{
// Check if the buffer overflowed
if (results->overflow) {
Serial.println("IR code too long. Edit IRremoteInt.h and increase RAWBUF");
return;
}
// Show Encoding standard
Serial.print("Encodage : ");
encoding(results);
Serial.println("");
// Show Code & length
Serial.print("Code : ");
ircode(results);
Serial.print(" (");
Serial.print(results->bits, DEC);
Serial.println(" bits)");
}
//structure
void dumpRaw (decode_results *results)
{
// Print Raw data
Serial.print("Timing[");
Serial.print(results->rawlen-1, DEC);
Serial.println("]: ");
for (int i = 1; i < results->rawlen; i++) {
unsigned long x = results->rawbuf[i] * USECPERTICK;
if (!(i & 1)) { // even
Serial.print("-");
if (x < 1000) Serial.print(" ") ;
if (x < 100) Serial.print(" ") ;
Serial.print(x, DEC);
} else { // odd
Serial.print(" ");
Serial.print("+");
if (x < 1000) Serial.print(" ") ;
if (x < 100) Serial.print(" ") ;
Serial.print(x, DEC);
if (i < results->rawlen-1) Serial.print(", "); //',' not needed for last one
}
if (!(i % 8)) Serial.println("");
}
Serial.println(""); // Newline
}
//+=============================================================================
// Dump out the decode_results structure.
//
void dumpCode (decode_results *results)
{
// Start declaration
Serial.print("unsigned int "); // variable type
Serial.print("rawData["); // array name
Serial.print(results->rawlen - 1, DEC); // array size
Serial.print("] = {"); // Start declaration
// Dump data
for (int i = 1; i < results->rawlen; i++) {
Serial.print(results->rawbuf[i] * USECPERTICK, DEC);
if ( i < results->rawlen-1 ) Serial.print(","); // ',' not needed on last one
if (!(i & 1)) Serial.print(" ");
}
// End declaration
Serial.print("};"); //
// Comment
Serial.print(" // ");
encoding(results);
Serial.print(" ");
ircode(results);
// Newline
Serial.println("");
// Now dump "known" codes
if (results->decode_type != UNKNOWN) {
// Some protocols have an address
if (results->decode_type == PANASONIC) {
Serial.print("unsigned int addr = 0x");
Serial.print(results->address, HEX);
Serial.println(";");
}
// All protocols have data
Serial.print("unsigned int data = 0x");
Serial.print(results->value, HEX);
Serial.println(";");
}
}
void loop ( )
/************************************************** InfraRouge ******************************************/
{
decode_results results; // Somewhere to store the results
if (irrecv.decode(&results)) { // Grab an IR code
dumpInfo(&results); // Output the results
dumpRaw(&results); // Output the results in RAW format
dumpCode(&results); // Output the results as source code
Serial.println(""); // Blank line between entries
irrecv.resume(); // Prepare for the next value
}
/**************************************************** RX433 ********************************************/
if (mySwitch.available())
{
int value = mySwitch.getReceivedValue();
Serial.println("RX433");
if (value == 0) {
Serial.print("Codage inconnu");
} else
{
Serial.print("Reçu ");
Serial.print( mySwitch.getReceivedValue() );
Serial.print(" / ");
Serial.print( mySwitch.getReceivedBitlength() );
Serial.print("bit ");
Serial.print("Protocole: ");
Serial.println( mySwitch.getReceivedProtocol() );
}
mySwitch.resetAvailable();
}//RX433
}//loop
Step 3: Infos Sur Les Codes Infra-Rouge
Il y a plusieurs protocoles :
NEC: 32 bits (protocol details)
Sony: 12 ou 20 bits (protocol details)(Understanding Sony IR remote codes.)
RC5: 12 bits (protocol details)
RC6: 20 ou 36 bits (protocol details)
Pour Sony et RC5/6, chaque transmission doit être répétés 3 fois !
ATTENTION : la librairie IRremote.h ne semble pas pouvoir envoyer des codes codés sur plus de 32bits.
Les RC6, 36 doivent donc êtres envoyer en raw, qui prennent plus de taille mémoire.
L’envoie des codes se fera avec la librairie IRremote.h
Exemple : (0x devant le code) et le nombre de bits irsend.sendNEC(0xA55A38C7, 32);
Step 4: Infos Sur Codes RX433
L’envoie se fera avec la librairie RCSwitch.h
Exemple mySwitch.send(1975778, 24);
On peut facilement piloter avec cela des prises commandés.