sinarcas01.jpg
Bienvenido, Invitado
Username: Password:
¿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.

TEMA: Salida verbal con Arduino con WTV202M01

Salida verbal con Arduino con WTV202M01 4 años 7 meses ago #6157

  • msantos1937
  • msantos1937's Avatar
  • DESCONECTADO
  • Navegador Iniciado
  • Temas: 2
  • Karma: 0
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 (8):
--- 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.147 seconds