Page 1 of 1

Countdown timer that plays a a series of notes.

Posted: Thu Sep 17, 2015 9:32 am
by Varun
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

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

Posted: Fri Sep 18, 2015 6:22 am
by angusgr
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

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

Posted: Tue Sep 22, 2015 12:27 am
by Varun
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

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

Posted: Thu Sep 24, 2015 4:50 am
by angusgr
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