Playing Tones With Piezoelectric Speakers

Last May 8, I created a Vine video playing the Star Wars Imperial March using an Arduino and a piezo speaker. A lot of people appreciated it, so I decided to share a simple instruction on how to do it yourself.

You will need

  • Arduino (I’m using Arduino UNO R3)
  • Piezo speaker (12mm)

Set it up like so…

Playing Tones With Piezoelectric Speakers

Upload the code

/**
 * Name: Star Wars Imperial March
 * Author: Joseph Milla
 * Author URI: http://www.josephmilla.com
 * Version: 1.0.0
 * Tag: Arduino, Star Wars
 */

//SPEAKER (PWM pin)
int speakerPin = 11;
//LED (Use pin 13 for built-in LED)
int ledPin = 13;

//FREQUENCIES
#define cL 129
#define cLS 139
#define dL 146
#define dLS 156
#define eL 163
#define fL 173
#define fLS 185
#define gL 194
#define gLS 207
#define aL 219
#define aLS 228
#define bL 232

#define c 261
#define cS 277
#define d 294
#define dS 311
#define e 329
#define f 349
#define fS 370
#define g 391
#define gS 415
#define a 440
#define aS 455
#define b 466

#define cH 523
#define cHS 554
#define dH 587
#define dHS 622
#define eH 659
#define fH 698
#define fHS 740
#define gH 784
#define gHS 830
#define aH 880
#define aHS 910
#define bH 933

void setup()
{
  pinMode(ledPin, OUTPUT);
  pinMode(speakerPin, OUTPUT);
}

void beep (int speakerPin, int freqHz, long timeMs)
{
  digitalWrite(ledPin, HIGH);

  double timeDelay = (double)(1000000/freqHz);
  double timeLoop = (double)((timeMs*1000)/(timeDelay*2));

  for(int i = 0; i < timeLoop; i++)
  {
    digitalWrite(speakerPin, HIGH);
    delayMicroseconds(timeDelay);
    digitalWrite(speakerPin, LOW);
    delayMicroseconds(timeDelay);
  }

  digitalWrite(ledPin, LOW);
  delay(20);
}

void playTone()
{
  beep(speakerPin, a, 500);
  beep(speakerPin, a, 500);
  beep(speakerPin, a, 500);
  beep(speakerPin, f, 350);
  beep(speakerPin, cH, 150);

  beep(speakerPin, a, 500);
  beep(speakerPin, f, 350);
  beep(speakerPin, cH, 150);
  beep(speakerPin, a, 1000);
  beep(speakerPin, eH, 500);

  beep(speakerPin, eH, 500);
  beep(speakerPin, eH, 500);
  beep(speakerPin, fH, 350);
  beep(speakerPin, cH, 150);
  beep(speakerPin, gS, 500);

  beep(speakerPin, f, 350);
  beep(speakerPin, cH, 150);
  beep(speakerPin, a, 1000);
  beep(speakerPin, aH, 500);
  beep(speakerPin, a, 350);

  beep(speakerPin, a, 150);
  beep(speakerPin, aH, 500);
  beep(speakerPin, gHS, 250);
  beep(speakerPin, gH, 250);
  beep(speakerPin, fHS, 125);

  beep(speakerPin, fH, 125);
  beep(speakerPin, fHS, 250);

  delay(250);

  beep(speakerPin, aS, 250);
  beep(speakerPin, dHS, 500);
  beep(speakerPin, dH, 250);
  beep(speakerPin, cHS, 250);
  beep(speakerPin, cH, 125);

  beep(speakerPin, b, 125);
  beep(speakerPin, cH, 250);

  delay(250);

  beep(speakerPin, f, 125);
  beep(speakerPin, gS, 500);
  beep(speakerPin, f, 375);
  beep(speakerPin, a, 125);
  beep(speakerPin, cH, 500);

  beep(speakerPin, a, 375);
  beep(speakerPin, cH, 125);
  beep(speakerPin, eH, 1000);
  beep(speakerPin, aH, 500);
  beep(speakerPin, a, 350);

  beep(speakerPin, a, 150);
  beep(speakerPin, aH, 500);
  beep(speakerPin, gHS, 250);
  beep(speakerPin, gH, 250);
  beep(speakerPin, fHS, 125);

  beep(speakerPin, fH, 125);
  beep(speakerPin, fHS, 250);

  delay(250);

  beep(speakerPin, aS, 250);
  beep(speakerPin, dHS, 500);
  beep(speakerPin, dH, 250);
  beep(speakerPin, cHS, 250);
  beep(speakerPin, cH, 125);

  beep(speakerPin, b, 125);
  beep(speakerPin, cH, 250);

  delay(250);

  beep(speakerPin, f, 250);
  beep(speakerPin, gS, 500);
  beep(speakerPin, f, 375);
  beep(speakerPin, cH, 125);
  beep(speakerPin, a, 500);

  beep(speakerPin, f, 375);
  beep(speakerPin, c, 125);
  beep(speakerPin, a, 1000);
}

void loop()
{
  playTone();
}

I also included additional tones such as Deep Purple’s Smoke On The Water and Gotye’s Somebody That I Used To Know. I’m still coding some more, so if you have any suggestions just give me a tweet.


  Recommend