Project tutorial
Make a Christmas Song Player with a Buzzer and LCD Display

Make a Christmas Song Player with a Buzzer and LCD Display © GPL3+

A easy to use Christmas song player with a LCD display to show the name of the song.

  • 381 views
  • 2 comments
  • 2 respects

Components and supplies

About this project

The main purpose of this was to show that electronics isn't hard,

I built this entire project using the official Arduino starter kit.

Last year I built a simple Arduino buzzer circuit with three songs but this year I decided to rebuild it except with a LCD screen to display the current song.

Huge thanks to Joshi for the original idea.

Code

CodeArduino
/*
  Arduino Christmas Songs
  
  Based on a project and code by Dipto Pratyaksa, updated on 31/3/13

  Modified for Christmas by Joshi, on Dec 17th, 2017.
  
  Modified again by Larry, on Oct 19, 2019.
*/

#include <pitches.h>

#include <LiquidCrystal.h>

#define melodyPin 9

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //lcd pins

// Jingle Bells

int melody[] = {
  NOTE_E5, NOTE_E5, NOTE_E5,
  NOTE_E5, NOTE_E5, NOTE_E5,
  NOTE_E5, NOTE_G5, NOTE_C5, NOTE_D5,
  NOTE_E5,
  NOTE_F5, NOTE_F5, NOTE_F5, NOTE_F5,
  NOTE_F5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5,
  NOTE_E5, NOTE_D5, NOTE_D5, NOTE_E5,
  NOTE_D5, NOTE_G5
};

int tempo[] = {
  8, 8, 4,
  8, 8, 4,
  8, 8, 8, 8,
  2,
  8, 8, 8, 8,
  8, 8, 8, 16, 16,
  8, 8, 8, 8,
  4, 4
};

// We wish you a merry Christmas

int wish_melody[] = {
  NOTE_B3, 
  NOTE_F4, NOTE_F4, NOTE_G4, NOTE_F4, NOTE_E4,
  NOTE_D4, NOTE_D4, NOTE_D4,
  NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_F4,
  NOTE_E4, NOTE_E4, NOTE_E4,
  NOTE_A4, NOTE_A4, NOTE_B4, NOTE_A4, NOTE_G4,
  NOTE_F4, NOTE_D4, NOTE_B3, NOTE_B3,
  NOTE_D4, NOTE_G4, NOTE_E4,
  NOTE_F4
};

int wish_tempo[] = {
  4,
  4, 8, 8, 8, 8,
  4, 4, 4,
  4, 8, 8, 8, 8,
  4, 4, 4,
  4, 8, 8, 8, 8,
  4, 4, 8, 8,
  4, 4, 4,
  2
};

// Santa Claus is coming to town

int santa_melody[] = {
  NOTE_G4,
  NOTE_E4, NOTE_F4, NOTE_G4, NOTE_G4, NOTE_G4,
  NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, NOTE_C5,
  NOTE_E4, NOTE_F4, NOTE_G4, NOTE_G4, NOTE_G4,
  NOTE_A4, NOTE_G4, NOTE_F4, NOTE_F4,
  NOTE_E4, NOTE_G4, NOTE_C4, NOTE_E4,
  NOTE_D4, NOTE_F4, NOTE_B3,
  NOTE_C4
};

int santa_tempo[] = {
  8,
  8, 8, 4, 4, 4,
  8, 8, 4, 4, 4,
  8, 8, 4, 4, 4,
  8, 8, 4, 2,
  4, 4, 4, 4,
  4, 2, 4,
  1
};

int switchOne = 0;
int switchTwo = 0;
int switchThree = 0;

void setup(void) {
  pinMode(9, OUTPUT); // Buzzer
  pinMode(13, OUTPUT); // Led indicator when singing a note
  pinMode(7, INPUT); //button
  pinMode(8, INPUT); //button 
  pinMode(10, INPUT); // button 
  lcd.begin(16, 2); //lcd start code
  lcd.setCursor(0, 0); //lcd set cursor
  lcd.print("Welcome press");
  lcd.setCursor(0, 1);
  lcd.print("any button");
}

void loop() {
  switchOne = digitalRead(7);
  switchTwo = digitalRead(8);
  switchThree = digitalRead(10);
  if (switchOne == HIGH) {
    sing(1);
  } else if (switchTwo == HIGH) {
    sing(2);
  } else if (switchThree == HIGH) {
    sing(3);
  }
}

int song = 0;

