Arduino telephone caller ID system

I’ve just completed an Arduino Nano based telephone caller line identification system so that I can display details of incoming calls to the fixed network telephone at home on a custom display. The final version I intend will have a display large enough so my wife can read it with out hunting around for her spectacles before hand. This initial development is a proof of concept and usable prototype, although it has already quite a number of features including an IR remote control to page through a telephone call history etc. Of course, it may not stop there. Apart from the larger display, I’ve been thinking about adding a white list based spam filter, so unknown callers drop silently after a period onto an voice mail box. But that is a bit in the future.

The main core of this development is a software modem based on the work of markqvist who maintains an Arduino modem library for APRS (Amateur Packet Radio System) enthusiasts on his site The telephone caller line identification information (CLID) is transmitted in a similar format to APRS data, but with a single byte serial structure instead of a block packet framing, but it was relatively simple to take this solution and adapt it. For those interested in the details, the CLID is encoded using frequency shift keying [ref] using a Bell 202 / V23 format. If you’ve ever misdialed and ended up listening to a fax machine, you’ll already have heard some samples of this.

There are other solutions to this problem of interpreting the CLID, but most are based on obsolete, and difficult to obtain, chips. I wanted to build a solution without these dependencies, and have some fun/ learning experience at the same time. There is also at least one ATMEL assembler based example around but the one described here is entirely C/C++.

Here in Switzerland, as in quite a number of other countries (but apparently not the UK), the CLID is transmitted between the first and second ring bursts. In this solution, the demodulator part, however, simply waits until it finds the defined training sequences in the data stream, calibrates itself, then captures and parses the information and sends it for display and then storage in eeprom. It does not explicitly depend on the timing of the ring pulses. The data comes across in MDMF format which includes a telephone number, a timestamp (without year) and, if available, a subscriber name.

Of course, all this telephone technology is not state of the art. In fact it is refered to as POTS (plain old telephony system) which ISDN (integrated services digital network, but with also some less charitable expansions of this acronym) was intended to replace, which has itself been superceeded by VOIP (Voice over IP) technology. But yet it is still around. The glass fiber connected router I have now has an RJ11 socket for older style phones, although the network provider would also be happy to sell SIP/VOIP (Session Initiation Protocol) phones connected by ethernet or WLAN (Wireless LAN).


I’ve managed to create a PDF of the project description which has a small enough file size to fit here. This replaces the previous Word document. The pictures have suffered a slight quality loss during compression.

There is now an updated version here . It is an ESP8266 based PSTN caller ID system which has also an anti-spam feature.

CLID-Schematic-v1.00.pdf (98.8 KB) (13.8 KB)

CLID-doc-v1.01.pdf (702 KB)

Thank you brother for your contribution.

I have the phone Line. I have the circuit to connect it to the arduino pins.

My only concern is how I get the damn FSK Caller ID in the Serial Monitor of the arduino.

Would you help me with a library and a sample to get me started?

Have I understood correctly ?

You've built the circuit according to this design. You've loaded the software. However, you do not see anything in the serial monitor of the Arduino ?

Hello and thanks for your reply.

I mean I am looking for a library and some simple code that decodes the telephone signal and get me started.

In another post you were mentioning that: "The design uses a software demodulator based on the Arduino APRSlib ( "

I would ask if you can give me a link to this library of some other helpful information on how to use it.

Thank you


This is definitely not a beginners project. The main issues are conditioning the electrical signal, demodulating the FSK encoding to a digital bit stream, then interpreting it. Setting all that up and debugging is no trivial task, and really needs an oscilloscope although I did write a tool to assist with the testing

The library I extracted the demodulator part from is: . Again, that is an extremely comprehensive piece of software and probably won't make it any easier for you to get started.

The simplest version of a software Caller ID decoder I have produced is here. In the simplest case, you need only to build the server part. You do not need a client. However, it is still not a trivial exercise.

I'd suggest that you start with something like the following. You can still get the chips (HT9032) from some Ebay retailers, or you may find a complete module. With a simple sketch, you can get "something" on the serial monitor.

First I would like to thank you for your response and general contribution.

I am pretty experienced with PHP / MySQL but I am trying to build a different project.

I want to make a PC program that is triggered by an Incoming call and shows the user the history note for that caller !

The PC part for me is not the difficult part.

The most difficult part for me is simply to get the phone number in the Arduino. Then a listener on the PC will get the Serial message and trigger the rest of the program.

I have to build the circuit. I have to order some of the parts like the transformer (isolator) and the mcp6002 amplifiers)

It will take some time. When I start I will post about it in the forums.

If you are integrating it with a PC, you may be happier with this version:

I included a power shell client example to collect the results over a serial connection. You'd still have to parse the results to identify date, time, number, message waiting flags etc.