activar 8 reles con modulo DTMF DT8870 - (SOLUCIONADO)

Hola buenas tardes, ya busque en google y no he encontrado ningun proyecto con DTMF DT8870
Necesito activar 8 reles, activarlos con cada numero del telefono, alguien me podria ayudar a confeccionar el codigo y el esquema de conexion, gracias

No has buscado ni siquiera bien.
Busca en google Arduino DT8870

lee bien el post antes de responder, asi no hay problemas
Google nada de lo que estoy preguntando en post

fernando3110:
lee bien el post antes de responder, asi no hay problemas
Google nada de lo que estoy preguntando en post

pues lo siento pero tengo que dar la razón a nuestro amigo Surbyte en este caso, no solo que hay en los resultados de la búsqueda ejemplos de lo que necesitas sino que son todo ejemplos de exactamente eso ya que ese integrado solo sirve para eso descodificar el tono en cuestión

Ahora bien si aun así no sabes ni por donde empezar eso ya es otro tema...

Te recomiendo que leas las normas del foro y aprendas a buscar antes de postear como lo has hecho.
Aca no le hacemos el código a nadie y si queres ayuda personalizada te digo lo mismo que le digo a muchos, para ello hay que pagar el tiempo de los demas. Y no te alarmes, las Normas del Foro lo contemplan.

Lo que te puse para que busques en google es la manera de introducirte a tu problema.
Un DTMF DT8870 no es mas que un simple circuito que convierte pulsos DTMF en un código BCD.
Si ese código BCD se lo introduces a 4 entradas del Arduino pues sabes que tecla presionaste, y con cada tecla luego enciendes la salida relé que gustes.

Dime entonces si lo que te he proporcionado con Google: Arduino DT8870 no es parte de la solución a tu problema.
Ahora si lo que buscas es el código perfecto para que conectes un DT8870 y accione exactamente la salida rele que tu pretendes, realmente le asignas mucho a la suerte que alguien en el mundo haya pensado lo mismo que tu necesitas.

Asi que volvamos a Google : Arduino DT8870, obtuve esto

el que dice Arduino Basic: MT8870 DTMF - dual tone multi Frequenc... es el que debes hacer click como ahora te lo he puesto.
Claro que el artículo no comando 8 reles pero comanda otra cosa, un servo.
ahora cuando detectas cada tecla obtienes un BCD y con ese BCD armas un switch case que según el número activará una salida.

Tienes resuelto el tema.

Tengo este codigo pero me marca 1,2,3,4 y necesito 2,4,6,8

Alguien me puede guiar que tengo que cambiar

"
#include <FlexiTimer2.h>

int STD = A0;
int Q1 = A1;
int Q2 = A2;
int Q3 = A3;
int Q4 = A4;

int CH1 = 2;
int CH2 = 3;
int CH3 = 4;
int CH4 = 5;

unsigned char Q_dat = 0x00;
unsigned char STDat_cnt = 0x00;
unsigned char Decod_finished = 0x00;

int delay_time = 500;//500 ms

//Check once every 5 ms
void dtmf_decode(void)
{

int STD_State = 0;
int IO_State = 0;

STD_State = digitalRead(STD);

//STD Rising edge
if(STD_State) {if(STDat_cnt < 100) STDat_cnt ++;} else STDat_cnt = 0;

if(STDat_cnt==3)//Pulse width greater than 15MS
{
Q_dat = 0x00;

IO_State = digitalRead(Q1);
if(IO_State) Q_dat = 0x01;

IO_State = digitalRead(Q2);
if(IO_State) Q_dat |= 0x02;

IO_State = digitalRead(Q3);
if(IO_State) Q_dat |= 0x04;

IO_State = digitalRead(Q4);
if(IO_State) Q_dat |= 0x08;

Decod_finished = 0xff;//Complete the decoding

}

}

void setup()
{
// initialize the DTMF Decoding module as an output.
pinMode(STD, INPUT);
pinMode(Q1, INPUT);
pinMode(Q2, INPUT);
pinMode(Q3, INPUT);
pinMode(Q4, INPUT);

pinMode(CH1, OUTPUT);
pinMode(CH2, OUTPUT);
pinMode(CH3, OUTPUT);
pinMode(CH4, OUTPUT);

digitalWrite(CH1, HIGH);
digitalWrite(CH2, HIGH);
digitalWrite(CH3, HIGH);
digitalWrite(CH4, HIGH);

Serial.begin(9600);

//Enable Timer2
FlexiTimer2::set(5, 1.0/1000, dtmf_decode); // call every 5 1ms "ticks"
FlexiTimer2::start();
}

void loop()
{

//Complete the decoding
if(Decod_finished)
{
Decod_finished = 0;

switch(Q_dat){
case 1 : Serial.print(" Activate : Channel 1 \n" ); digitalWrite(CH1, LOW);delay(delay_time);digitalWrite(CH1, HIGH); break;
case 2 : Serial.print(" Activate : Channel 2 \n" ); digitalWrite(CH2, LOW);delay(delay_time);digitalWrite(CH2, HIGH);break;
case 3 : Serial.print(" Activate : Channel 3 \n" ); digitalWrite(CH3, LOW);delay(delay_time);digitalWrite(CH3, HIGH); break;
case 4 : Serial.print(" Activate : Channel 4 \n" ); digitalWrite(CH4, LOW); delay(delay_time);digitalWrite(CH4, HIGH);break;
default : Serial.print("Invalid channel \n" ); break;
}

}

}
"

