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 ![]()
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.