| |
— | telecommande:programme [2019/08/13 10:16] (Version actuelle) – créée - modification externe 127.0.0.1 |
---|
| ====== Programme ====== |
| |
| Pour l'instant je me suis préoccupé de la reconnaissance vocale.\\ |
| C'est un programme de test, il y a beaucoup de serialwrite qui devront disparaître dans le programme final.\\ |
| Le module de reconnaissance vocale utilise la liaison série... |
| |
| La gestion RF n'est encore faites, je prévois d'utiliser virtualwire pour transmettre du Xpl.\\ |
| il me faudra aussi RSwitch pour piloter mes prises domo. J'espère que les librairies cohabiterons. |
| |
| Si vous avez des suggestions ou si vous voulez finir le programme, envoyer moi un mail à patbidouille @ free.fr. |
| |
| Voici le {{:projets:fichiers:tel2.ino|Fichier}} du programme |
| |
| <code c++> |
| //=================================================== |
| /* Télécommande TV par RF ou reconnaissance vocale |
| * Sept-oct 2014 |
| * |
| * Commande reconnaissance vocale |
| * 0xaa - cmd de base avant une commande |
| * 0xbb Affiche l'état |
| * 0x37 Passge en mode compact |
| * 0x21 Attends 1° colonne |
| * 0x22 " 2° " |
| * 0x23 " 3° " |
| * 0x24 " toutes les " |
| * Retour voie |
| * 11 - TV 21 - Normal 31 - On |
| * 12 - Lumière 22 - Xbmc 32 - Off |
| * 13 - Pub 23 - Centre 33 - Plus |
| * 14 - Son 24 - mur 34 - Moins |
| * 15 - Alfred 25 - 35 - Stop |
| * |
| * Commande télécommande |
| * Tv on/off 0xffffffff 0x20df10ef |
| * Tv vol + 0xffffffff 0x20df40bf |
| * Tv vol - 0xffffffff 0x20dfc03f |
| * |
| * Ampli on 0xffffffff 0x7e817e81 |
| * Ampli off " 0x7e81fe01 |
| * Ampli "3" " 0x5eA1609e |
| * Ampli "2" " 0x5eA1c03e |
| * Ampli vol+ " 0x5eA158a7 |
| * Ampli vol- " 0x5eA1d827 |
| * |
| * Pins utilisées |
| * Txd, Rxd pour le module de reconnaissance de parole |
| * D2 Recepteur RF |
| * D3 Emetteur IR |
| * D4 Capteur Son, Sortie numérique |
| * D9 BPoussoir |
| * D10 Emmetteur RF |
| * D11 Recepteur IR |
| * D12 Led 6 |
| * D13 Led 7 |
| * A0 Capteur son, sortie analogique |
| */ |
| //=================================================== |
| |
| /*void loop() { |
| mySwitch.send("000000000001010100010001"); |
| |
| delay(1000); |
| } |
| */ |
| |
| |
| #include <IRremote.h> |
| #include "RCSwitch.h" |
| #include <stdlib.h> |
| #include <stdio.h> |
| RCSwitch mySwitch = RCSwitch(); |
| |
| |
| #define LUM_LEVEL 350 // Niveau de lumière détecté de 0 to 1023 |
| #define REPEAT_TX 3 // Combien de restransmission IR remote code |
| #define cmd_code 0xffffffff // remote code pour transmettre. |
| #define Tv_onoff 0x20df10ef // Codes des télécommandes |
| #define Tv_volP 0x20df40bf |
| #define Tv_volM 0x20dfc03f |
| #define Ampli_on 0x7e817e81 |
| #define Ampli_off 0x7e81fe01 |
| #define Ampli3 0x5eA1609e |
| #define Ampli2 0x5eA1c03e |
| #define Ampli_volP 0x5eA158a7 |
| #define Ampli_volM 0x5eA1d827 // Codes des télécommandes |
| |
| #define REMOTE_BIT 32 |
| #define LUM_SENSOR_PIN A0 // lumière sensor connected to this analog pin |
| #define LEDR 12 // LED used to blink when volume too high |
| #define LEDV 13 // LED used to blink when volume too high |
| #define nfois 10 // Nb de fois qu'on actionne le Vol pour la pub |
| #define volfois 3 // Nb de fois qu'on actionne le Vol pour le +/- |
| #define tempsexec 200000 // Temps d'exécution |
| #define bouton D9 // pin du bouton |
| |
| int RECV_PIN = 11; // Pin du recepteur IR |
| byte com = 0; // Retour du module voice recognition |
| int rf_value = 0; // Retour RF |
| boolean serie = false; // Si série présente |
| boolean RF = false; // Si Rf présente |
| boolean pub = false; // Pub en route ? |
| long temps = 0; // Temps d'exécution |
| int seq = 0; // Séquence de l'ordre (nb de niveau) |
| byte ordre[3] = {}; // Buffer d'ordre tableau de byte hex reçu par la série à transmettre |
| int col = 0; // Indicateur de la colonne ou on est |
| boolean ex_ordre; // Vrai il faut executer l'ordre sinon on tourne |
| |
| |
| IRrecv irrecv(RECV_PIN); |
| IRsend irsend; // innitialise l' IR object |
| decode_results results; |
| |
| /* if (irrecv.decode(&results)) { |
| Serial.println(results.value, HEX); |
| irrecv.resume(); // Receive the next value |
| */ |
| |
| void envoiOrdre(byte cmd) { // Envoi une commande et attends la confirmation |
| byte retour = 0; |
| do { |
| digitalWrite(LEDR, HIGH); |
| Serial.write(0xAA); // Cmd d'emission |
| Serial.write(cmd); // Attente |
| delay(600); |
| while (Serial.available()) { retour = Serial.read(); }//Serial.write(retour);} |
| } |
| while (retour != 0xCC); |
| digitalWrite(LEDR, LOW); |
| com=0; |
| } |
| |
| |
| void setup() |
| { |
| Serial.begin(9600); |
| mySwitch.enableTransmit(10); // Using Pin #10 |
| mySwitch.enableReceive(0); // Receiver on inerrupt 0 => that is pin #2 |
| irrecv.enableIRIn(); // Start the receiver |
| delay(1000); |
| envoiOrdre(0x00); // Attente |
| digitalWrite(LEDV, LOW); |
| delay(1000); |
| envoiOrdre(0x37); // Passage en mode compact |
| //digitalWrite(LEDV, HIGH); |
| delay(1000); |
| envoiOrdre(0x21); // Attends mot de la 1° colonne |
| pinMode(LEDR, OUTPUT); // sets the ledPin to be an output |
| pinMode(LEDV, OUTPUT); |
| col = 1; |
| ex_ordre = false; |
| pinMode(bouton, INPUT); // button |
| digitalWrite(bouton, HIGH); // enable pull-up resistor |
| } |
| |
| void serialEvent() { // S'exécutesi une donnée série arrive avant chaque redémarrrage de la loop |
| // Test liaison série |
| int cardispo = Serial.available(); |
| if(cardispo > 0) { |
| com = Serial.read(); |
| serie = true; // j'ai une valeur |
| digitalWrite(LEDV, HIGH); |
| } |
| } |
| |
| void rfEvent() { // Test si nouveau signal RF |
| //test RF |
| if (mySwitch.available()) { |
| rf_value = mySwitch.getReceivedValue(); |
| RF = true; // J'ai une valeur |
| } else { |
| RF = false; |
| } |
| } |
| |
| void traite_ordreRF (int ordreRF) { // Traite un ordre pour la RF |
| mySwitch.send(ordreRF); |
| |
| } |
| |
| void execute_ordre() { // Sequence de décorticage des commandes et exécution |
| |
| Serial.write("on execute les ordres>");Serial.write(ordre[1]);Serial.write(ordre[2]);Serial.write(ordre[3]); Serial.write("<"); |
| digitalWrite(LEDR, HIGH); |
| switch(ordre[1]) { |
| case 0x14: // On est dans le son |
| switch(ordre[3]) { |
| case 0x33: |
| Serial.write("ordre Vol plus"); |
| for (int cpt=0; cpt < volfois; cpt ++) { |
| irsend.sendRC5(Ampli_volP, REMOTE_BIT); |
| delay(500); |
| } |
| break; |
| |
| case 0x34: |
| Serial.write("ordre Vol moins"); |
| for (int cpt=0; cpt < volfois; cpt ++) { |
| irsend.sendRC5(Ampli_volM, REMOTE_BIT); |
| delay(500); |
| } |
| break; |
| } |
| envoiOrdre(0x21); |
| col = 1; |
| break; |
| |
| |
| case 0x11: // On est dans la TV |
| switch(ordre[2]) { |
| case 0x21: // TV |
| switch(ordre[3]) { |
| case 0x31: // On |
| Serial.write("ordre tv on"); |
| irsend.sendRC5(Ampli3, REMOTE_BIT); |
| irsend.sendRC5(Tv_onoff, REMOTE_BIT); |
| break; |
| |
| case 0x32: // off |
| Serial.write("ordre tv off"); |
| irsend.sendRC5(Ampli_off, REMOTE_BIT); |
| irsend.sendRC5(Tv_onoff, REMOTE_BIT); |
| break; |
| } |
| break; |
| |
| case 0x22: // c'est XBMC |
| switch(ordre[3]) { |
| case 0x31: // On |
| Serial.write("ordre xbmc on"); |
| irsend.sendRC5(Ampli2, REMOTE_BIT); |
| irsend.sendRC5(Tv_onoff, REMOTE_BIT); |
| break; |
| |
| case 0x32: // off |
| Serial.write("ordre xbmc off"); |
| irsend.sendRC5(Ampli_off, REMOTE_BIT); |
| irsend.sendRC5(Tv_onoff, REMOTE_BIT); |
| break; |
| } |
| break; |
| } |
| envoiOrdre(0x21); |
| col = 1; |
| break; |
| |
| |
| case 0x12: // On est dans la lumière |
| switch(ordre[2]) { |
| case 0x23: // Lumières table |
| switch(ordre[3]) { |
| case 0x31: // On |
| traite_ordreRF(); |
| Serial.write("ordre lumiere table on"); |
| break; |
| |
| case 0x32: // off |
| traite_ordreRF(); |
| Serial.write("ordre lumiere table off"); |
| break; |
| } |
| break; |
| |
| case 0x24: // Lumières Bandeau |
| switch(ordre[3]) { |
| case 0x31: // On |
| traite_ordreRF(); |
| Serial.write("ordre lumiere bandeau on"); |
| break; |
| |
| case 0x32: // off |
| traite_ordreRF(); |
| Serial.write("ordre lumiere bandeau off"); |
| break; |
| } |
| envoiOrdre(0x21); |
| seq=0; |
| break; |
| } |
| } |
| envoiOrdre(0x21); |
| col = 1; |
| ex_ordre = false; |
| |
| } |
| |
| //============== Boucle Principale ========================= |
| void loop() // run over and over again |
| { |
| /* Déroulement du programme |
| * On attend une voix et une info RF |
| * Déroulement d'ordre sinon boucle |
| */ |
| |
| |
| if(digitalRead(bouton) == LOW) { // on appui sur le bouton |
| digitalWrite(LEDV, HIGH); |
| } |
| else { |
| digitalWrite(LEDV, LOW); |
| } |
| delay(500); |
| |
| |
| digitalWrite(LEDR, LOW); |
| rfEvent; |
| if (RF) { // On communique par RF |
| |
| } |
| 9 |
| if(serie) { // On me parle |
| |
| if (com == 0x13) { // on est dans la pub |
| |
| if (pub ) { // la pub est déjà en cours, on rempnte le vol |
| pub=false; |
| for (int cpt=0; cpt < nfois; cpt++) { |
| irsend.sendNEC(Ampli_volP, REMOTE_BIT); |
| delay(500); |
| } |
| } else { // c'est la pub on baisse le vol |
| pub=true; |
| for (int cpt=0; cpt < nfois; cpt ++) { |
| irsend.sendRC5(Ampli_volM, REMOTE_BIT); |
| delay(500); |
| } |
| } |
| envoiOrdre(0x21); // Attends mot de la 1° colonne |
| } |
| |
| if (col == 1) { // Pas d'ordre en cours |
| |
| if (com == 0x14) { // on est dans le son |
| ordre[col] = com; // On stock le 1 ordre |
| envoiOrdre(0x23); // Attends mot de la 3° colonne |
| col = 3; |
| temps = millis(); // On met le actuel va attendre 2sec |
| |
| } else if ((com == 0x11) || (com == 0x12)) { // on est dans la TV ou les lumières |
| ordre[col] = com; // On stock le 1 ordre |
| envoiOrdre(0x22); // Attends mot de la 2° colonne |
| col = 2; |
| temps = millis(); // On met le actuel va attendre 2sec |
| |
| } |
| |
| if (com == 0x15) { // on est dans Alfred un truc à définir |
| ordre[col] = com; // On stock le 1 ordre |
| col = 1; |
| } |
| |
| } else if (col != 1 ) { // Un ordre est en route |
| |
| if (millis() - temps > tempsexec) { // Le temps est fini ou erreur |
| col = 1; |
| envoiOrdre(0x21); // Attends mot de la 1° colonne |
| |
| } else if ((com == 0x31) || (com == 0x32)) { // on est dans la TV, lumière on/off |
| ordre[col] = com; // On stock le 3 ordre |
| col = 1; |
| ex_ordre = true; |
| |
| } else if ((com == 0x33) || (com == 0x34)) { // on est dans le son +/- |
| ordre[col] = com; // On stock le 2 ordre |
| col = 1; |
| ex_ordre = true; |
| |
| } else if ((com == 0x23) || (com == 0x24) || (com == 0x21) || (com == 0x22)) { |
| // on est dans le on/off plus/moins |
| ordre[col] = com; // On stock le 2 ordre |
| envoiOrdre(0x23); // Attends mot de la 3° colonne |
| col = 3; |
| } |
| } |
| |
| //================ |
| if (ex_ordre) { // Séquence d'ordre fini, on execute ! |
| execute_ordre; |
| } |
| |
| }acrobat reader |
| serie = false; // On a lut la série, suivant... |
| com = 0; |
| digitalWrite(LEDV, LOW); |
| |
| } //fin du void |
| |
| /* if (irrecv.decode(&results)) { |
| Serial.println(results.value, HEX); |
| irrecv.resume(); // Receive the next value |
| }*/ |
| |
| |
| |
| </code> |
| |