This library provides a simple solution for playing one or more melodies on piezoelectric passive buzzers using the arduino core tone function in a non-blocking way.
To use more than one BuzzerMelody instance, the Tone.cpp Arduino core function needs to be updated.
Each BuzzerMelody object will use a different Arduino Timer peripheral. So, the maximum number of melodies allowed to be played in parallel will depend on your Arduino/MCU platform. See the list below for a quick summary:
Arduino Platform (MCU) | Number of Timers (Names) | Datasheet Link |
---|---|---|
Arduino Uno Rev 3 (ATmega328P) | 3 (Timer0, Timer1, Timer2) | ATmega328P Datasheet |
Arduino Mega (ATmega2560) | 6 (Timer0, Timer1, Timer2, Timer3, Timer4, Timer5) | ATmega2560 Datasheet |
Arduino Leonardo (ATmega32U4) | 4 (Timer0, Timer1, Timer3, Timer4) | ATmega32U4 Datasheet |
Arduino Nano (ATmega328P) | 3 (Timer0, Timer1, Timer2) | ATmega328P Datasheet |
ESP32 Dev Module | 4 (TIMER0, TIMER1, TIMER2, TIMER3 per core) | ESP32 Datasheet |
Timer 0 is usually used by the millis() function, so it is recommended to avoid using that.
If you are using this library with other libraries, check if there are any conflicts with the timers used.
Once the tone function modification is implemented, you don't to need to worry about anything in the main application.
Add the <BuzzerMelody.h> file to your code.
Create a BuzzerMelody object passing the following as arguments:
- Buzzer Pin
- Array of notes (see example).
- The total number of notes.
#include <Arduino.h>
#include <BuzzerMelody.h>
#include "SuperMarioBrosTheme.h"
const uint8_t BUZZER_0_PIN = 9;
BuzzerMelody buzzerMelody0(BUZZER_0_PIN, NUM_OF_NOTES0, melody0);
void setup() {
buzzerMelody0.play();
}
void loop() {
buzzerMelody0.loop();
}
A melody shall be composed by an array of notes.
#include <Arduino.h>
#include "notes.h"
const Note melody0[] PROGMEM = {
{ NOTE_E6, 143 }, // Bar 1 | E in octave 6 16th Note
{ NOTE_E6, 286 }, // Bar 1 | E in octave 6 Eighth Note
{ NOTE_E6, 286 }, // Bar 1 | E in octave 6 Eighth Note
{ NOTE_C6, 143 }, // Bar 1 | C in octave 6 16th Note
...
A Note is a struct defined in the notes.h file composed by a frequency and a duration (in ms).
typedef struct {
uint16_t frequency;
uint16_t duration;
} Note;