void sing(int s) {
  // iterate over the notes of the melody:
  song = s;
  if (song == 3) {
    lcd.setCursor(0, 0);
    lcd.clear();
    lcd.print("We wish you a ");
    lcd.setCursor(0, 1);
    lcd.print("Merry Christmas");
    int size = sizeof(wish_melody) / sizeof(int);
    for (int thisNote = 0; thisNote < size; thisNote++) {

      // to calculate the note duration, take one second
      // divided by the note type.
      //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
      int noteDuration = 1000 / wish_tempo[thisNote];

      buzz(melodyPin, wish_melody[thisNote], noteDuration);

      // to distinguish the notes, set a minimum time between them.
      // the note's duration + 30% seems to work well:
      int pauseBetweenNotes = noteDuration * 1.30;
      delay(pauseBetweenNotes);

      // stop the tone playing:
      buzz(melodyPin, 0, noteDuration);
      

    }
  } else if (song == 2) {
       lcd.setCursor(0, 0);
    lcd.clear();
    lcd.print("Santa Claus is ");
    lcd.setCursor(0, 1);
    lcd.print("coming to town");
    int size = sizeof(santa_melody) / sizeof(int);
    for (int thisNote = 0; thisNote < size; thisNote++) {

      // to calculate the note duration, take one second
      // divided by the note type.
      //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
      int noteDuration = 900 / santa_tempo[thisNote];

      buzz(melodyPin, santa_melody[thisNote], noteDuration);

      // to distinguish the notes, set a minimum time between them.
      // the note's duration + 30% seems to work well:
      int pauseBetweenNotes = noteDuration * 1.30;
      delay(pauseBetweenNotes);

      // stop the tone playing:
      buzz(melodyPin, 0, noteDuration);
      

    }
  } else if (song == 3) {
    lcd.setCursor(0, 0);
    lcd.clear();
    lcd.print(" 'Jingle Bells'");
    int size = sizeof(melody) / sizeof(int);
    for (int thisNote = 0; thisNote < size; thisNote++) {

      // to calculate the note duration, take one second
      // divided by the note type.
      //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
      int noteDuration = 1000 / tempo[thisNote];

      buzz(melodyPin, melody[thisNote], noteDuration);

      // to distinguish the notes, set a minimum time between them.
      // the note's duration + 30% seems to work well:
      int pauseBetweenNotes = noteDuration * 1.30;
      delay(pauseBetweenNotes);

      // stop the tone playing:
      buzz(melodyPin, 0, noteDuration);

    }
  }
  
}

void buzz(int targetPin, long frequency, long length) {
  digitalWrite(13, HIGH);
  long delayValue = 1000000 / frequency / 2; // calculate the delay value between transitions
  //// 1 second's worth of microseconds, divided by the frequency, then split in half since
  //// there are two phases to each cycle
  long numCycles = frequency * length / 1000; // calculate the number of cycles for proper timing
  //// multiply frequency, which is really cycles per second, by the number of seconds to
  //// get the total number of cycles to produce
  for (long i = 0; i < numCycles; i++) { // for the calculated length of time...
    digitalWrite(targetPin, HIGH); // write the buzzer pin high to push out the diaphram
    delayMicroseconds(delayValue); // wait for the calculated delay value
    digitalWrite(targetPin, LOW); // write the buzzer pin low to pull back the diaphram
    delayMicroseconds(delayValue); // wait again or the calculated delay value
  }
  digitalWrite(13, LOW);

}

Schematics

Schematic
A simple fritzing schematic.
fritzing_christmas_song_with_lcd_w6CZcw2zzg.fzz
Schematic
Screenshot (2) vijqbz84lf

Comments

Author

Larrybracken
larrybracken
  • 0 projects
  • 0 followers

Additional contributors

  • Original project by Joshi
  • Intro to bleeper tunes by Dipto Pratyaksa

Published on

October 29, 2019

Members who respect this project

AulaAdambenz
See similar projects
you might like

Similar projects you might like

Multi Player Score Tracker

Project tutorial by Shajeeb

  • 1,379 views
  • 0 comments
  • 3 respects

Arduino Tutorial : Mini Piano

Project tutorial by the lonely programmer

  • 19,377 views
  • 3 comments
  • 30 respects

LCD Game

Project showcase by Iron_SalsaStudio

  • 12,928 views
  • 11 comments
  • 22 respects

Electronic Piano Keyboard With Preset Songs

Project tutorial by Lindsay Fox

  • 90,729 views
  • 68 comments
  • 181 respects

LCD Gaming

Project tutorial by msr048

  • 6,449 views
  • 2 comments
  • 26 respects

Arduino LCD Video Game

Project tutorial by xXarduino_11Xx

  • 4,666 views
  • 1 comment
  • 18 respects
Add projectSign up / Login