Thursday, November 22, 2012

Producing DTMF Tones

I wanted to teach my Arduino to talk telephone, so I added a HT9000A DTMF chip to produce the familiar "touch tones" (upcoming projects will act upon "heard" DTMF tones, but with a different chip).

The output is really low volume, so you may want to plug in amplified speakers or use an input on your stereo. You could build an amplifier circuit with a LM386 as well.

I used an Ham Radio program that listens for touch tones and displays the number it hears to verify operation.

The code I used (and modified) was built by Brohogan.(don't forget the include file)

/* HT9200A DTMF Generator Test                             BroHogan 7/17/09
 * SETUP FOR SERIAL MODE - Requires 3 pins - Data and Clock (100KHz) and CE
 * Wire per data sheet - 3.57MHz xtal (4.0MHz won't dial) S/P to GND = serial
 * modified by Steve Spence -

#include <HT9200.h>                     // defines for HT9200 DTMF chip
#define DATA_PIN   2                    // Data (serial)
#define CLOCK_PIN  3                    // Clock (serial)
#define CE_PIN     4                    // Chip Enable pin (must control)

#define PHONE_NMBR "2642262"         // phone # to dial
char PhoneNum[] = PHONE_NMBR;           // load phone # for dialer

void setup() {
  pinMode(DATA_PIN, OUTPUT);
  pinMode(CE_PIN, OUTPUT);
  Init_HT9200();                        // init the chip

void loop() {
  Dialer();                             // dials phone

void Init_HT9200 (){
  digitalWrite(CE_PIN, HIGH);           // start with chip disabled (else you go nuts)
  digitalWrite(CLOCK_PIN, HIGH);        // start with clock pin high
  digitalWrite(CE_PIN, LOW);            // now enable the chip
  delay(10);                            // delay 10ms to ramp up the ocillator
  DTMF_Out (DTMF_OFF,1,0);              // turn off any tone from previous run

void DTMF_Out (byte digit, long duration, long pause){  // FOR SERIAL COMM
  if (digit == 0) digit = 10;           // take care of 0 here
  for (byte i=0; i<5 br="br" i="i">    digitalWrite(CLOCK_PIN, HIGH);      // clock high while setting data
    digitalWrite(DATA_PIN, bitRead(digit,i)); // set data LSB->MSB
    delayMicroseconds(5);               // 1/2 of 100K Clock speed
    digitalWrite(CLOCK_PIN, LOW);       // clock low to latch data
    delayMicroseconds(5);               // 1/2 of 100K Clock speed
  delay(duration);                      // how long tone will play
  if (pause != 0){                      // tone sounds continuously if zero
    for (byte i=0; i<5 above="above" as="as" br="br" i="i" nbsp="nbsp" same="same">      digitalWrite(CLOCK_PIN, HIGH);
      digitalWrite(DATA_PIN, bitRead(DTMF_OFF,i));
      digitalWrite(CLOCK_PIN, LOW);
    delay(pause);                       // how long pause between tones

void Dialer(){  // dials tones from number
  for (byte i=0; i<7 i="i" nbsp="nbsp" p="p"> //i<7 11="11" 7="7" br="br" digit="digit" for="for" i="i" number="number">    DTMF_Out(PhoneNum[i]-'0',500,100);  // 1/2 sec tone with 1/10 pause


  1. fatal error: HT9200.h: No such file or directory

    #include // defines for HT9200 DTMF chip

    It shows me this error every time I try to compile this code.
    if it is due to header file. where can i find this file?
    i downloaded library but still there is no header file with it.

    1. The contents of the included file, HT9200.h, are posted in the link. That is the "library". You have to create the file with the below contents as mentioned in the forum:

      /* HT9200.h defines for HT9200 DTMF chip in serial mode */

      #define DTMF_OFF 24 // SB 31 but next cmd will be lost - a not used cmnd# works fine
      #define STAR 11
      #define POUND 12
      #define A_KEY 13
      #define B_KEY 14
      #define C_KEY 15
      #define D_KEY 0

      // pure frequencies that can be made by the chip . . .
      #define HZ_697 16
      #define HZ_770 17
      #define HZ_852 18
      #define HZ_941 19
      #define HZ_1209 20
      #define HZ_1336 21
      #define HZ_1477 22
      #define HZ_1633 23

  2. Im using arduino uno and ht9200a not work. no sound

    1. Audio output is low, should run it through a amplified speaker.

  3. Hi it worked for me, but I have strange like chirping noise, why is that? Thanks :)


Related Posts Plugin for WordPress, Blogger...