Aprenda a Reproduzir Músicas com o Módulo Buzzer

Buzzer
Font Size

Olá pessoal, como estão? Criando muitas coisas fantásticas com algum microcontrolador?

Nesse tutorial vamos abordar novamente a implementação de arduino com som, como já fizemos no nosso outro tutorial Aprenda a utilizar o módulo ISD1820, se não viu ainda dá uma passadinha lá. Agora iremos criar as nossas próprias músicas e melodias, e as aplicações disso são infinitas, basta você compor a sua música e colocar para o arduino reproduzir!

Iremos criar músicas de duas formas, uma que apelidei carinhosamente se forma manual, na qual iremos definir qual o nível da nota a ser reproduzida pelo buzzer e a outra forma será através da biblioteca Tone, que contém diversas notas já prontinhas e basta você definir qual irá reproduzir.

Então agora que já sabemos um pouco mais sobre o projeto vamos lá conhecer esse tão falado buzzer!

Conhecendo o módulo buzzer

O buzzer é um dispositivo eletrônico comumente usado para produzir som. Devido ao seu peso leve, a pequeno tamanho e o baixo preço ele foi implementado em várias aplicações, como indicador de alerta em alguns eletrônicos, como em alguns computadores que fazem um “Bip” quando são inicializados, além disso os buzzers também são utilizados sinos de chamada, e outros.
O buzzer piezoelétrico, que é o que utilizaremos, é baseado no princípio inverso da eletricidade piezo descoberta em 1880 por Jacques e Pierre Curie. É o fenômeno da geração de eletricidade quando a pressão mecânica é aplicada a certos materiais e a inversa também é verdadeira.
Esses materiais são chamados de materiais elétricos piezoelétricos.  O piezocerâmico é uma classe de material sintético, que apresenta efeito elétrico piezoelétrico e é amplamente utilizado para fazer disco, o coração do zumbador piezoelétrico. Quando submetidos a um campo elétrico alternado, eles se esticam ou comprimem, de acordo com a freqüência do sinal produzindo som.

Nesse tutorial utilizar o Módulo Buzzer Passivo 5V , mostrado na Figura 01, que é um excelente módulo, geralmente precisamos de um circuito externo ao buzzer e fazer algumas adaptações na nossa programação para utilizar somente o buzzer, mas esse módulo contém todos os componentes de forma que a programação e a criação do projeto tornam-se muito mais simplificadas.

Figura 01: Módulo Buzzer Passivo
Fonte: Autocore Robótica

Agora que já vimos o sensor vamos lá a montagem do circuito!

Material Montando o Circuito

Materiais Utilizados:

Montagem:

O circuito para utilizar o nosso Módulo Muzzer é bastante simples, basta conectar os seguintes fios:

Módulo         Arduino
VCC      ->     5V ou 3.3V
GND    ->      GND
I/O       ->      D9

O circuito montado deve ficar assim :

Figura 01: Circuito Arduino UNo e Módulo Buzzer
Fonte: Autocore Robótica

Agora que já montamos o circuito vamos para a melhor parte, a programação ;D

Código comentado:

Através das portas PWM do Arduino podemos criar diferentes tonalidades com o nosso Módulo Buzzer, fizemos um exemplo abaixo da música tema do Super Mario World sendo tocada pelo nosso projetinho.

int buzzer = 9; //porta ligada ao buzzer

//melodia do Super Mario World
int melodia[] = {660,660,660,510,660,770,380,510,380,320,440,480,450,430,380,660,760,860,700,760,660,520,580,480,510,380,320,440,480,450,430,380,660,760,860,700,760,660,520,580,480,500,760,720,680,620,650,380,430,500,430,500,570,500,760,720,680,620,650,1020,1020,1020,380,500,760,720,680,620,650,380,430,500,430,500,570,585,550,500,380,500,500,500,500,760,720,680,620,650,380,430,500,430,500,570,500,760,720,680,620,650,1020,1020,1020,380,500,760,720,680,620,650,380,430,500,430,500,570,585,550,500,380,500,500,500,500,500,500,500,580,660,500,430,380,500,500,500,500,580,660,870,760,500,500,500,500,580,660,500,430,380,660,660,660,510,660,770,380};

