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 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 <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
}*/

telecommande/programme.txt · Dernière modification: 2015/01/02 12:24 par chef
CC Attribution-Share Alike 3.0 Unported
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