#include <FlexiTimer2.h>

int STD = A0;
int Q1 = A1;
int Q2 = A2;
int Q3 = A3;
int Q4 = A4;

int CH1 = 2;
int CH2 = 3;
int CH3 = 4;
int CH4 = 5;

unsigned char Q_dat = 0x00;
unsigned char STDat_cnt = 0x00;
unsigned char Decod_finished = 0x00;

int delay_time = 500;//500 ms

//Check once every 5 ms
void dtmf_decode(void)
{
   
   int STD_State = 0;
   int IO_State = 0;
   
    STD_State = digitalRead(STD);
    
    //STD  Rising edge
    if(STD_State) {if(STDat_cnt < 100) STDat_cnt ++;}  else STDat_cnt = 0;

    if(STDat_cnt==3)//Pulse width greater than 15MS
   {
    Q_dat = 0x00;
    
    IO_State = digitalRead(Q1);
    if(IO_State) Q_dat = 0x01;
    
    IO_State = digitalRead(Q2);
    if(IO_State) Q_dat |= 0x02;
    
    IO_State = digitalRead(Q3);
    if(IO_State) Q_dat |= 0x04;
    
    IO_State = digitalRead(Q4);
    if(IO_State) Q_dat |= 0x08;
    
    Decod_finished = 0xff;//Complete the decoding
   
   }

}

void setup()
{
   // initialize the DTMF Decoding module as an output.
    pinMode(STD, INPUT); 
    pinMode(Q1, INPUT);
    pinMode(Q2, INPUT);
    pinMode(Q3, INPUT);
    pinMode(Q4, INPUT);
    
    pinMode(CH1, OUTPUT);
    pinMode(CH2, OUTPUT);
    pinMode(CH3, OUTPUT);
    pinMode(CH4, OUTPUT);
    
    digitalWrite(CH1, HIGH);
    digitalWrite(CH2, HIGH);
    digitalWrite(CH3, HIGH);
    digitalWrite(CH4, HIGH);
    
    Serial.begin(9600);
    
   //Enable Timer2
   FlexiTimer2::set(5, 1.0/1000, dtmf_decode); // call every 5 1ms "ticks"
   FlexiTimer2::start();
}

void loop()
{

  //Complete the decoding
 if(Decod_finished)
 {
  Decod_finished = 0;
   
   switch(Q_dat){
    case 1 : Serial.print(" Activate : Channel 1 \n" ); digitalWrite(CH1, LOW);delay(delay_time);digitalWrite(CH1, HIGH); break;
    case 2 : Serial.print(" Activate : Channel 2 \n" ); digitalWrite(CH2, LOW);delay(delay_time);digitalWrite(CH2, HIGH);break;
    case 3 : Serial.print(" Activate : Channel 3 \n" ); digitalWrite(CH3, LOW);delay(delay_time);digitalWrite(CH3, HIGH); break;
    case 4 : Serial.print(" Activate : Channel 4 \n" ); digitalWrite(CH4, LOW); delay(delay_time);digitalWrite(CH4, HIGH);break;
    default : Serial.print("Invalid channel \n" );  break;
  } 
  
 }
 
}

Bien, copiaste el código de la página que supuestamente no servía. O sea que te ayudé!!
Dejemosnos de pavadas y ahora a trabajar, fernando3110.

Cual es el problema?
Porque no te sirve 1,2,4,8 y queres necesito 2,4,6,8? Esta secuencia no es binaria
1,2,4,8 es una secuencia de peso binario pero 2, 4, 6, 8 no viene bien hasta el 6 que no tiene sentido.

Podes explicarlo asi te ayudamos.
Que esta mal o no hace o que necesitas?

necesito 2,4,6,8 por que es para un proyecto para personas con discapacidad motriz es mas facil que se comuniquen precionando el 2 si quieren ir hacia adelante, el 8 atras asi sucesivamente como si fuera con comando de control y no estar precionando 1,2,3 que no tiene sentido en este proyecto, creo que se entiende cual es mi problema, encontre otro proyecto ruso pero hay que ponerle adelante del numero un # y eso tampoco me sirve, saludos

Excelente. Hubieras empezado justamente de ese modo.
Ok. La rutina de detección detecta cualquier tecla, asi que no entiendo porque consideras que esos 1,2,4,8 son teclas.
No lo son.
Q_dat te devuelve el valor presionado, de modo que tu solo modifica esta parte para accionar las teclas que gustes, 2,4,6,8 seria

