the operation of this unit is honestly quite simple, in its most basic form, the announcer has one FXO port. information on what message is to be played is sent via DTMF tones. the telephone switch (in this case, my Cisco 2911) builds the proper DTMF string given the correct number. once the announcer detects a ringing oscillation, a reed-relay is powered, connecting the primary of the transformer to the phone line. this takes the phone line off hook. once it is off hook, the MCU waits 5 seconds before timing out the DTMF detection. the DTMF timeout can be ended early by entering a '#' DTMF digit. the MCU also disregards any digit sequence that doesn't end with a '#'.
below is an example of an acceptable DTMF string, as well as the rest of the DTMF format:
example: * 0 * 3 2 5 0 0 0 0 #
example: "The number you have reached 3 2 5 0 0 0 0 is not in service......"
a '*' digit tells the MCU the start of an argument. the first star '*0' tells the MCU that it should play a Number Not In Service (NNIS) announcement, the second star '*3250000' tells the MCU that is the first argument. any '*' after the first one, stores the following digits, and is able to be announced later in the message string.
|0||Number Not In Service||* 0 * [Dialed Number] #|
|1||Number Disconnected||* 2 * [Dialed Number] #|
|2||Number Is Busy||* 2 * [Dialed Number] #|
|3||Number Changed||* 1 * [Dialed Number] * [New Number] #|
|4||ANAC Mode||* 4 * [Dialed Number] #|
|X||General Error Recording||X!|
the power supply is based off of a simple L7805, 5 volt linear voltage regulator. the supply has minimal protection and noise suppression, but works for a demo. normally i would have also added at least a polarity protection diode, like a 1N4007, but i didn't have any at the time. i was also running low on 100nF caps, so i didn't include much noise filtering on the input/output of the regulator.
the heart of this unit is an ATMEL ATMEGA328P, and yes, it is the same MCU used in the infamous "Arduino" microcontroller dev boards, so yea, it does take away some cool points, but i think i am exploiting some features of the MCU that most arduino programmers don't understand or use... such as timer interrupts.. so it balances out.. :)