Remote Control With a Cell Phone Call Via Tone Decoder
by ymaogar in Circuits > Remote Control
11 Views, 0 Favorites, 0 Comments
Remote Control With a Cell Phone Call Via Tone Decoder
In telecommunications, DTMF (Dual-tone multi-frequency), also known as multi-frequency system and/or tone dialing system, is a signaling of analog telephone lines, consisting of pairs of audible tones that are handled in the range of frequencies of the human voice and are obtained when the buttons of an alphanumeric keyboard are pressed.
A valid DTMF signal can be obtained by the sum of two tones, one from a high frequency group and a low frequency group; each group contains 4 individual tones. Each tone will be made up of cosines that correspond to a high frequency and another low sequence, in addition, it can decode the numbers from 0 to 9, symbols such as '*' and '#', additionally it has some letters such as: ' A', 'B', 'C' and 'D'.
Supplies
dtmf decoder mt8870
relay module
microcontroler (arduino, PIC)
3.5 jack audio cable
transistors
leds
Understanding the Tone Decoder
The MT8870CE manufactured by MITEL is a specialized electronic circuit to perform the task to decode the double tones generated by the keyboard of a telephone in digital mode, these tones are decoded and then converted to 4-bit binary quantities corresponding to a given numerical value. These binary values work as commands or data according to the order in which they are entered into the control system. This DTMF signal decoder is provided in addition to the features already mentioned, from a terminal indicating whether a valid DTMF signal has been received, decoded and its corresponding binary code captured in the output register, this terminal is called StD.
To carry out the tone decoding test, we used an android mobile phone with the DTMF tone generator application, as well as a ZTE-G R228 phone, which allowed us to connect the headset and answer and hang up a call, as well as send the audio signal. required for the CM8870.
Circuit
este proyecto lo tenia guardado entre mis archivos y algunas cosas se me ha perdido pero intentare explicar de forma breve la lógica de funcionamiento, lo esencial es desde una llamada con el celular podemos controlar el encendido apagado de alguna maquina por medio de los tonos generados al marcar los números en la llamada, entonces necesitamos 1 celular para realizar la llamada y al otro lado (a distancia) cerca a la maquina un celular conectado al decodificador, luego al microcontrolador y de sus salidas unos relés que actúan como switch de alguna maquina
Code in Microchip 16f887
#INCLUDE<16F887.H>
#FUSES NOWDT, NOPUT, INTRC_IO, NOMCLR, NOPROTECT, NOWRT, NOBROWNOUT
#USE DELAY (internal = 8MHZ)
#USE FAST_IO(b)
#USE FAST_IO(C)
INT llamada,contrasena,n1,n2,n3,n4,n5,n6,n7,n8,n9,n0,numeral,asterisco;
INT16 i;
INT codigo=0;
#int_TIMER1
void tmr1() //cada 1/4 de segundo suma 1
{
set_timer1(3036);
i++;
}
#int_rb//interrupción para leer el purto b solo cuando el pin b6(std) este activado
void pulso()
{
if(input(pin_b6)==1)
{
codigo=input_b();
codigo=(codigo)&(0xf);
set_timer1(3036);//reinicia el timer cada vez que se presiona una tecla
i=0;
}
}
void colgar()
{
if(i==240)
{
llamada=0;
i=0;
output_high(pin_c0);//Envia un pulso para colgar la llamada
delay_ms(150);
output_low(pin_c0);
output_high(pin_c7);
delay_ms(250);
output_low(PIN_c7);
}
}
void restart() //Este subprograma reinicia las variables n0-Numeral
{
n1=0; n2=0; n3=0; n4=0; n5=0; n6=0; n7=0; n8=0; n9=0; n0=0; numeral=0, asterisco=0;
}
void prueba()//Función en el que se definen las teclas que se pulsan y que pin debe activar para en cada caso
{
if((n8==1)&&(n9==1)&&(n7==1))
{
contrasena=1;
output_high(pin_c7);
delay_ms(750);
output_low(pin_c7);
restart();
}
if((n2==1)&&(n1==1)&&(numeral==1)&&(contrasena==1))
{
output_low(pin_c1);
output_high(pin_c7);
delay_ms(250);
output_low(pin_c7);
restart();
}
if((n2==1)&&(n1==1)&&(asterisco==1)&&(contrasena==1))
{
output_high(pin_c1);
output_high(pin_c7);
delay_ms(250);
OUTPUT_LOW(PIN_C7);
restart();
}
if((n3==1)&&(n1==1)&&(numeral==1)&&(contrasena==1))
{
output_low(pin_c2);
output_high(pin_c7);
delay_ms(250);
output_low(pin_c7);
restart();
}
if((n3==1)&&(n1==1)&&(asterisco==1)&&(contrasena==1))
{
output_high(pin_c2);
output_high(pin_c7);
delay_ms(250);
output_low(pin_c7);
restart();
}
if((n4==1)&&(n1==1)&&(numeral==1)&&(contrasena==1))
{
output_low(pin_c3);
output_high(pin_c7);
delay_ms(250);
output_low(pin_c7);
restart();
}
if((n4==1)&&(n1==1)&&(asterisco==1)&&(contrasena==1))
{
output_high(pin_c3);
output_high(pin_c7);
delay_ms(250);
output_low(pin_c7);
restart();
}
if((n5==1)&&(n1==1)&&(numeral==1)&&(contrasena==1))
{
output_low(pin_c4);
output_high(pin_c7);
delay_ms(250);
output_low(pin_c7);
restart();
}
if((n5==1)&&(n1==1)&&(asterisco==1)&&(contrasena==1))
{
output_high(pin_c4);
output_high(pin_c7);
delay_ms(250);
output_low(pin_c7);
restart();
}
if((n6==1)&&(n1==1)&&(numeral==1)&&(contrasena==1))
{
output_low(pin_c5);
output_high(pin_c7);
delay_ms(250);
output_low(pin_c7);
restart();
}
if((n6==1)&&(n1==1)&&(asterisco==1)&&(contrasena==1))
{
output_high(pin_c5);
output_high(pin_c7);
delay_ms(250);
output_low(pin_c7);
restart();
}
if(asterisco==1||numeral==1||n9==1) restart();
}
void contestar()
{
delay_ms(3000);
output_high(pin_c0);//Envia un pulso para contestar la llamada
delay_ms(150);
output_low(pin_c0);
output_high(pin_c7);//INndica que se establece la llamada
delay_ms(250);
output_low(PIN_C7);
llamada=1;
}
void main()
{
set_tris_c(0); //Ponemos como salidas todos los puertos del puerto C
output_c(0); //Pone todas en cero todas las salidas del puerto C
set_tris_b(255); // Ponemos todo el puerto B como entrada
output_b(0);
setup_timer_1(t1_internal|t1_div_by_8); //se configura el timer1
set_timer1(3036);
enable_interrupts(int_timer1);//se habilita el timer 1
enable_interrupts(int_rb6);//se habilita la interrupcion rb
enable_interrupts(global);//se habilitan todas las interrupciones
while(true)
{
contestar();
while(llamada==1) //lee el teclado solo si la llamada se contesta
{
colgar();
SWITCH(codigo)
{
CASE 1: //ESTA ENTRADA REPRESENTA QUE EL NUMERO UNO SE PRECIONÓ
n1=1;//PONEMOS EN UNO N1
BREAK;
CASE 2: //ESTA ENTRADA REPRESENTA QUE EL NUMERO DOS SE PRECIONÓ
n2=1; //PONEMOS EN UNO N2
BREAK;
CASE 3: //ESTA ENTRADA REPRESENTA QUE EL NUMERO TRES SE PRECIONÓ
n3=1; //PONEMOS EN UNO N3
BREAK;
CASE 4: //ESTA ENTRADA REPRESENTA QUE EL NUMERO CUATRO SE PRECIONÓ
n4=1; //PONEMOS EN UNO N4
BREAK;
CASE 5: //ESTA ENTRADA REPRESENTA QUE EL NUMERO CINCO SE PRECIONÓ
n5=1; //PONEMOS EN UNO N5
BREAK;
CASE 6: //ESTA ENTRADA REPRESENTA QUE EL NUMERO SEIS SE PRECIONÓ
n6=1; //PONEMOS EN UNO N6
BREAK;
CASE 7: //ESTA ENTRADA REPRESENTA QUE EL NUMERO SIETE SE PRECIONÓ
n7=1; //PONEMOS EN UNO N7
BREAK;
CASE 8: //ESTA ENTRADA REPRESENTA QUE EL NUMERO OCHO SE PRECIONÓ
n8=1; //PONEMOS EN UNO N8
BREAK;
CASE 9: //ESTA ENTRADA REPRESENTA QUE EL NUMERO NUEVE SE PRECIONÓ
n9=1; //PONEMOS EN UNO N9
BREAK;
CASE 10: //ESTA ENTRADA REPRESENTA QUE EL NUMERO CERO SE PRECIONÓ
n0=1; //PONEMOS EN UNO N0
BREAK;
CASE 11: //ESTA ENTRADA REPRESENTA QUE EL ASTERISCO SE PRECIONÓ
asterisco=1;
BREAK;
CASE 12: // ESTA ENTRADA REPRESENTA QUE EL ENTER SE PRECIONÓ
numeral=1;
BREAK;
}
prueba();//se activa la funcion prueba
}
}
}