Play simple melodies with an Arduino and a piezo buzzer

Play simple melodies with an Arduino and a piezo buzzer

Piezo buzzer background

Piezo buzzers are simple devices that are commonly used to produce beeps and sounds in many electronic gadgets, like alarm clocks, toys, pc boards, etc. They consume very little current and have high impedance, which means that you can safely connect them directly to a micro-controller pin.

Buzzers have a piezoelectric ceramic plate that generates electricity when a mechanical force is applied to it and vibrates (extend and shrink) when exposed to an electric field. The first property is often used to detect knocks and musical tones, while the second property is what we are going to use to play a simple tune from an Arduino micro-controller.

Piezo buzzers are different than the speakers found in phones, headphones and sound systems. Do not connect a speaker directly to an Arduino pin, like we will do with a piezo element later, or you risk to cause some damage to your board (and possibly the speaker too).

Piezo buzzer vs speakers

A piezo sounder requires a square wave to produce a sound. Different frequencies produce different tones. We can use the Arduino tone() function to generate these frequencies and play simple tunes.

Electronic Circuit

Connect one of the piezo buzzer pins to ground and the other to digital Arduino Pin (I use pin D12 on my Arduino Uno). Simple!


Arduino Code

Here is a link to the Arduino sketch from the demo video. Make sure that you place a copy of the “pitches.h” file in the same directory as the ArduinoTunes.ino sketch, or you will get a compile error from the Arduno IDE. The “pitches.h” file contains a mapping of the most common musical notes to their respective frequency.

In ArduinoTunes.ino we have one integer array with the notes of our melody (melody[]) and another array with the respective note durations (durations[]). A quarter note has a duration of 4, half note 2 etc. The tempo variable defines the tempo in beats per minute (BPM). In the example it is set to 120 beats per minute, which is the typical march tempo. After all, we are playing the Imperial March!

The playTune() function plays each note in our melody in sequence. I add a pause between the notes that is arbitrarily set to about 1.2 multiplied by the note duration.

A couple of notes:

  • This code uses the delay function and is blocking. You will not be able to do much else with the Arduino, while the tune is playing.
  • Due to the use of integer variables and the rounding in division, the duration of musical notes will be rounded down.
  • You can only play one tone at any given time.

Getting tunes

I do not have much musical knowledge, so it took me a while to code the beginning of the imperial march from this link. Simple tunes from old games, or ringtones work best. Just find a note sheet and code the two arrays with the notes and note durations.

If you have any ideas of how to improve this, please post in the comments below!


Arduino Tone Tutorial:

Tagged with: , ,

2 Comments on “Play simple melodies with an Arduino and a piezo buzzer

  1. Hi,
    I am trying this on a esp32 dev. When i compile i get a compile error because the function “tone” is not declared in the scope. I have the pitches.h file in the sketch folder and in a tab on a’ ide. Can you explain or tell me what i’m doing wrong? Thanks in advanced.

  2. This worked for me: 1) got to the GitHub site:
    open the .ino file and copy and paste the code into a new Arduino script, save it as ArduinoTunes

    2) in the same GitHub site, open the pitches.h file and copy that code into a new tab in the ArduinoTunes.ino file you just created

    3) Re-save the .ino file and then upload to run

Leave a Reply

Your email address will not be published. Required fields are marked *


This site uses Akismet to reduce spam. Learn how your comment data is processed.