Différences

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

Lien vers cette vue comparative

telecommande:programme [2019/08/13 12: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 12: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