//duraçao de cada nota em Milisegundos
int duracaodasnotas[] = {100,100,100,100,100,100,100,100,100,100,100,80,100,100,100,80,50,100,80,50,80,80,80,80,100,100,100,100,80,100,100,100,80,50,100,80,50,80,80,80,80,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,150,200,80,80,80,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,150,200,80,80,80,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,100,100,100,60,80,60,80,80,80,80,80,80,60,80,60,80,80,80,80,80,60,80,60,80,80,80,80,80,80,100,100,100,100,100,100,100};

void setup() {
 //for para tocar as 156 notas começando no 0 ate 156 ++ incrementado
 for (int nota = 0; nota < 156; nota++) {
 
 int duracaodanota = duracaodasnotas[nota];
 tone(buzzer, melodia[nota],duracaodanota);
 //pausa depois das notas
 int pausadepoisdasnotas[] ={150,300,300,100,300,550,575,450,400,500,300,330,150,300,200,200,150,300,150,350,300,150,150,500,450,400,500,300,330,150,300,200,200,150,300,150,350,300,150,150,500,300,100,150,150,300,300,150,150,300,150,100,220,300,100,150,150,300,300,300,150,300,300,300,100,150,150,300,300,150,150,300,150,100,420,450,420,360,300,300,150,300,300,100,150,150,300,300,150,150,300,150,100,220,300,100,150,150,300,300,300,150,300,300,300,100,150,150,300,300,150,150,300,150,100,420,450,420,360,300,300,150,300,150,300,350,150,350,150,300,150,600,150,300,350,150,150,550,325,600,150,300,350,150,350,150,300,150,600,150,300,300,100,300,550,575};
 delay(pausadepoisdasnotas[nota]);}
 
 noTone(buzzer);
}

void loop() {

}

Entende de música? Então, veja esse exemplo bem mais musicalmente definido, que nós adaptamos do Bhagman

Nele há várias músicas já pré compostas, basta apenas você tirar a que você quer reproduzir dos comentários e comentar a anterior.

#include <Tone.h>

Tone tonalidade;

#define OITAVA_OFFSET 0

int notas[] = { 0,
NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4,
NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5,
NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6,
NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7
};

char *musicas[10];

