Decoding DTMF with Arduino and the MT8870

MT8870 demonstrationLast August I was experimenting with DTMF (dual-tone multi-frequency) and Arduino. I posted a video on YouTube that illustrates a proof-of-concept using the MT8870 tone decoder chip.

A few people have asked me to include the code and schematics for this demonstration: the code is below, and the schematics were derived from the MT8870 datasheet. Look for the figure titled “Single-Ended Input Configuration.”

/***********************************************************
 DTMF Decoding with MT8870 chip
************************************************************/
int keyvalue;  // the number associate with the tone

void setup()
{
 Serial.begin(9600);
 pinMode(6, INPUT); //input binary 1's digit from decoder chip
 pinMode(7, INPUT); //input binary 2's digit from decoder chip
 pinMode(8, INPUT); //input binary 4's digit from decoder chip
 pinMode(9, INPUT); //input binary 8's digit from decoder chip
}

void loop()

// first determine the base ten value of the key, from 0-11
{
 if (digitalRead(6) == HIGH) //if binary 1's is high
 {
 keyvalue = 1;  //make keyvalue equal 1
 }
 else
 {
 keyvalue = 0;  //otherwise make it zero
 }

 if (digitalRead(7) == HIGH)  //if binary 2's is high
 {
 keyvalue = keyvalue + 2;  //add "2" to keyvalue
 }
 if (digitalRead(8) == HIGH)  //if binary 4's is high
 {
 keyvalue = keyvalue + 4;  //add "4" to keyvalue
 }
 if (digitalRead(9) == HIGH)  //if binary 8's is high
 {
 keyvalue = keyvalue + 8;  //add "8" to keyvalue
 }
 // now convert keyvalues 9, 10 and 11 to "0", "*" and "#"
 if (keyvalue == 10)
 {
 Serial.println("0"); //print zero key
 }
 else
 {
 if (keyvalue == 11)
 {
 Serial.println("*"); //print asterisk key
 }

 else
 {
 if (keyvalue == 12)
 {
 Serial.println("#"); //print pound key
 }

 else
 {
 Serial.println(keyvalue); //it isn't a special key so just print it
 }
 }
 }
 delay(100);
}

Creative Commons License
Decoding DTMF with Arduino and the MT8870 by Michael B LeBlanc is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 2.5 Canada License.
Permissions beyond the scope of this license may be available at mleblanc@nscad.ca.

3 thoughts on “Decoding DTMF with Arduino and the MT8870”

  1. Hi Ben, Don’t mind at all… I get what you’re doing with the MT8870 and the Arduino, but I’m not clear about how you’ve placed them in between your telephone and what looks like a VOIP modem. I don’t suppose your arrangement would work with old fashioned POTS (plain old telephone service)?

Leave a Reply

Your email address will not be published. Required fields are marked *