
|
Bienvenido,
Invitado
|
¿Te interesan los PIC¨s? La programación y su integración con la radio.
Desde aquí se va a tratar de tener un punto común de encuentro.
Desde aquí se va a tratar de tener un punto común de encuentro.
TEMA: Salida verbal con Arduino con WTV202M01
Salida verbal con Arduino con WTV202M01 11 años 7 meses ago #6157
|
Hola amigos:
He terminado una aplicación que nos permite utilizar el Arduino, (u otro pic si te empeñas) como salida verbal de textos. La aplicación es una simple (o no tan simple) salida de los números 1, 2,3... y así hasta el 999.999.999. Adjunto el programa y quedo a vuestra disposición Manuel Santos Grece /* Example: Control a WTV020-SD-16P module to play voices from an Arduino board. Created by Diego J. Arevalo, August 6th, 2012. Released into the public domain. */ /* Programa para la salida de voces al azae con el modulo WTV020M01 aplicado a la salida de numeros Es el modulo WTV020-SD-16P 1 Reset VDD 16 2 AUDIO-L P06 15 BUSY 3 NC NC 14 4 SPK+ P02 13 K1/A0 5 SPK- P03 12 6 NC NC 11 7 P04 CLK P05 10 DI 8 GND P07 9 Puertas del Arduino: 8 -> RESET 7 -> CLK - P04 4 -> DI - P05 2 -> K1/A0 -- P02 Opcional 5 -> Busy - P06 Conexionado entre Arduino y Módulo Salidas del Arduino 7, 5 y 2 conectadas al módulo utilizando un R de 5kOhmios en serie entre ambos puntos Salida de la señal de Reset ( --- C 10 nF--- | | Usar un divisor de tension Arduino Sal 8: ---- 1 k O--- 2k --- Masa | 1 Modulo El condensador es necesario para dar paso a los impulsos de Reset Ficheros de sonido: Los ficheros se grabaros todos juntos mediante el programa de tratamiento de sonido WavePad Despues se recortaron en ficheros aislados creando múltiples ficheros MP3 Con el programa USBRecorder se trasformaron al formato AD4 0000.ad4, 0001.ad4, 0002.ad4, 0003.ad4, 0004.ad4, 0005.ad4, 0006.ad4, 0007.ad4, 0008.ad4, 0009.ad4, 0010.ad4, 0011.ad4, 0012.ad4, 0013.ad4, 0014.ad4, 0015.ad4, 0016.ad4, 0017.ad4, 0018.ad4, 0019.ad4, 0020.ad4, 0021.ad4 Venti 0030.ad4, 0040.ad4, 0050.ad4, 0060.ad4, 0070.ad4, 0080.ad4, 0090.ad4, OlOO.ad4, 0101.ad4 Ciento 0102.ad4 Cientos 0150.ad4 Quinientos 0190.ad4 Novecientos 0300.ad4 Mil 0330.ad4 Millon 0331.ad4 Un millon 0400.ad4 Y Hay que incluir la librerÃa creada por Diego J. Arevalo Si alguien no las encuentra en la red, que me la pida. Si tienen interés tambien les puedo mandas los ficheros xxxx.ad4. <Esta dirección de correo electrónico está protegida contra spambots. Usted necesita tener Javascript activado para poder verla.> Yo, en este programa, no he utilizado más que una opción de las funciones, pero las demás tambien funcionan. El programa tiene algunos errores correspondientes a "UNO" y "UN" */ #include <Wtv020sd16p.h> int resetPin = 8; // The pin number of the reset pin. int clockPin = 7; // The pin number of the clock pin. int dataPin = 4; // The pin number of the data pin. int busyPin = 5; // The pin number of the busy pin. int Byte_entrado; char *unidadesY[] = {"cero", "un", "dos","tres","cuatro","cinco","seis","siete","ocho","nueve","diez","once","doce","trece","catorce", "quince", "diezciseis", "diecisiete", "dieciocho", "diecinueve","veinte"}; char *decenas[] = {"","","venti","treinta","cuarenta","cincuenta","sesenta","setenta","ochenta","noventa"}; String Respro; // Resultado parcial String Resultado; //Resultado final de tres cifras String Resultado6; // Resltado final 6 cifras String Resultado9; // Resultado final de 9 cifras long millones; long miles; int mmil; Wtv020sd16p wtv020sd16p(resetPin,clockPin,dataPin,busyPin); void setup() { wtv020sd16p.reset(); // put your setup code here, to run once: Serial.begin(9600); } // SUBPROGRAMA xy (13) a (trece) // Trasforma a texto un numero de dos cifras formado por dos int independientes void DosCif (int x,int y) { if (x == 0) { Resultado = unidadesY[y]; // caso de los numeros 0 al 9 wtv020sd16p.asyncPlayVoice(y); // Salida verbal 0 al 9 delay(1000); } int Dece = x*10+y; //Valor del par xy if ((Dece >= 10) && (Dece <= 20)) { wtv020sd16p.asyncPlayVoice(Dece); // Salida verbal 10 al 20 delay(1000); Resultado=unidadesY[Dece]; //Casos del 10 al 20 // } // /// Salidas hasta el 100 // // Casos del 21 al 90 if ((y!=0) && (Dece > 20)) { // Serial.println(x); // Serial.println(y); // Serial.println(Dece); if ((y!=0) && (Dece < 30)) //Excepción verbal del 21-29 { wtv020sd16p.asyncPlayVoice(21); delay(900); } Resultado = decenas[x]; // Casos 30,40,50.. //ponerle la unidades a los venti solo si son < 30 if (Dece < 30) { wtv020sd16p.asyncPlayVoice(y); delay(1200); Resultado = Resultado + unidadesY[y]; } } /// if (Dece >= 30) { if (y==0) { // decene exacta wtv020sd16p.asyncPlayVoice(10*x); delay(1200); Resultado = decenas[x]; } if (y != 0) wtv020sd16p.asyncPlayVoice(10*x); delay(1200); Resultado = decenas[x]; if (((x != 0) && (x != 2)) && ((y > 0))) { wtv020sd16p.asyncPlayVoice(400); // Y copulativa delay(800); Resultado = Resultado +" y "; // Añadir dl a Y del 30 en adelante wtv020sd16p.asyncPlayVoice(y); delay(1000); Resultado = Resultado + unidadesY[y]; } } } ////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// // SUBPROGRAMA xyz (134) a (ciento trenta y cuatro) ////////////////////// // Trasforma a texto un numero de dos cifras formado por tres int independientes //////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// void TresCif (int x,int y,int z) { int Cente = x*100+y*10+z; //ElaboracÃn de las palabras cien, ciento y cientos // Cien, valor exacto if (Cente==100) { wtv020sd16p.asyncPlayVoice(100); // Palabra "Cien" delay(1200); } // Valores de 101 a 199 if ((Cente >= 101) && (Cente <= 199)) { wtv020sd16p.asyncPlayVoice(101); // Palabra "Ciento" delay(1200); } // Valores de 200 a 499 if ((Cente >= 200) && (Cente <= 499)) { wtv020sd16p.asyncPlayVoice(x); // Palabras, 2 , 3 , 3 delay(1000); wtv020sd16p.asyncPlayVoice(102); // Palabra "Cientos" delay(1200); } // Valores de 500 a 599 if ((Cente >= 500) && (Cente <= 599)) { wtv020sd16p.asyncPlayVoice(150); // Palabra "Quinientos" delay(1200); } // Valores de 600 a 699 if ((Cente >= 600) && (Cente <= 699)) { wtv020sd16p.asyncPlayVoice(x); // Palabras, 6 delay(1000); wtv020sd16p.asyncPlayVoice(102); // Palabra "Cientos" delay(1200); } // Valores del 700 al 799 if ((Cente >= 700) && (Cente <= 799)) { wtv020sd16p.asyncPlayVoice(170); // Palabra "Setecientos" delay(1200); } // Valores del 800 a 899 if ((Cente >= 800) && (Cente <= 899)) { wtv020sd16p.asyncPlayVoice(x); // Palabras, 8 delay(1000); wtv020sd16p.asyncPlayVoice(102); // Palabra "Cientos" delay(1200); } // Valores de 900 a 999 if ((Cente >= 900) && (Cente <= 999)) { wtv020sd16p.asyncPlayVoice(190); // Palabra "Novecientos" delay(1200); } // if (x==0) DosCif (y,z); if (Cente == 100) Resultado ="cien"; if ((Cente >100) && (Cente <200)) { DosCif(y,z); Resultado = "ciento "+Resultado; } if ((Cente >= 200) && (Cente < 500)) { DosCif(y,z); Respro = unidadesY[x]; if ((y==0) && (z==0)) Resultado = Respro + "cientos "; if ((y!=0) || (z!=0)) Resultado= Respro + "cientos "+Resultado; } // Excepción quinientos if ((Cente >= 500) && (Cente < 600)) { DosCif(y,z); Respro = "quinientos "; if ((y==0) && (z==0)) Resultado= Respro; if ((y!=0) || (z!=0)) Resultado= Respro + Resultado; } if ((Cente >= 600) && (Cente < 700)) { DosCif(y,z); Respro = "seiscientos "; if ((y==0) && (z==0)) Resultado= Respro; if ((y!=0) || (z!=0)) Resultado= Respro + Resultado; } //Excepción setecientos if ((Cente >= 700) && (Cente < 800)) { DosCif(y,z); Respro = "setecientos "; if ((y==0) && (z==0)) Resultado= Respro; if ((y!=0) || (z!=0)) Resultado= Respro + Resultado; } if ((Cente >= 800) && (Cente < 900)) { DosCif(y,z); Respro = "ochocientos "; if ((y==0) && (z==0)) Resultado= Respro; if ((y!=0) || (z!=0)) Resultado= Respro +Resultado; } if ((Cente >= 900) && (Cente < 1000)) { DosCif(y,z); Respro = "novecientos "; if ((y==0) && (z==0)) Resultado= Respro; if ((y!=0) || (z!=0)) Resultado= Respro + Resultado; } } /////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////// los miles ///////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////// void SeisCif (long x,long y,long z,int xx,int yy,int zz) { mmil = xx*100 +yy*10 +zz; // menos de mil miles =x*100000+y*10000+z*1000+xx*100+yy*10+zz; // mas de mil // Primero ponemos la voces if (miles ==1000) { wtv020sd16p.asyncPlayVoice(300); // Palabra "MIL" delay(1200); } // Desde 1001 a 1999 (no se dice un mil) if ((miles >1000) && (miles < 2000)) { wtv020sd16p.asyncPlayVoice(300); // Palabra "MIL" delay(1200); } // Desde 1999 a 999.999 if (miles >= 2000) { TresCif(x,y,z); wtv020sd16p.asyncPlayVoice(300); // Palabra "MIL" delay(1200); } // if (miles < 1000) { TresCif (xx,yy,zz); Resultado6=Resultado; } if (miles ==1000) Resultado6="mil"; if ((miles >1000) && (miles < 2000)) { TresCif (xx,yy,zz); if (mmil==0) Resultado6= "mil"; // mil (y no mil cero) Resultado6= "mil "+ Resultado; // mil doscientos ventitres } if (miles >= 2000) { // TresCif(x,y,z); Resultado6=Resultado; TresCif (xx,yy,zz); if (mmil==0) Resultado6=Resultado6 + " mil"; // siete mil (y no siete mil cero) if (mmil != 0) Resultado6=Resultado6 + " mil "+ Resultado; } } /////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////// LOS MILLONES ///////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////// //_ SUBPROGRAMA para NUEVE o MENOS cifras void NueveCif (long u, long v, long w, long x,long y,long z,int xx,int yy,int zz) { mmil = xx*100+yy*10+zz; // menos de mil miles =x*100000+y*10000+z*1000+xx*100+yy*10+zz; // mas de mil millones =u*100000000+v*10000000+w*1000000+x*100000+y*10000+z*1000+xx*100+yy*10+zz; // más de millones /// Voves del millon // se dice un millon y un millon doscientos... if ((millones >1000000) && (millones < 2000000)) { wtv020sd16p.asyncPlayVoice(330); // Palabra "UN MILLON"" delay(1200); } if (millones >=2000000) { TresCif(u,v,w); wtv020sd16p.asyncPlayVoice(331); // Palabra "MILLONES"" delay(1200); } if (millones < 1000000) SeisCif (x,y,z,xx,yy,zz); Resultado9=Resultado6; if ((millones >1000000) && (millones < 2000000)) { SeisCif(x,y,z,xx,yy,zz); Resultado9= "un millon " + Resultado6; } if (millones >=2000000) { // TresCif(u,v,w); Resultado9=Resultado + " millones "; SeisCif(x,y,z,xx,yy,zz); Resultado9= Resultado9 + Resultado6; } // El numero en letra está para aplicarlo a un sustantivo masculino // Si se aplica a un sustantivo femenino hay que cambiarla en "una" // y se va a considerar como un numero aislado hay que cambiarlo a "uno". if (zz==1) Resultado9=Resultado9 + "o"; // Aplicación como numero aislado } void loop() { wtv020sd16p.playVoice(0); // put your main code here, to run repeatedly: int a; // x int b; // y int c; // z int d; //xx int e; //yy int f; //zz int g; int h; int i; for (a=0; a<=9; a++){ for (b=0; b<=9; b++){ for (c=0; c<=9; c++){ for (d=0; d<=9; d++){ for (e=0; e<=9; e++){ for (f=0; f<=9; f++){ for (g=0; g<=9; g++){ for (h=0; h<=9; h++){ for (i=0; i<=9; i++){ // NueveCif (0,0,0,0,0,0,6,2,0); NueveCif (a,b,c,d,e,f,g,h,i); Serial.print( millones); Serial.print(" ---> "); Serial.println (Resultado9); delay(500); delay(500); }}}}}}}}} } |
|
El administrador ha deshabilitado la escritura pública.
|
Time to create page: 0.117 seconds

