Introduction
For the July 2025 high-school co-op term, I was asked to design an interactive system for an old analog phone that would play audio when the handset was lifted off the hook.Ìý
The ultimate goal is to add it to an exhibit about the Red Room, so that when visitors pick up the handset they can listen to a recording about the computing centre, the computers, and the people who worked there.
In this blog, I'll explain how I did it, and how it works, as a rough guide if you want to build something similar.

Supplies and Materials
After some research, we decided that an Arduino Nano and a DFPlayer MP3 mini chip would work. Other materials:
- pushbutton switches
- resistors (1k)
- speaker:Ìýwe tested with aÌý4 ohm 3 W speaker, but the 150 ohm handset speaker also worked
- wires,Ìýsolder & soldering iron
- multimeter for testing and tracing the phone circuit
- microSD card for the DFPlayer (formatted FAT16 or FAT32)
- breadboard for prototyping
- an old analogÌýphone (note: you'll have to spliceÌýsome wiring inside the phone, so only use one you're comfortable modifying)Ìý
Aside from the phone, you may have many of these supplies already, or can get them from common suppliers like Digikey or Amazon.
The Museum found the phone while clearing out old storage areas. Because it's red and lacks a dial, we think it was an old emergency phone. When it's on display we make sure people know it's an interactive artifact, not a real emergency phone anymore!
Also, we initially thought we'd put the electronics inside the phone, but realized that would make it tricky to add buttons and change the audio, so we designed and 3D printed an external enclosure.
Prototyping
There were several tutorials online about how to use the DFPlayer chip, like this , plus the manufacturer's .Ìý
I built my prototype with a breadboard and the following schematic.