//*song = "The Simpsons:d=4,o=5,b=160:c.6,e6,f#6,8a6,g.6,e6,c6,8a,8f#,8f#,8f#,2g,8p,8p,8f#,8f#,8f#,8g,a#.,8c6,8c6,8c6,c6";
char *song = "Indiana:d=4,o=5,b=250:e,8p,8f,8g,8p,1c6,8p.,d,8p,8e,1f,p.,g,8p,8a,8b,8p,1f6,p,a,8p,8b,2c6,2d6,2e6,e,8p,8f,8g,8p,1c6,p,d6,8p,8e6,1f.6,g,8p,8g,e.6,8p,d6,8p,8g,e.6,8p,d6,8p,8g,f.6,8p,e6,8p,8d6,2c6";
//**char *song = "TakeOnMe:d=4,o=4,b=160:8f#5,8f#5,8f#5,8d5,8p,8b,8p,8e5,8p,8e5,8p,8e5,8g#5,8g#5,8a5,8b5,8a5,8a5,8a5,8e5,8p,8d5,8p,8f#5,8p,8f#5,8p,8f#5,8e5,8e5,8f#5,8e5,8f#5,8f#5,8f#5,8d5,8p,8b,8p,8e5,8p,8e5,8p,8e5,8g#5,8g#5,8a5,8b5,8a5,8a5,8a5,8e5,8p,8d5,8p,8f#5,8p,8f#5,8p,8f#5,8e5,8e5";
//char *song = "Entertainer:d=4,o=5,b=140:8d,8d#,8e,c6,8e,c6,8e,2c.6,8c6,8d6,8d#6,8e6,8c6,8d6,e6,8b,d6,2c6,p,8d,8d#,8e,c6,8e,c6,8e,2c.6,8p,8a,8g,8f#,8a,8c6,e6,8d6,8c6,8a,2d6";
//*char *song = "Muppets:d=4,o=5,b=250:c6,c6,a,b,8a,b,g,p,c6,c6,a,8b,8a,8p,g.,p,e,e,g,f,8e,f,8c6,8c,8d,e,8e,8e,8p,8e,g,2p,c6,c6,a,b,8a,b,g,p,c6,c6,a,8b,a,g.,p,e,e,g,f,8e,f,8c6,8c,8d,e,8e,d,8d,c";
//char *song = "Xfiles:d=4,o=5,b=125:e,b,a,b,d6,2b.,1p,e,b,a,b,e6,2b.,1p,g6,f#6,e6,d6,e6,2b.,1p,g6,f#6,e6,d6,f#6,2b.,1p,e,b,a,b,d6,2b.,1p,e,b,a,b,e6,2b.,1p,e6,2b.";
//char *song = "Looney:d=4,o=5,b=140:32p,c6,8f6,8e6,8d6,8c6,a.,8c6,8f6,8e6,8d6,8d#6,e.6,8e6,8e6,8c6,8d6,8c6,8e6,8c6,8d6,8a,8c6,8g,8a#,8a,8f";
//char *song = "20thCenFox:d=16,o=5,b=140:b,8p,b,b,2b,p,c6,32p,b,32p,c6,32p,b,32p,c6,32p,b,8p,b,b,b,32p,b,32p,b,32p,b,32p,b,32p,b,32p,b,32p,g#,32p,a,32p,b,8p,b,b,2b,4p,8e,8g#,8b,1c#6,8f#,8a,8c#6,1e6,8a,8c#6,8e6,1e6,8b,8g#,8a,2b";
//char *song = "Bond:d=4,o=5,b=80:32p,16c#6,32d#6,32d#6,16d#6,8d#6,16c#6,16c#6,16c#6,16c#6,32e6,32e6,16e6,8e6,16d#6,16d#6,16d#6,16c#6,32d#6,32d#6,16d#6,8d#6,16c#6,16c#6,16c#6,16c#6,32e6,32e6,16e6,8e6,16d#6,16d6,16c#6,16c#7,c.7,16g#6,16f#6,g#.6";
//char *song = "MASH:d=8,o=5,b=140:4a,4g,f#,g,p,f#,p,g,p,f#,p,2e.,p,f#,e,4f#,e,f#,p,e,p,4d.,p,f#,4e,d,e,p,d,p,e,p,d,p,2c#.,p,d,c#,4d,c#,d,p,e,p,4f#,p,a,p,4b,a,b,p,a,p,b,p,2a.,4p,a,b,a,4b,a,b,p,2a.,a,4f#,a,b,p,d6,p,4e.6,d6,b,p,a,p,2b";
//char *song = "StarWars:d=4,o=5,b=45:32p,32f#,32f#,32f#,8b.,8f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32e6,8c#.6,32f#,32f#,32f#,8b.,8f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32e6,8c#6";
//*char *song = "GoodBad:d=4,o=5,b=56:32p,32a#,32d#6,32a#,32d#6,8a#.,16f#.,16g#.,d#,32a#,32d#6,32a#,32d#6,8a#.,16f#.,16g#.,c#6,32a#,32d#6,32a#,32d#6,8a#.,16f#.,32f.,32d#.,c#,32a#,32d#6,32a#,32d#6,8a#.,16g#.,d#";
//*char *song = "TopGun:d=4,o=4,b=31:32p,16c#,16g#,16g#,32f#,32f,32f#,32f,16d#,16d#,32c#,32d#,16f,32d#,32f,16f#,32f,32c#,16f,d#,16c#,16g#,16g#,32f#,32f,32f#,32f,16d#,16d#,32c#,32d#,16f,32d#,32f,16f#,32f,32c#,g#";
//char *song = "A-Team:d=8,o=5,b=125:4d#6,a#,2d#6,16p,g#,4a#,4d#.,p,16g,16a#,d#6,a#,f6,2d#6,16p,c#.6,16c6,16a#,g#.,2a#";
//*char *song = "Flinstones:d=4,o=5,b=40:32p,16f6,16a#,16a#6,32g6,16f6,16a#.,16f6,32d#6,32d6,32d6,32d#6,32f6,16a#,16c6,d6,16f6,16a#.,16a#6,32g6,16f6,16a#.,32f6,32f6,32d#6,32d6,32d6,32d#6,32f6,16a#,16c6,a#,16a6,16d.6,16a#6,32a6,32a6,32g6,32f#6,32a6,8g6,16g6,16c.6,32a6,32a6,32g6,32g6,32f6,32e6,32g6,8f6,16f6,16a#.,16a#6,32g6,16f6,16a#.,16f6,32d#6,32d6,32d6,32d#6,32f6,16a#,16c.6,32d6,32d#6,32f6,16a#,16c.6,32d6,32d#6,32f6,16a#6,16c7,8a#.6";
//char *song = "Jeopardy:d=4,o=6,b=125:c,f,c,f5,c,f,2c,c,f,c,f,a.,8g,8f,8e,8d,8c#,c,f,c,f5,c,f,2c,f.,8d,c,a#5,a5,g5,f5,p,d#,g#,d#,g#5,d#,g#,2d#,d#,g#,d#,g#,c.7,8a#,8g#,8g,8f,8e,d#,g#,d#,g#5,d#,g#,2d#,g#.,8f,d#,c#,c,p,a#5,p,g#.5,d#,g#";
//*char *song = "Gadget:d=16,o=5,b=50:32d#,32f,32f#,32g#,a#,f#,a,f,g#,f#,32d#,32f,32f#,32g#,a#,d#6,4d6,32d#,32f,32f#,32g#,a#,f#,a,f,g#,f#,8d#";
//*char *song = "Smurfs:d=32,o=5,b=200:4c#6,16p,4f#6,p,16c#6,p,8d#6,p,8b,p,4g#,16p,4c#6,p,16a#,p,8f#,p,8a#,p,4g#,4p,g#,p,a#,p,b,p,c6,p,4c#6,16p,4f#6,p,16c#6,p,8d#6,p,8b,p,4g#,16p,4c#6,p,16a#,p,8b,p,8f,p,4f#";
//**char *song = "MahnaMahna:d=16,o=6,b=125:c#,c.,b5,8a#.5,8f.,4g#,a#,g.,4d#,8p,c#,c.,b5,8a#.5,8f.,g#.,8a#.,4g,8p,c#,c.,b5,8a#.5,8f.,4g#,f,g.,8d#.,f,g.,8d#.,f,8g,8d#.,f,8g,d#,8c,a#5,8d#.,8d#.,4d#,8d#.";
//char *song = "LeisureSuit:d=16,o=6,b=56:f.5,f#.5,g.5,g#5,32a#5,f5,g#.5,a#.5,32f5,g#5,32a#5,g#5,8c#.,a#5,32c#,a5,a#.5,c#.,32a5,a#5,32c#,d#,8e,c#.,f.,f.,f.,f.,f,32e,d#,8d,a#.5,e,32f,e,32f,c#,d#.,c#";
//*char *song = "MissionImp:d=16,o=6,b=95:32d,32d#,32d,32d#,32d,32d#,32d,32d#,32d,32d,32d#,32e,32f,32f#,32g,g,8p,g,8p,a#,p,c7,p,g,8p,g,8p,f,p,f#,p,g,8p,g,8p,a#,p,c7,p,g,8p,g,8p,f,p,f#,p,a#,g,2d,32p,a#,g,2c#,32p,a#,g,2c,a#5,8c,2p,32p,a#5,g5,2f#,32p,a#5,g5,2f,32p,a#5,g5,2e,d#,8d";
//*char *song = "goldenaxe:d=4,o=5,b=112:8a4,32p,16b4,16p,2c,16p,8a4,32p,16b4,16p,2c,16p,8b4,32p,16c,16p,d,32p,8g.4,16c,16b4,2a4";
//char *song = "missathing:d=4,o=5,b=125:2p,16a,16p,16a,16p,8a.,16p,a,16g,16p,2g,16p,p,8p,16g,16p,16g,16p,16g,8g.,16p,c6,16a#,16p,a,8g,f,g,8d,8f.,16p,16f,16p,16c,8c,16p,a,8g,16f,16p,8f,16p,16c,16p,g,f";
//char *song = "batman:d=8,o=5,b=180:b,b,a#,a#,a,a,a#,a#,b,b,a#,a#,a,a,a#,a#,4b,p,4b";
//char *song = "Beethoven:d=4,o=5,b=160:c,e,c,g,c,c6,8b,8a,8g,8a,8g,8f,8e,8f,8e,8d,c,e,g,e,c6,g";
//char *song = "Coca-cola:d=4,o=5,b=125:8f#6,8f#6,8f#6,8f#6,g6,8f#6,e6,8e6,8a6,f#6,d6,2p";
//char *song = "Abba - Mamma Mia :d=4,o=5,b=40:32f6,32d#6,32f6,8d#6,32d#6,32d#6,32f6,32g6,32f6,16d#.6,32p,16f6,8d#6,16g#6,32g#6,32g#6,32g#6,16g6,16d#.6,32p,8a#6,32a#6,32a#6,16a#6,16f6,16g6,8g#6,16g6,16g6,32g6,16g6,16d6,16d#6,8f6,16f6,8d#6,16g#6,32g#6,32g#6,32g#6,32g6,32d#6,32f6,16d#6";
//char *song = "Alice Deejay - Better Off Alone : d=4,o=5,b=125:a,8a,f#,a,a,g#,8e,8e.6,8e.6,8c#6,a,8a,f#,a,a,g#,8e,8d.6,8d.6,8c#6,a,8a,f#,a,a,g#,8e,8e.6,8e.6,8c#6,a,8a,f#,a,a,g#,8d,8d.6,8d.6,8c#6";
//char *song = "Eiffel 65 - Blue : d=4,o=5,b=125:a,8a#,8d,8g,8a#,8c6,8f,8a,a#,8g,8a#,8d6,8d#6,8g,8d6,8c6,8a#,8d,8g,8a#,8c6,8f,8a,a#,8g,8a#,8d6,8d#6,8g,8d6,8c6,8a#,8d,8g,8a#,8a,8c,8f,g.,";
//*char *song = "PinkPanther:d=4,o=5,b=160:8d#,8e,2p,8f#,8g,2p,8d#,8e,16p,8f#,8g,16p,8c6,8b,16p,8d#,8e,16p,8b,2a#,2p,16a,16g,16e,16d,2e";
//*char *song = "ScoobyDoo:d=4,o=5,b=160:8e6,8e6,8d6,8d6,2c6,8d6,e6,2a,8a,b,g,e6,8d6,c6,8d6,2e6,p,8e6,8e6,8d6,8d6,2c6,8d6,f6,2a,8a,b,g,e6,8d6,2c6";
//char *song = "StarWars:d=4,o=5,b=180:8f,8f,8f,2a#.,2f.6,8d#6,8d6,8c6,2a#.6,f.6,8d#6,8d6,8c6,2a#.6,f.6,8d#6,8d6,8d#6,2c6,p,8f,8f,8f,2a#.,2f.6,8d#6,8d6,8c6,2a#.6,f.6,8d#6,8d6,8c6,2a#.6,f.6,8d#6,8d6,8d#6,2c6";
//*char *song = "SuperMan:d=4,o=5,b=180:8g,8g,8g,c6,8c6,2g6,8p,8g6,8a.6,16g6,8f6,1g6,8p,8g,8g,8g,c6,8c6,2g6,8p,8g6,8a.6,16g6,8f6,8a6,2g.6,p,8c6,8c6,8c6,2b.6,g.6,8c6,8c6,8c6,2b.6,g.6,8c6,8c6,8c6,8b6,8a6,8b6,2c7,8c6,8c6,8c6,8c6,8c6,2c.6";
//char *song = "we-rock:d=4,o=6,b=40:32f#.5,32g.5,32a.5,32d6,32a.5,32d6,32a5,32d6,32a.5,16e.6,32a.5,16a5,8d.6,32g.5,32a.5,32b.5,32d6,32b.5,32d6,32b5,32d6,32b.5,16e.6,32a.5,16a5,8d.6,32f#.5,32g.5,32a.5,32d6,32a.5,32d6,32a5,32d6,32a.5,16e.6,32a.5,16a5,8d.6,32g.5,32a.5,32b.5,32d6,32b.5,32d6,32b5,32d6,32b.5,16e.6,32a.5,16a5,16d.6,";
//*char *song = "mslug:d=4,o=5,b=63:32f,32c,32a#,32d#,8d#.6,32d6,32d#6,32d6,32c6,32a#,32d6,16c.6,32f,f.,32g#,32d#,32c#6,32f#,8f#.6,32f7,32f#6,32f6,32d#6,32c#6,32f6,16d#6,16d6,16d#6,g#6,16g#,16g#,16a#,8b.,32a#,32g#,8a#,8d#,8a.,32g#,32f#,8g#,8c#,8g#.,32f#,32e,8c#,8d#,8e,2d#";

