Make: Projects

Using an Arduino to Process Fire Dept. Tones

In my area, multiple towns use the same radio frequency to dispatch their fire departments. To discriminate between towns you must look at the tone transmitted right before the dispatch. This project lets me process the tone and determine which town it is

  • By
  • Difficulty: Moderate
Using an Arduino to Process Fire Dept. Tones

I’m on the volunteer fire dept. in my town and as such, like to keep tabs on when neighboring towns are dispatched. I came up with the idea to make a large map of my area and put an LED in each town that would light up when they get called out. To do this though i would have to find someway to discriminate between towns, and since multiple towns use the same radio frequency, I couldn’t just cross-reference the frequency with the town. Fortunately though every town has a unique tone sent out just prior to the dispatch. It is this tone that i need to look at, process and then match up with its town.

Seeing as this is meant to run constantly , a micro-contoller is the clear choice, and what better than an arduino. Unfortunately, Arduinos don’t have the capability to process a sine wave by themselves, so i needed to give it a little help…



Step #1:

Using an Arduino to Process Fire Dept. Tones
  • To give the Arduino the capability to process the sine wave, i first converted the sine wave (blue) into a square wave (yellow), and then filtered out any negative voltages. this left a high pulse (tan) every time time the sine wave was negative
  • This graph was generated using 's amazing (and free) circuit simulation.

Step #2:

Using an Arduino to Process Fire Dept. Tones
  • The actual circuit is pretty self explanatory, but I'll go through it anyways.
  • You feed the op-amp's positive with the sine wave, and compare it to a low reference voltage to produce the square wave.
  • originally i compared the sine wave to ground, but that proved too sensitive and any noise on the line would set it off. A voltage divider such as this one sets a minimum level (in this case volume level).
  • Once you have the square wave, a simple diode will filter out the negative voltages, leaving just high pulses.
  • sending the high pulses to the base of a transistor will draw the connector, and the arduino pin it is connected to, to ground.
  • Not shown here is a 'pull up' resistor connected between the arduino's pin and +5v. this ensures that the pin is always 'HIGH' unless we WANT it to be 'LOW'
  • Circuit diagram is also from

Step #3:

Using an Arduino to Process Fire Dept. TonesUsing an Arduino to Process Fire Dept. TonesUsing an Arduino to Process Fire Dept. TonesUsing an Arduino to Process Fire Dept. Tones
  • Unfortunately I didn't have the foresight to take any pictures of it breadboarded but this how my perf-board came out.
  • The LED is connected between the collector and +5v through a 470 ohm resistor. it lights up with every high pulse off the op-amp and also serves as a pull up for the arduino pin.
  • Obviously 750 times a second is too fast for us to see, so it just looks like it is lit up. Its a good indicator for when the level clears the reference voltage.

Step #4:

Using an Arduino to Process Fire Dept. Tones
  • Now that we have 'low pulses' (drawing the arduino's pin to ground) it's just a matter of coding.
  • After some research i found the 'AttachInterupt' command. details are here:
  • The basic premise of my code is to find how long it take for 100 pulses to 'fire'. then you can do some math to find the period of the sine wave and from there it is pretty simple to find the frequency.
  • The code is attached in a .pdf file. For the most part the coding is complete. To add new towns all you have to do is add their information into the 3 arrays.
  • Make sure that for the three arrays, each town has its own index. I.E. 'Windsor' gets index 0 for frequency index 0, for name, and index 0 for LEDpin.

  • Guest

    I have been wanting to do this for awhile now, and will be trying this as soon as Digi-Key delivers!