A few things to note:
- The MicroSD card has to be formatted on your computer first, using FAT16 or FAT32 format. On a Windows computer, "Quick Format" should work. Then you need to copy your files to the card. You have use specificÌýfilenames, which is explained below in the "Adding Audio" section.Ìý
-
For the buttonsÌýI used the Arduino's input pullup function. ThisÌýmeans, for example, that you attach one pin to D2Ìýand then attach the other pin straight to the ArduinoÌýground which doesn't require resistance that way. In my code, which you can see below, I usedÌýpinMode(1, INPUT_PULLUP)Ìýso you can read them by using digital read like normal. TheseÌýbuttons haveÌýthe high and low is swapped, so button pressed means low instead of high but they work the exact same other than that.The rest of my prototype was similar to the schematic.
Disassembling the phone
We used a red phone we found for the project. Given the bright red colour and that it has no dial, it was probably an emergency phone.
The next step was to disassemble the phone by removing the cover. Then I used a multimeter to identify the wire connected to the handset hook that I could use as a switch in the Arduino code. The code recognizes when the handset is lifted off the hook to start the audio and when it is replaced on the hook to stop the audio.Ìý
For the speaker you have two options. You can use the phone speaker in the handset or replace it with a modern speaker that will fit the cup. If you use the phone speaker, you can check the resistance with a multimeter. If you have a 3W 4ohm speaker, the audio will be relatively loud. If you use an old phone speaker it will most likely have a really high resistance, meaning the audio will be quieter.
Changing the audio
Thankfully, changing the audio isn't that tricky.Ìý
The phone is hard to open, but I put all the electronic components in the 3d printed box.ÌýNor do you have change the code on the Arduino.ÌýAll you have to do is change the files on the SD cardÌýin the dfPlayer mini chip.
First, remove power to the Arduino by unplugging the USB cable. Then open the enclosure.
Next, remove the card from the DFPlayer. Just a light push on the card, and it will pop out.
To access the card with my computer, I used a USB stick with a micro SD slot. (Remember: if you want to use a new MicroSD card you need to quick format it to be FAT16 or FAT32).Ìý Copy the new audio files to the card. They have to MP3, WAV, or WVM formats. The filename must be 001, 002, 003 and so on (such as 001.mp3 or 001.wav). These files correspond to the initial audio that plays when you pick up the phone (001), the first button (002), and the second button (003). Additional audio, such as 004 or 005, can be played using the next button. When done, be sure to eject the SD card from your computer properly: go into the SD card menu, select eject, and take it out of the computer. Then you can put it back into the DFPlayer mini chip and it should work as soon as you power up by plugging the USB cable back in.ÌýÌý
Final design
After testing the prototype with the breadboard and disasembling the phone, I soldered the DFPlayer and buttons to the Arduino. The schematic is pretty simple, so a circuit board or perfboard wasn’t absolutely necessary.Ìý
Then I put the Arduino and DFPlayer in an enclosure, with holes for the buttons. This is optional, but if you have control buttons like in my case, a 3d printed a box with holes for control buttons means I didn't have to cut holes in the phone case. I also designed a label that I glued to the enclosure.
Arduino code
The code for the Arduino Nano is pretty simple, and I left some comments. It does expect that your circuit is the same as mine and that you have five push buttons on the same pins for control.
To use my code, you'll need to install the , add the DFRobot DFPlayer library, and make sure your computer can connect to the Nano with a USB data cable. That's all beyond the scope of this blog, but tutorials are easy to find.
which is
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h> // libraries needed for the project
SoftwareSerial mySerial(10, 11); // pins going to the dfplayer
DFRobotDFPlayerMini myDFPlayer;
// Button pins
const int btnEnable = 2; // This is the handset switch
const int btnSong2 = 3;
const int btnSong3 = 4;
const int btnVolUp = 5;
const int btnVolDown = 6;
const int btnNextSong = 7;
int volume = 5; // Initial volume
// Variables to store previous button states (so when you hold down a button it doesn't trigger multiple times)
bool prevStateSong1 = HIGH;
bool prevStateSong2 = HIGH;
bool prevStateSong3 = HIGH;
bool prevStateVolUp = HIGH;
bool prevStateVolDown = HIGH;
bool prevStateNextSong = HIGH;
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
if (!myDFPlayer.begin(mySerial)) { //checks if it works, it will talk in the serial monitor
Serial.println("DFPlayer not responding.");
while (true);
}
myDFPlayer.volume(volume);
Serial.println("DFPlayer ready.");
// Set button pins as input with pullup resistors, (the button goes from a digital pin to ground)
pinMode(btnEnable, INPUT_PULLUP);
pinMode(btnSong2, INPUT_PULLUP);
pinMode(btnSong3, INPUT_PULLUP); // for these types of pins, held down is low, and not pressed is high
pinMode(btnVolUp, INPUT_PULLUP);
pinMode(btnVolDown, INPUT_PULLUP);
pinMode(btnNextSong, INPUT_PULLUP);
}
void loop() {
// Read current states
bool stateSong1 = digitalRead(btnEnable);
bool stateSong2 = digitalRead(btnSong2);
bool stateSong3 = digitalRead(btnSong3);
bool stateVolUp = digitalRead(btnVolUp);
bool stateVolDown = digitalRead(btnVolDown);
bool stateNextSong = digitalRead(btnNextSong);
// Detect if the phone is picked up
bool enabled = (stateSong1 == LOW);
// When phone is picked up, play audio once
if (stateSong1 == LOW && prevStateSong1 == HIGH) {
myDFPlayer.play(1); // Play welcome/pickup audio
}
if(enabled == false){// stops when the phone is put down, kill switch
myDFPlayer.stop();
}
if (enabled) {
// Only respond to other buttons if phone is picked up
if (stateSong2 == LOW && prevStateSong2 == HIGH) {
myDFPlayer.play(2);// second song for audio 1 button
}
if (stateSong3 == LOW && prevStateSong3 == HIGH) {
myDFPlayer.play(3); //third song for audio 2 button
}
if (stateVolUp == LOW && prevStateVolUp == HIGH) {
if (volume < 30) volume++;
myDFPlayer.volume(volume);//+ audio
}
if (stateVolDown == LOW && prevStateVolDown == HIGH) {
if (volume > 0) volume--;
myDFPlayer.volume(volume);//- audio
}
if (stateNextSong == LOW && prevStateNextSong == HIGH) {
myDFPlayer.next(); // next song button
}
}
// Update previous states
prevStateSong1 = stateSong1;
prevStateSong2 = stateSong2;
prevStateSong3 = stateSong3;
prevStateVolUp = stateVolUp;
prevStateVolDown = stateVolDown;
prevStateNextSong = stateNextSong;
delay(50); // Short delay to slow down the code
}
About the author
Luca is currently at À¶Ý®ÊÓÆµ Oxford District Secondary School and a 2025 Highschool co-op student at the University of À¶Ý®ÊÓÆµ Computer Museum. He enjoys playing music on the drums and guitar, playing badminton, creating Arduino projects and playing with his dog.