DTMF? and caller ID info

HI all,
I am new to the arduino community and have searched the board for these topics and found nothing.
Just wondering if the arduino can detect DTMF and decode Caller ID info.

also where can I find a complete list of functions and spefs. like how much flashram does the arduino have.
Charlie B.

I am new to the arduino community and have searched the board for these topics and found nothing. Just wondering if the arduino can detect DTMF and decode Caller ID info.

I've got some code and a circuit to connect an 8870 DTMF decoder, but nothing to do it in software.

also where can I find a complete list of functions and spefs. like how much flashram does the arduino have.

16k flash program storage, 2k RAM, and (I think) 1k EEPROM data storage. Check out the ATmega168 datasheet at www.atmel.com for complete details.


wow it is a ham radio festival in here. I am an ex VE3!

Anyway, KG4MXV, I would look in older copies of the HR Handbook, for hardware decoders. IIRC there is a DTMF chip available that does the trick.


Try to look at this project.


It uses a Basic stmp and a SSI-202 chip.

MikMo http://www.mikmo.dk

I was curious about doing the DTMF in software; a google link returned this project that uses an ATMEGA1281 to do it in sfotware. http://www.rtzaudio.com/kg4lne/micro-rc.asp

And it's by a KG4 ham operator.. KG4 must be the world centre for repeater/DTMF work! Anyway, he has posted full code and schematics.


I wonder if this got anywhere? I was thinking it'd be nice to have a CallerID with set numbers that would light one LED to mean "just the in-laws, no emergency". It'd be easier to identify my interest in the call from across the room that way.

Hi Flickerfly,

A few years ago I wrote a whole lot of telecom tone generation and detection stuff in PIC assembler, with the aim of getting 2 PICs to talk over the phoneline using a software generated V23 modem.

I wanted a cheap way of getting trivial data from remote sensors, and before Pachube, and "always on" broadband, the standard PSTN phone line seemed an attractive possibility.

Over the course of the project (and several years) I got the following building blocks to work:

DTMF generation DTMF decoding in firmware V23 modem sending V23 modem reception Auto answer on recognised Caller ID

The whole lot is documented on the Yahoo Group "rat_ring"

It's not just the firmware, you also need to know how to connect a micro safely and cheaply to the incoming phone line - and the rat_ring has a 40 page tutorial describing the interfacing techniques.

My Called ID interface was just 4 diodes in a bridge and a single NPN transistor to amplify the Caller ID signal and get it into the digital input pin of the PIC. I like minimalist designs!

So my suggestion is that anything that can be done on a PIC can be done on an AVR, and most things that are done in assembler can be done in C.

Somewhere I have a firmware Caller ID decode program written in AVR C.

With a little bit of encouragement (and assistance with C) , I could be persuaded to get this stuff to run on an Arduino.

The other possibility is to graft on a cheap V23/Bell 202 modem chip onto the Arduino. Have a look at the CMX86X series from Consumer Microcircuits Ltd, (CML). These connect via a serial bus and have DTMF send receive, and V23/Bell 202 send receive all in the one cheap device.




Here's an application note that appeared on AVRfreaks running a FSK modem on an ATmega 8 - just what you need for software based Caller ID.


Basically you need to amplify the caller ID FSK signal so that it is an approximate square wave, but still contains the timing information of the original sine signal contained in the edges.

By using a timer to time the period between edges you can determine whether the sigmal is high tone or low tone ( Bell 202 standard uses 1200Hz to represent a "1" and 2200Hz to represent a "0" - see this Wiki http://en.wikipedia.org/wiki/Bell_202_modem ) The firmware just sets a digital output high if it detects 1200Hz or sets it low if it sees 2200Hz. The toggling digital output represents a crude demodulation of the serial data.

To accurately decode this, I found that if you feed the waggling digital output back into the Rx pin of the UART (set for 1200 baud reception), it re-times it nicely and produces clean error free data.

I developed the code to the point where the PIC would only answer calls from certain incoming numbers - such as my cell phone, and let all others just ring the phone normally. This would allow you to access for example a home automation device which you could then control with DTMF tones sent from the cell phone.

Alternatively a remote sensor connected to a phone line would only answer calls from a central server, and ignore all other voice calls - thus sharing the phone line with the householder. This works well in Europe where the Caller ID signal is put onto the line BEFORE the first ring, and so it is possible for the micro to pick-up the call before the phone actually rings - allowing the server to call at any time of day or night without disturbing the household.


Hi there, we have a solution for decoding of DTMF using an Arduino board but it is based on the GSM Module and DTMF Decoder. :wink:

Even this is older, I just wonder how the story ends ?

Is there a layout for the 8870 NF Part already ?

This thread is owned by HAM RADIO, never knew why ;D

I'll revive this old thread ;) it came up first in a search for arduino and caller-id.

I'm annoyed by telemarketers and bill collectors that have the wrong person and yet still won't remove me from their list. I want to have a 'gate' that opens and closes based on passing a pass/block list. if the pattern or string matches, the relay clicks and the phone can ring. if the number is on the block list, the relay stays open and the call is logged but the phone is never rung. ie, I'm not disturbed by the idiots ;)

anyone have anything that does stuff close to this?

what I'm thinking of using is a regular modem that supports callerid and has true serial out. that could go into soft-serial or the real serial port on the arduino. it should not be hard to send the setup string to the modem (to enable callerid) and then poll the serial port waiting for incoming calls.

what I have not found is any good regex style pattern matcher for the arduino. anyone have one or any ideas?

I suppose I'll also need to have some storage. maybe sd-card is the right thing to use. you can have a larger white/black list as a file on the card and you can also log data to the card. I suppose a pc app could also be written to manage larger lists on the card and then use the arduino simply as an engine to permit/deny calls based on the pattern match.

Take a look at FreeSWITCH or Asterisk.