Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

telecommande:programme [2019/08/13 10:16] (Version actuelle)
Ligne 1: Ligne 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 =&gt; 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>
  
telecommande/programme.txt · Dernière modification: 2019/08/13 10:16 (modification externe)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0