Phone/DTMF tones to over 30 different load control with relay board

Hi guys,

I have just bought a MT8870 DTMF Voice Decoder Controller Module on ebay (the link is below) and the seller sent me an Arduino code.

The code that seller sent me was like that

#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;
  } 
  
 }
 
}

I have modified the code because I need to control over 4 diffrent load. This code is working for 12 different load control.

#include <FlexiTimer2.h>

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

byte CH1 = 2;
byte CH2 = 3;
byte CH3 = 4;
byte CH4 = 5;
byte CH5 = 6;
byte CH6 = 7;
byte CH7 = 8;
byte CH8 = 9;
byte CH9 = 10;
byte CH10 = 11;
byte CH11 = 12;


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);
  pinMode(CH6, OUTPUT);
  pinMode(CH7, OUTPUT);
  pinMode(CH8, OUTPUT);
  pinMode(CH9, OUTPUT);
  pinMode(CH9, OUTPUT);
  pinMode(CH10, OUTPUT);
  pinMode(CH11, OUTPUT);
  pinMode(CH12, OUTPUT);
  

  digitalWrite(CH1, HIGH);
  digitalWrite(CH2, HIGH);
  digitalWrite(CH3, HIGH);
  digitalWrite(CH4, HIGH);
  digitalWrite(CH5, HIGH);
  digitalWrite(CH6, HIGH);
  digitalWrite(CH7, HIGH);
  digitalWrite(CH8, HIGH);
  digitalWrite(CH9, HIGH);
  digitalWrite(CH10, HIGH);
  digitalWrite(CH11, HIGH);
  digitalWrite(CH12, 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;
      case 5 : Serial.print(" Activate : Channel 5 \n" ); digitalWrite(CH5, LOW); delay(delay_time); digitalWrite(CH5, HIGH); break;
      case 6 : Serial.print(" Activate : Channel 6 \n" ); digitalWrite(CH6, LOW); delay(delay_time); digitalWrite(CH6, HIGH); break;
      case 7 : Serial.print(" Activate : Channel 7 \n" ); digitalWrite(CH7, LOW); delay(delay_time); digitalWrite(CH7, HIGH); break;
      case 8 : Serial.print(" Activate : Channel 8 \n" ); digitalWrite(CH8, LOW); delay(delay_time); digitalWrite(CH8, HIGH); break;
      case 9 : Serial.print(" Activate : Channel 9 \n" ); digitalWrite(CH9, LOW); delay(delay_time); digitalWrite(CH9, HIGH); break;
      case 10 : Serial.print(" Activate : Channel 10 \n" ); digitalWrite(CH10, LOW); delay(delay_time); digitalWrite(CH10, HIGH); break;
      case 11 : Serial.print(" Activate : Channel 11 \n" ); digitalWrite(CH11, LOW); delay(delay_time); digitalWrite(CH11, HIGH); break;
      case 12 : Serial.print(" Activate : Channel 12 \n" ); digitalWrite(CH12, LOW); delay(delay_time); digitalWrite(CH12, HIGH); break;
      default : Serial.print("Invalid channel \n" );  break;
    }

  }

}

But I need to control over 30 load via Arduino MEGA :slightly_frowning_face:

I want to control the loads like this:
if I pressed '' and then '0' and then '1', and then '#', first load should be active,
if I pressed '
' and then '0' and then '2', and then '#', second load should be active,




if I pressed '*' and then '3' and then '0', and then '#', thirtyth load should be active.

How Arduino do these actions?

Thanks for your valued contributions.

The link for 4 channel control code & library
http://www.canton-electronics.com/product_extra_files/ARDUINO DTMF(CE005).zip