void setup(void)
{
 Serial.begin(9600);
 tonalidade.begin(9);
}

#define ehDigito(n) (n >= '0' && n <= '9')

void play_rtttl(char *p)
{
 // Absolutamente nenhum erro ao verificar aqui

byte vazia_dur = 4;
 byte vazia_oct = 6;
 int bpm = 63;
 int num;
 long notaInteira;
 long duracao;
 byte note;
 byte escala;

while(*p != ':') p++; 
 p++;

// get default duracao
 if(*p == 'd')
 {
 p++; p++; // pula "d="
 num = 0;
 while(ehDigito(*p))
 {
 num = (num * 10) + (*p++ - '0');
 }
 if(num > 0) vazia_dur = num;
 p++; 
 }

Serial.print("dur: "); Serial.println(vazia_dur, 10);

// obtive uma oitava padrão
 if(*p == 'o')
 {
 p++; p++; // pula "o="
 num = *p++ - '0';
 if(num >= 3 && num <=7) vazia_oct = num;
 p++; 
 }

Serial.print("doct: "); Serial.println(vazia_oct, 10);

// obtem o BPM
 if(*p == 'b')
 {
 p++; p++; // pula "b="
 num = 0;
 while(ehDigito(*p))
 {
 num = (num * 10) + (*p++ - '0');
 }
 bpm = num;
 p++; // skip colon
 }

Serial.print("bpm: "); Serial.println(bpm, 10);

// O BPM geralmente expressa o número de quartas notas por minuto
 notaInteira = (60 * 1000L / bpm) * 4; // este é o momento da nota inteira (em milissegundos)

Serial.print("wn: "); Serial.println(notaInteira, 10);


 // agora começa o loop de notas
 while(*p)
 {
 // primeiro, obtem a nota duracao, se possível
 num = 0;
 while(ehDigito(*p))
 {
 num = (num * 10) + (*p++ - '0');
 }
 
 if(num) duracao = notaInteira / num;
 else duracao = notaInteira / vazia_dur; // precisamos verificar se somos uma nota pontilhada após

// now get the note
 note = 0;

switch(*p)
 {
 case 'c':
 note = 1;
 break;
 case 'd':
 note = 3;
 break;
 case 'e':
 note = 5;
 break;
 case 'f':
 note = 6;
 break;
 case 'g':
 note = 8;
 break;
 case 'a':
 note = 10;
 break;
 case 'b':
 note = 12;
 break;
 case 'p':
 default:
 note = 0;
 }
 p++;

// obtem o sustenido
 if(*p == '#')
 {
 note++;
 p++;
 }

// obtenha opcional '.' nota pontilhada
 if(*p == '.')
 {
 duracao += duracao/2;
 p++;
 }
 
 // obtenha escalar
 if(ehDigito(*p))
 {
 escala = *p - '0';
 p++;
 }
 else
 {
 escala = vazia_oct;
 }

escala += OITAVA_OFFSET;

if(*p == ',')
 p++; // skip comma for next note (or we may be at the end)

// now play the note

if(note)
 {
 Serial.print("Tocando: ");
 Serial.print(escala, 10); Serial.print(' ');
 Serial.print(note, 10); Serial.print(" (");
 Serial.print(notas[(escala - 4) * 12 + note], 10);
 Serial.print(") ");
 Serial.println(duracao, 10);
 tonalidade.play(notas[(escala - 4) * 12 + note]);
 delay(duracao);
 tonalidade.stop();
 }
 else
 {
 Serial.print("Pausando: ");
 Serial.println(duracao, 10);
 delay(duracao);
 }
 }
}

void loop(void)
{
 play_rtttl(song);
 Serial.println("Done.");
 while(1);
}

Conclusão:

Fizemos uma  pequena demonstração da reprodução da trilha sonora do filme Indiana Jones, através do módulo Buzzer, olhem só como ficou.

https://youtu.be/2Gp9SWQrrlk

Viu como é bem simples compor melodias com o módulo Buzzer?
Agora como dever de casa desafiamos você a compor a sua própria musica, depois coloque nos comentários suas experiências. ;D

Posts relacionados

Aprenda a utilizar a ponte H L293D com Arduino

por autocore
7 anos ago

Configurando drivers para placas Arduino

por autocore
8 anos ago

Funcionamento Resistores Pull-Up e Pull-Down

por Danilo Nogueira
6 anos ago
Sair da versão mobile