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

portada.png

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

imagen_2022-09-17_131937009.png
MT8870_580x.jpg
MT8870 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

circuito.png
representacion proyecto.jpg

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

 }

 }

}