Construa Seu Próprio Teclado de Piano Eletrônico com Músicas Integradas
Componentes e Materiais
| Componente | Quantidade |
|---|---|
| Arduino UNO | 1 |
| LCD Padrão Adafruit - 16x2 Branco sobre Azul | 1 |
| Chave Pushbutton SparkFun 12mm | 8 |
| Resistor 220 ohm | 4 |
| Resistor 560 ohm | 1 |
| Resistor 1k ohm | 1 |
| Resistor 4.7K ohm | 1 |
| Resistor 10k ohm | 3 |
| Resistor 1M ohm | 1 |
| Buzzer Piezo | 1 |
| LED (genérico) | 1 |
| Potenciômetro de Volta Única - 10k ohms | 1 |
| Fios Jumper (genéricos) | 1 |
| Protoboard (genérica) | 1 |
Sobre o Projeto
Introdução
Para começar, devo avisar que sou completamente novo no mundo da eletrônica. Tenho uma base decente em programação, o que ajuda, mas estou sempre aberto a novas ideias e sugestões para qualquer um dos projetos que criei.
Recentemente, venho aprendendo mais sobre o Buzzer Piezo e a programação envolvida, e esta é minha criação baseada no que aprendi até agora. Há muito espaço para expansão com novos recursos ou chaves, o que planejo fazer depois, mas por agora vamos ao próximo desafio!
Abaixo está um vídeo de como o dispositivo funciona, incluindo o menu de músicas pré-definidas. Admito que tecnicamente a música 4 e 5 são iguais, mas o que posso dizer, tenho o impulso de criar coisas maiores e melhores e escrever o código de música para mais músicas não era uma delas! A codificação básica tanto para os loops principais quanto para os loops individuais das músicas são bem fáceis de adaptar às suas próprias ideias, então sinta-se à vontade para mudar como achar melhor.
Veja em Ação!
Vídeo demonstrativo do funcionamento do teclado.
Como Configurar o Hardware
As teclas do piano...
As chaves do piano foram conectadas usando uma escada de resistores. Os resistores são colocados em ordem sequencial, conectando cada chave à alimentação. Para meu projeto, escolhi usar (em ohms) 1M, 10k, 4.7K, 1K, 560 e 220. A primeira chave do piano (à esquerda) é conectada à alimentação e também à próxima chave no circuito. A segunda chave é conectada ao menor resistor, e cada chave seguinte conecta-se ao próximo maior resistor na série. A última chave aterr a conexão via resistor de 10k ohm e também conecta todas as 7 chaves ao pino "analog in" A0 no Arduino. O sketch principal define quais frequências de notas musicais estão associadas a cada tecla do piano. Para este projeto, usei C4, D4, E4, F4, G4, A4 e B4, com C4 sendo a chave mais à esquerda. Altere os valores de frequência ou adicione chaves adicionais para personalizar totalmente seu próprio projeto!
A tela LCD...
Conecte os pinos do LCD de acordo com o diagrama de circuito abaixo. Conecte o pino 3 do LCD ao Potenciômetro para controle de contraste da tela. Os pinos externos do Potenciômetro são conectados à alimentação e terra para completar este circuito. O pino 15 do LCD é conectado à alimentação via resistor de 220 ohm. Se algum destes pinos mudar no seu próprio projeto, atualize o código conforme necessário.
A chave de menu...
Conecte a chave de menu à alimentação, e aterre-a através de um resistor de 10K ohm. Esta chave também deve ser conectada ao pino 7 no Arduino para que você possa controlá-la via código.
O LED...
O LED é usado para indicar quando você está no "modo menu", e as teclas do piano foram desabilitadas. A luz do LED acende quando a chave de menu é pressionada. Conecte o ânodo (positivo) do LED ao pino 6 do Arduino, e aterre o LED através de um resistor de 220 ohm.
O Buzzer Piezo...
Para integrar o Buzzer Piezo, simplesmente conecte uma extremidade ao pino 8 do Arduino, e o outro lado ao terra via resistor de 220 ohm. A função "tone" no código procurará este pino para tocar a nota chamada.
Como o Código Funciona
A configuração...
- O sketch começa importando as bibliotecas "LiquidCrystal.h" e "pitches.h" para que possamos referenciar vários itens delas mais tarde no código.
- Em seguida, o código é configurado definindo um nome para a chave de menu, determinando quais pinos são entradas vs. saídas, e definindo os valores de frequência para cada uma das 7 teclas do piano.
- Uma nova aba foi criada para cada música individual em um esforço para manter meu código organizado e mais fácil de entender, e para expandir depois. Se você quiser excluir ou adicionar mais músicas, certifique-se de alterar o código no sketch principal "Electronic Keyboard" também.
O loop principal...
- O teclado começa com o LED desligado e todas as teclas do piano ativas.
- Uma vez que o loop detecta que o botão de menu foi pressionado, ele desabilita as teclas do piano e liga o LED para indicar que você está no "modo menu".
Acessando o menu...
- Pressione o botão de menu para percorrer as músicas presentes, e pressione qualquer uma das teclas do piano para começar a tocar a música exibida na tela LCD.
- A tela LCD mostrará qual música está tocando no momento, depois retornará ao mesmo ponto no menu uma vez que a música terminar de tocar. A partir daí, você pode repetir ou continuar na lista de músicas disponíveis.
- Clique duas vezes no botão de menu para reiniciar o menu do início.
- Para voltar a usar as teclas do piano, percorra o restante das músicas no menu. Quando a tela LCD estiver em branco e o LED desligado, as teclas do piano funcionarão novamente.
Código
- Electronic Keyboard (Teclado Eletrônico)
- Song1 (Música 1)
- Song2 (Música 2)
- Song3 (Música 3)
- Song4 (Música 4)
- Song5 (Música 5)
- pitches.h
Electronic Keyboard Arduino
O código principal
// Configuração LCD, Chave e LED
#include <LiquidCrystal.h>
#include "pitches.h"
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int LCDswitchPin = 7; // define nome da chave de menu/LCD
int LCDswitchState = 0; // define estado da chave de menu/LCD para off/low
int prevLCDswitchState = 0;
int blueLED = 6;
int LCDswitchCounter = 0; // contador para número de pressões do botão de menu
// (este código conta os pressionamentos do botão de menu, exibe no seu computador,
// e reinicia do zero após encerrar "modo menu". atualmente não tem outro efeito
// neste sketch, mas é um bom ponto de partida para expandir o projeto com
// novos recursos depois
// Teclas de Notas Musicais - Define valores de frequência
int notes[] = {262, 294, 330, 349, 392, 440, 494}; // Define notas C, D, E, F, G, A, B
////////////////////////////////////////////////
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
pinMode(LCDswitchPin, INPUT);
pinMode(blueLED, OUTPUT);
digitalWrite(blueLED, LOW); // LED permanece desligado enquanto teclas do piano estão ligadas
} // fim setup
////////////////////////////////////////////////
void loop() {
LCDswitchState = digitalRead(LCDswitchPin);
int keyVal = analogRead(A0);
Serial.println(keyVal);
lcd.noDisplay();
digitalWrite(blueLED, LOW); // Desliga LED toda vez que loop principal inicia
// ************** INICIA "LCDstart" QUANDO BOTÃO DE MENU É PRESSIONADO ***********
if (LCDswitchState == HIGH) {
digitalWrite(blueLED, HIGH); // Liga LED para mostrar que teclas do piano estão desabilitadas e dispositivo está em "modo menu"
lcd.display();
lcd.clear();
LCDstart();
}
// ***********************************************************************
////// NOTAS DO TECLADO & DECLARAÇÕES DE FREQUÊNCIA //////
// Use a escada de resistores que você criou para alterar a voltagem de cada botão de tecla do piano
// 220 ohm = C5
// 560 ohm = D5
// 1K ohm = E5
// etc...
if(keyVal == 1023) {
tone(8, notes[0]); // C
} // fim if
else if(keyVal >= 990 && keyVal <=1010) {
tone(8, notes[1]); // D
} // fim else if
else if(keyVal >= 960 && keyVal <= 980) {
tone(8, notes[2]); // E
} // fim else if
else if(keyVal >= 900 && keyVal <= 945) {
tone(8, notes[3]); // F
} // fim else if
else if(keyVal >= 650 && keyVal <= 710) {
tone(8, notes[4]); // G
} // fim else if
else if(keyVal >= 500 && keyVal <= 550) {
tone(8, notes[5]); // A
} // fim else if
else if(keyVal >= 5 && keyVal <= 10) {
tone(8, notes[6]); // B
} // fim else if
else if(keyVal <= 1) {
// se nenhuma chave é pressionada, não toca tom
noTone(8);
} // fim else if
} // fim loop de frequência de tom
/////////////////////////////////////////////////////
void LCDstart() {
int keyVal = analogRead(A0);
LCDswitchState = digitalRead(LCDswitchPin); // verifica estado do botão de menu
while (LCDswitchState == LOW) {
// continua loop enquanto botão de menu não é pressionado
LCDswitchState = digitalRead(LCDswitchPin); // verifica estado do botão de menu a cada início do loop
//************* INICIA LOOP TÍTULO MÚSICA 1 ********************
if (LCDswitchState == HIGH) { // se botão de menu é pressionado, então...
LCDswitchCounter++; // define contagem de botão para 1
Serial.print("number of button pushes: ");
Serial.println(LCDswitchCounter);
delay(300); // tempo mínimo até contagem adicionar 1 mais
Song1title();
lcd.clear();
break;
}
//************* SENÃO MOSTRA MENU ****************
else {
// se botão de menu não é pressionado
LCDswitchCounter=0; // define contagem do botão de menu para 0
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WHICH SONG WOULD");
lcd.setCursor(0, 1);
lcd.print("YOU LIKE TO PLAY");
delay(50); // retorna ao main
}
} // fim while
} // fim loop LCDstart
// ************* LOOP MÚSICA 1 COMEÇA AQUI **************
void Song1title() {
int keyVal = analogRead(A0);
LCDswitchState = digitalRead(LCDswitchPin); // verifica estado do botão de menu novamente
while (LCDswitchState == LOW) {
// continua loop enquanto botão de menu não é pressionado
LCDswitchState = digitalRead(LCDswitchPin); // verifica estado do botão de menu novamente
//************* INICIA LOOP TÍTULO MÚSICA 2 ********************
if (LCDswitchState == HIGH) { // se botão de menu é pressionado, então...
LCDswitchCounter++; // define contagem de botão para 2
Serial.print("number of button pushes: ");
Serial.println(LCDswitchCounter);
delay(300); // tempo mínimo até contagem adicionar 1 mais
Song2title();
lcd.clear();
break;
} else {
// se botão de menu não é pressionado
int keyVal = analogRead(A0);
Serial.println(keyVal);
if(keyVal >= 2) {
digitalWrite(blueLED, LOW);
Song1();
break;
} // fim if
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SUPER MARIO BROS");
lcd.setCursor(0, 1);
lcd.print(" THEME SONG");
delay(50);
}
} // fim while música 1 -> 2
} // fim loop Song1title
// ************* LOOP MÚSICA 2 COMEÇA AQUI **************
void Song2title() {
int keyVal = analogRead(A0);
LCDswitchState = digitalRead(LCDswitchPin); // verifica estado do botão de menu novamente
while (LCDswitchState == LOW) {
// continua loop enquanto botão de menu não é pressionado
LCDswitchState = digitalRead(LCDswitchPin); // verifica estado do botão de menu novamente
//************* INICIA LOOP TÍTULO MÚSICA 3 ********************
if (LCDswitchState == HIGH) { // se botão de menu é pressionado, então...
LCDswitchCounter++; // define contagem de botão para 3
Serial.print("number of button pushes: ");
Serial.println(LCDswitchCounter);
delay(300); // tempo mínimo até contagem adicionar 1 mais
Song3title();
lcd.clear();
break;
} else {
// se botão de menu não é pressionado
int keyVal = analogRead(A0);
Serial.println(keyVal);
if(keyVal >= 2) {
digitalWrite(blueLED, LOW);
Song2();
break;
} // fim if
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SUPER MARIO BROS");
lcd.setCursor(0, 1);
lcd.print(" UNDERWORLD");
delay(50);
}
} // fim while música 2 -> 3
} // fim loop Song2title
// ************* LOOP MÚSICA 3 COMEÇA AQUI **************
void Song3title() {
int keyVal = analogRead(A0);
LCDswitchState = digitalRead(LCDswitchPin); // verifica estado do botão de menu novamente
while (LCDswitchState == LOW) {
// continua loop enquanto botão de menu não é pressionado
LCDswitchState = digitalRead(LCDswitchPin); // verifica estado do botão de menu novamente
//************* INICIA LOOP TÍTULO MÚSICA 4 ********************
if (LCDswitchState == HIGH) { // se botão de menu é pressionado, então...
LCDswitchCounter++; // define contagem de botão para 4
Serial.print("number of button pushes: ");
Serial.println(LCDswitchCounter);
delay(300); // tempo mínimo até contagem adicionar 1 mais
Song4title();
lcd.clear();
break;
} else {
// se botão de menu não é pressionado
int keyVal = analogRead(A0);
Serial.println(keyVal);
if(keyVal >= 2) {
digitalWrite(blueLED, LOW);
Song3();
break;
} // fim if
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" JEOPARDY");
lcd.setCursor(0, 1);
lcd.print(" THEME SONG");
delay(50);
}
} // fim while música 3 -> 4
} // fim loop Song3title
// ************* LOOP MÚSICA 4 COMEÇA AQUI **************
void Song4title() {
int keyVal = analogRead(A0);
LCDswitchState = digitalRead(LCDswitchPin); // verifica estado do botão de menu novamente
while (LCDswitchState == LOW) {
// continua loop enquanto botão de menu não é pressionado
LCDswitchState = digitalRead(LCDswitchPin); // verifica estado do botão de menu novamente
//************* INICIA LOOP TÍTULO MÚSICA 5 ********************
if (LCDswitchState == HIGH) { // se botão de menu é pressionado, então...
LCDswitchCounter++; // define contagem de botão para 5
Serial.print("number of button pushes: ");
Serial.println(LCDswitchCounter);
delay(300); // tempo mínimo até contagem adicionar 1 mais
Song5title();
lcd.clear();
break;
} else {
// se botão de menu não é pressionado
int keyVal = analogRead(A0);
Serial.println(keyVal);
if(keyVal >= 2) {
digitalWrite(blueLED, LOW);
Song4();
break;
} // fim if
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" SONG 4");
lcd.setCursor(0, 1);
lcd.print(" TITLE HERE");
delay(50);
}
} // fim while música 4 -> 5
} // fim loop Song4title
// ************* LOOP MÚSICA 5 COMEÇA AQUI **************
void Song5title() {
int keyVal = analogRead(A0);
LCDswitchState = digitalRead(LCDswitchPin); // verifica estado do botão de menu novamente
while (LCDswitchState == LOW) {
// continua loop enquanto botão de menu não é pressionado
LCDswitchState = digitalRead(LCDswitchPin); // verifica estado do botão de menu novamente
//************* INICIA LOOP TÍTULO MÚSICA 4 ********************
if (LCDswitchState == HIGH) { // se botão de menu é pressionado, então...
LCDswitchCounter=0; // define contagem de botão para 0
Serial.print("number of button pushes: ");
Serial.println(LCDswitchCounter);
delay(300); // tempo mínimo até contagem adicionar 1 mais
lcd.clear();
} else {
// se botão de menu não é pressionado
int keyVal = analogRead(A0);
Serial.println(keyVal);
if(keyVal >= 2) {
digitalWrite(blueLED, LOW);
Song5();
break;
} // fim if
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" SONG 5");
lcd.setCursor(0, 1);
lcd.print(" TITLE HERE");
delay(50);
}
} // fim while música 4 -> 5
} // fim loop Song5title
Song1 Arduino
Código para a 1ª música. Atualmente tem a Música Tema do Super Mario Bros carregada.
//***************** NOTAS DA MÚSICA 1 AQUI **************************
///////////////////////////////////////////////////////////////////////////////////////////////////////
///////// TUTORIAL COMPLETO SOBRE COMO CRIAR AS MÚSICAS DO MARIO PODE SER ENCONTRADO AQUI: /////////////////////////
///////// https://www.linuxcircle.com/2013/03/31/playing-mario-bros-tune-with-arduino-and-piezo-buzzer/ ///////////////////////////////////////////////////////////////////////////////////////////////////////
void Song1() {
lcd.clear();
// notas na melodia:
int melody[] = {
NOTE_E7, NOTE_E7, 0, NOTE_E7, 0, NOTE_C7, NOTE_E7, 0, NOTE_G7, 0, 0, 0,
NOTE_G6, 0, 0, 0, NOTE_C7, 0, 0, NOTE_G6, 0, 0, NOTE_E6, 0, 0, NOTE_A6,
0, NOTE_B6, 0, NOTE_AS6, NOTE_A6, 0, NOTE_G6, NOTE_E7, NOTE_G7, NOTE_A7,
0, NOTE_F7, NOTE_G7, 0, NOTE_E7, 0, NOTE_C7, NOTE_D7, NOTE_B6, 0, 0,
NOTE_C7, 0, 0, NOTE_G6, 0, 0, NOTE_E6, 0, 0, NOTE_A6, 0, NOTE_B6, 0,
NOTE_AS6, NOTE_A6, 0, NOTE_G6, NOTE_E7, NOTE_G7, NOTE_A7, 0, NOTE_F7,
NOTE_G7, 0, NOTE_E7, 0, NOTE_C7, NOTE_D7, NOTE_B6, 0, 0
};
// durações das notas: 4 = semibreve, 8 = mínima, etc.:
int noteDurations[] = {
12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 9, 9, 9,
12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
12, 12, 9, 9, 9, 12, 12, 12, 12, 12, 12, 12, 12, 12
};
lcd.setCursor(1, 0);
lcd.print("Now playing...");
lcd.setCursor(0, 1);
lcd.print("MARIO THEME SONG");
int size = sizeof(melody) / sizeof(int);
for (int thisNote = 0; thisNote < size; thisNote++) {
// para calcular a duração da nota, pegue um segundo
// dividido pelo tipo de nota.
// ex: semibreve = 1000 / 4, mínima = 1000/8, etc.
int noteDuration = 1000 / noteDurations[thisNote];
tone(8, melody[thisNote], noteDuration);
// para distinguir as notas, defina um tempo mínimo entre elas.
// a duração da nota + 30% parece funcionar bem:
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// para o tom tocando:
tone(8, 0, noteDuration);
}
Song1title();
} // fim loop Song1
Song2 Arduino
Código para a 2ª música. Atualmente tem a Música Underworld do Super Mario Bros carregada.
//***************** NOTAS DA MÚSICA 2 AQUI **************************
///////////////////////////////////////////////////////////////////////////////////////////////////////
///////// TUTORIAL COMPLETO SOBRE COMO CRIAR AS MÚSICAS DO MARIO PODE SER ENCONTRADO AQUI: /////////////////////////
///////// https://www.linuxcircle.com/2013/03/31/playing-mario-bros-tune-with-arduino-and-piezo-buzzer/ ///////////////////////////////////////////////////////////////////////////////////////////////////////
void Song2() {
lcd.clear();
// notas na melodia:
int melody[] = {
NOTE_C4, NOTE_C5, NOTE_A3, NOTE_A4, NOTE_AS3, NOTE_AS4, 0, 0,
NOTE_C4, NOTE_C5, NOTE_A3, NOTE_A4, NOTE_AS3, NOTE_AS4, 0, 0,
NOTE_F3, NOTE_F4, NOTE_D3, NOTE_D4, NOTE_DS3, NOTE_DS4, 0, 0,
NOTE_F3, NOTE_F4, NOTE_D3, NOTE_D4, NOTE_DS3, NOTE_DS4, 0, 0,
NOTE_DS4, NOTE_CS4, NOTE_D4, NOTE_CS4, NOTE_DS4, NOTE_DS4,
NOTE_GS3, NOTE_G3, NOTE_CS4, NOTE_C4, NOTE_FS4, NOTE_F4,
NOTE_E3, NOTE_AS4, NOTE_A4, NOTE_GS4, NOTE_DS4, NOTE_B3,
NOTE_AS3, NOTE_A3, NOTE_GS3, 0, 0, 0
};
// durações das notas: 4 = semibreve, 8 = mínima, etc.:
int noteDurations[] = {
12, 12, 12, 12, 12, 12, 6, 3, 12, 12, 12, 12, 12, 12, 6, 3,
12, 12, 12, 12, 12, 12, 6, 3, 12, 12, 12, 12, 12, 12, 6, 6,
18, 18, 18, 6, 6, 6, 6, 6, 6, 18, 18, 18, 18, 18, 18, 10, 10,
10, 10, 10, 10, 3, 3, 3
};
lcd.setCursor(1, 0);
lcd.print("Now playing...");
lcd.setCursor(0, 1);
lcd.print("MARIO UNDERWORLD");
int size = sizeof(melody) / sizeof(int);
for (int thisNote = 0; thisNote < size; thisNote++) {
int noteDuration = 1000 / noteDurations[thisNote];
tone(8, melody[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
tone(8, 0, noteDuration);
}
Song2title();
} // fim loop Song2
Song3 Arduino
Código para a 3ª música. Atualmente tem a Música Tema do Jeopardy carregada.
//***************** NOTAS DA MÚSICA 3 AQUI **************************
void Song3() {
lcd.clear();
// notas na melodia:
int melody[] = {
NOTE_C2, NOTE_F3, NOTE_C3, NOTE_A2, NOTE_A2, NOTE_C3, NOTE_F3, NOTE_C3,
NOTE_C3, NOTE_F3, NOTE_C3, NOTE_F3, NOTE_AS3, NOTE_G3, NOTE_F3, NOTE_E3,
NOTE_D3, NOTE_CS3, NOTE_C2, NOTE_F3, NOTE_C3, NOTE_A2, NOTE_A2,
// repete linha 1 e 2
NOTE_C3, NOTE_F3, NOTE_C3, NOTE_AS3, 0, NOTE_G3, NOTE_F3, NOTE_E3,
NOTE_D3, NOTE_CS3, NOTE_C3
};
// durações das notas: 4 = semibreve, 8 = mínima, etc.:
int noteDurations[] = {
4, 4, 4, 8, 8, 4, 4, 2, 4, 4, 4, 4, 3, 8, 8, 8, 8, 8,
4, 4, 4, 8, 8, // repete linha 1 e 2
4, 4, 2, 4, 8, 8, 4, 4, 4, 4, 4, 4, 0
};
lcd.setCursor(1, 0);
lcd.print("Now playing...");
lcd.setCursor(0, 1);
lcd.print(" JEOPARDY");
for (int thisNote = 0; noteDurations[thisNote] != 0; thisNote++) {
int noteDuration = 2000/noteDurations[thisNote];
tone(8, melody[thisNote],noteDuration * 0.9);
delay(noteDuration);
}
Song3title();
} // fim loop Song3
Song4 Arduino
Código para a 4ª música. Atualmente tem uma melodia curta e genérica carregada.
//***************** NOTAS DA MÚSICA 4 AQUI **************************
void Song4() {
lcd.clear();
// notas na melodia:
int melody[] = { NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4 };
// durações das notas: 4 = semibreve, 8 = mínima, etc.:
int noteDurations[] = { 4, 8, 8, 4, 4, 4, 4, 4 };
lcd.setCursor(1, 0);
lcd.print("Now playing...");
lcd.setCursor(0, 1);
lcd.print(" SONG 4 TITLE");
int thisNote = 0;
for (int thisNote = 0; thisNote < 8; thisNote++) {
int noteDuration = 1000 / noteDurations[thisNote];
tone(8, melody[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(8); // para o tom tocando:
} // fim for
Song4title();
} // fim loop Song4
Song5 Arduino
Código para a 5ª música. Atualmente tem uma melodia curta e genérica carregada.
//***************** NOTAS DA MÚSICA 5 AQUI **************************
void Song5() {
lcd.clear();
// notas na melodia:
int melody[] = { NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4 };
// durações das notas: 4 = semibreve, 8 = mínima, etc.:
int noteDurations[] = { 4, 8, 8, 4, 4, 4, 4, 4 };
lcd.setCursor(1, 0);
lcd.print("Now playing...");
lcd.setCursor(0, 1);
lcd.print(" SONG 5 TITLE");
int thisNote = 0;
for (int thisNote = 0; thisNote < 8; thisNote++) {
int noteDuration = 1000 / noteDurations[thisNote];
tone(8, melody[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(8); // para o tom tocando:
} // fim for
Song5title();
} // fim loop Song5
pitches.h Arduino
Biblioteca de notas musicais para músicas. Salve na mesma pasta dos seus outros sketches de teclado/músicas.
//*************************************************
//** DEFINIR NOTAS MUSICAIS
//*************************************************
#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978
Esquemáticos
Diagramas de fiação disponíveis na seção de download.
Processo de manufatura
- Primeiros Passos com TJBot: Construa, Configure e Controle por Voz seu Próprio Robô de IA
- Alerta Inteligente de Sede para Plantas – Sensor DIY para Hidratação Ideal
- Relógio de Palavras em Italiano com Arduino Nano, NeoPixel, LCD e RTC
- Transforme seu Teclado MIDI em Tutor de Piano Inteligente com Arduino, LEDs e MuseScore
- Construa um Sensor de Obstáculos Simples com Arduino – Tutorial Fácil com LED IR e Fotodiodo
- Medidor kWh Confiável com Sigfox e Arduino MKR Fox 1200
- Monitor de Temperatura com Bluetooth usando Arduino Nano
- Mini Rádio Estéreo Compacto RDA5807 – Projeto com Arduino Nano
- Fechadura por Gestos Sem Toque: Acesso Seguro com APDS-9960 e Arduino
- Teste de Tempo de Reação Preciso com Arduino UNO