switch(Q_dat){
    case 2 : Serial.print(" Activate : Channel 1 \n" ); digitalWrite(CH1, LOW);delay(delay_time);digitalWrite(CH1, HIGH); break;
    case 4 : Serial.print(" Activate : Channel 2 \n" ); digitalWrite(CH2, LOW);delay(delay_time);digitalWrite(CH2, HIGH);break;
    case 6 : Serial.print(" Activate : Channel 3 \n" ); digitalWrite(CH3, LOW);delay(delay_time);digitalWrite(CH3, HIGH); break;
    case 8 : Serial.print(" Activate : Channel 4 \n" ); digitalWrite(CH4, LOW); delay(delay_time);digitalWrite(CH4, HIGH);break;
    default : Serial.print("Invalid channel \n" );  break;
  }

Se ve? Lo manejas a tu gusto porque esa rutina ya leyó la tecla y puede ser cualquiera del teclado DTMF.
Solo las que estan en los case serán procesadas y las demas emitirán un "invalid channel"

ok muchisimas gracias esta noche lo pruebo y comento los resultados

Con la ayuda que me diste andubo perfecto y con esa explicacion hasta pude agregar otra tecla mas ahi paso el codigo, mil gracias

#include <FlexiTimer2.h>

int STD = A0;
int Q1 = A1;
int Q2 = A2;
int Q3 = A3;
int Q4 = A4;

int CH1 = 3;
int CH2 = 4;
int CH3 = 5;
int CH4 = 6;
int CH5 = 8;

unsigned char Q_dat = 0x00;
unsigned char STDat_cnt = 0x00;
unsigned char Decod_finished = 0x00;

int delay_time = 500;//500 ms

//Check once every 5 ms
void dtmf_decode(void)
{
   
   int STD_State = 0;
   int IO_State = 0;
   
    STD_State = digitalRead(STD);
    
    //STD  Rising edge
    if(STD_State) {if(STDat_cnt < 100) STDat_cnt ++;}  else STDat_cnt = 0;

    if(STDat_cnt==3)//Pulse width greater than 15MS
   {
    Q_dat = 0x00;
    
    IO_State = digitalRead(Q1);
    if(IO_State) Q_dat = 0x01;
    
    IO_State = digitalRead(Q2);
    if(IO_State) Q_dat |= 0x02;
    
    IO_State = digitalRead(Q3);
    if(IO_State) Q_dat |= 0x04;
    
    IO_State = digitalRead(Q4);
    if(IO_State) Q_dat |= 0x08;
    
    Decod_finished = 0xff;//Complete the decoding
   
   }

}

void setup()
{
   // initialize the DTMF Decoding module as an output.
    pinMode(STD, INPUT); 
    pinMode(Q1, INPUT);
    pinMode(Q2, INPUT);
    pinMode(Q3, INPUT);
    pinMode(Q4, INPUT);
    
    pinMode(CH1, OUTPUT);
    pinMode(CH2, OUTPUT);
    pinMode(CH3, OUTPUT);
    pinMode(CH4, OUTPUT);
    pinMode(CH5, OUTPUT);
    
    digitalWrite(CH1, HIGH);
    digitalWrite(CH2, HIGH);
    digitalWrite(CH3, HIGH);
    digitalWrite(CH4, HIGH);
    digitalWrite(CH5, HIGH);
    
    Serial.begin(9600);
    
   //Enable Timer2
   FlexiTimer2::set(5, 1.0/1000, dtmf_decode); // call every 5 1ms "ticks"
   FlexiTimer2::start();
}

void loop()
{

  //Complete the decoding
 if(Decod_finished)
 {
  Decod_finished = 0;
   
   switch(Q_dat){
    case 2 : Serial.print(" Activate : Channel 1 \n" ); digitalWrite(CH1, LOW);delay(delay_time);digitalWrite(CH1, HIGH); break;
    case 4 : Serial.print(" Activate : Channel 2 \n" ); digitalWrite(CH2, LOW);delay(delay_time);digitalWrite(CH2, HIGH);break;
    case 6 : Serial.print(" Activate : Channel 3 \n" ); digitalWrite(CH3, LOW);delay(delay_time);digitalWrite(CH3, HIGH); break;
    case 8 : Serial.print(" Activate : Channel 4 \n" ); digitalWrite(CH4, LOW); delay(delay_time);digitalWrite(CH4, HIGH);break;
    case 5 : Serial.print(" Activate : Channel 4 \n" ); digitalWrite(CH5, LOW); delay(delay_time);digitalWrite(CH5, HIGH);break;
    default : Serial.print("Invalid channel \n" );  break;
  } 
  
 }
 
}

Ahora lo comprendiste perfectamente.

void dtmf_decode(void)
{
   int STD_State = 0;
   int IO_State = 0;  
    STD_State = digitalRead(STD);
    //STD  Rising edge
    if(STD_State) {
       if (STDat_cnt < 100) 
          STDat_cnt ++;
       } else 
          STDat_cnt = 0;

    if (STDat_cnt==3) { //Pulse width greater than 15MS
        Q_dat = digitalRead(Q1) + digitalRead(Q2)<<1 + digitalRead(Q3)<<2+ digitalRead(Q4)<<3;  
        Decod_finished = 0xff;//Complete the decoding
    }
  }

es lo mismo pero simplificando la suma binaria con peso 1,2,4,8
Esto <<1 es desplazamiento a la izquierda una posición, es multiplicar en binario.