====== 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 //=================================================== /* 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 #include "RCSwitch.h" #include #include 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 }*/