Countdown timer that plays a a series of notes.

The "Eleven" is our Uno-equivalent Arduino-compatible board, but with a number of improvements including prototyping area, a mini-USB connector, LEDs mounted near the edge, and the D13 LED isolated using a FET. [Product page]
Post Reply
Varun
Posts: 2
Joined: Thu Sep 17, 2015 9:29 am

Countdown timer that plays a a series of notes.

Post by Varun » Thu Sep 17, 2015 9:32 am

Hi there

I am having trouble with integrating the pauses between notes of my tune I want to play when my timer hits 0. I can't quite figure out how to intergrate the command in. Any advice would be greatly appreciated. Code provided and error messages below.

Code: Select all

/*
  Melody

 Plays a melody

 circuit:
 * 8-ohm speaker on digital pin 8

 created 21 Jan 2010
 modified 30 Aug 2011
 by Tom Igoe

This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/Tone

 */
#include "pitches.h"

// notes in the melody:
int melody[] = {NOTE_G4, NOTE_G4, NOTE_G4, NOTE_G4, NOTE_DS4, NOTE_F4, NOTE_G4, NOTE_F4, NOTE_G4
};

// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
  2, 2 ,2, 4, 4, 4, 2, 2, 6
};

void setup() {
  // iterate over the notes of the melody:
  for (int thisNote = 0; thisNote < 8; 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 = 100 * noteDurations[thisNote];
    tone(8, melody[thisNote], noteDuration);

    // to distinguish the notes, set a minimum time between them.
    // the note's duration + 30% seems to work well:
    int pauseBetweenNotes = {100, 100, 100, 200, 200, 200, 300, 100, 200};
    delay(pauseBetweenNotes);
    // stop the tone playing:
    noTone(8);
  }
}

void loop() {
  // no need to repeat the melody.
}

Arduino: 1.6.5 (Windows 8.1), Board: "Arduino Uno"

Build options changed, rebuilding all

toneMelody.ino: In function 'void setup()':
toneMelody:41: error: scalar object 'pauseBetweenNotes' requires one element in initializer
scalar object 'pauseBetweenNotes' requires one element in initializer

This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.

Cheers for your help in advance

angusgr
Freetronics Staff
Freetronics Staff
Posts: 853
Joined: Tue Apr 09, 2013 11:19 pm
Location: Melbourne, Australia
Contact:

Re: Countdown timer that plays a a series of notes.

Post by angusgr » Fri Sep 18, 2015 6:22 am

The pauseBetweenNotes is a series of values, so it needs to be an array.

Try something like:

Code: Select all

int pauseBetweenNotes[] = {100, 100, 100, 200, 200, 200, 300, 100, 200};
delay(pauseBetweenNotes[thisNote]);
For clarity's sake, consider putting the first line up near where all the other arrays are defined, near the top of the file.


Angus

Varun
Posts: 2
Joined: Thu Sep 17, 2015 9:29 am

Re: Countdown timer that plays a a series of notes.

Post by Varun » Tue Sep 22, 2015 12:27 am

Thanks Angus, I can't get the tune to play quite correctly but the delay seems to be working. Any tips on how to start a serial bridge that'll display the note, note duration and note delay?

Thanks in advance

Varun

angusgr
Freetronics Staff
Freetronics Staff
Posts: 853
Joined: Tue Apr 09, 2013 11:19 pm
Location: Melbourne, Australia
Contact:

Re: Countdown timer that plays a a series of notes.

Post by angusgr » Thu Sep 24, 2015 4:50 am

Hi Varun,

You can add some code like this

near the top of setup:

Code: Select all

Serial.begin(115200);
inside the for loop, near the bottom:

Code: Select all

Serial.print("Note ");
Serial.print(melody[thisNote]);
Serial.print(" duration ");
Serial.print(noteDuration);
Serial.print(" delay ");
Serial.println(pauseBetweenNotes[thisNote]);
Will print a line to the Serial Monitor (use baud 115200), each time it plays a note.

Angus

Post Reply