Você está na página 1de 5

Árvore de Natal DIY musical com buzzer 2

filipeflop.com/blog/arvore-de-natal-diy-com-buzzer/

Lembra desse post lá de 2015, onde fizemos uma árvore de natal DIY (“Do It Yourself”
ou “faça você mesmo”), usando Arduino Uno, placa de fenolite e leds? Então. O tempo
passou, a árvore ficou aqui guardada, olhamos para ela e pensamos: por que não melhorar
esse projeto, adicionando um buzzer para que a árvore toque uma música de natal?

Assim, a nossa árvore agora tem um buzzer e um botão, que serve para ligar ou desligar a
música natalina. Vamos ver como isso funciona.

Lista de material árvore de natal DIY com buzzer


Além do material já listado no post original, para acrescentar música nesse projeto vamos
adicionar os seguintes itens:

Esquema de ligação com Arduino


A árvore foi feita para ser conectada diretamente nos pinos digitais 9, 10, 11, 12 e no pino
GND na parte superior, como você pode ver na imagem abaixo:

1/5
Vamos então adicionar o buzzer no pino analógico A5 e um botão para ligar ou desligar a
música no pino 2. Escolhemos o pino 2 para o botão pois vamos usar interrupções no
nosso programa, e para o buzzer usamos o pino A5 apenas para fins estéticos,
“escondendo” o fio atrás da árvore.

Para alimentação do circuito recomendamos utilizar fonte externa, já que teremos vários
leds ligados nas portas do Arduino, que por sua vez tem limitação no consumo total de
corrente que pode suportar. O trimpot é opcional e foi colocado para regular o volume no
buzzer.

Programa Árvore de Natal

2/5
O programa continua sendo bem simples, não utilizando nenhuma biblioteca especial
para funcionar. Usamos somente as portas digitais e analógicas como entrada ou saída. A
parte de áudio utiliza arrays e foi desenvolvida por Giacomo Cerquone.

O botão conectado ao pino 2 permite que possamos usar a interrupção do Arduino para
ligar ou desligar a música, ou seja, quando o botão for pressionado, o microcontrolador
vai parar o que estiver fazendo para executar a função interrupcao_botao(). Essa
função vai inverter o estado da variável vbot, que pode assumir o valor 0 (sem música) ou
1 (com música).

Quando terminar de executar essa função, o programa continua rodando de onde parou,
sem interromper a tarefa principal que é acender os leds de forma aleatória.

3/5
//Programa: Arvore de Natal sonora
//Autor: FILIPEFLOP

//Definicao pinos leds, botao e buzzer


#define led_vermelho_inf 9
#define led_verde 10
#define led_vermelho_sup 11
#define led_estrela 12
#define pino_botao 2
#define pino_buzzer A5

int tempo = 150;


char notes[] = "eeeeeeegcde fffffeeeeddedg";
int duration[] = {1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2
};

//Estado do botao
byte vbot = 0;

void playSong(char note, int duration)


{
char notesName[] = { 'c', 'd', 'e', 'f', 'g' };
int tones[] = { 261, 293, 329, 349, 392 };
for (int i = 0; i < sizeof(tones); i++)
{
if (note == notesName[i]) {
//Bind the notesName to tones
tone(pino_buzzer, tones[i], duration);
}
}
}
void setup()
{
Serial.begin(9600);
pinMode(pino_buzzer, OUTPUT);
pinMode(led_vermelho_inf, OUTPUT);
pinMode(led_verde, OUTPUT);
pinMode(led_vermelho_sup, OUTPUT);
pinMode(led_estrela, OUTPUT);
pinMode(pino_botao, INPUT_PULLUP);
//Rotina que sera executada caso o botao seja pressionado
attachInterrupt(digitalPinToInterrupt(pino_botao), interrupcao_botao , CHANGE);
randomSeed(analogRead(0));
}

void loop()
{
for (int i = 0; i < sizeof(notes) - 1; i++)
{
acendeled();
if (notes[i] == ' ')
{
delay(duration[i] * tempo);
} else
{
if (vbot == 1)
{
playSong(notes[i], duration[i] * tempo);

4/5
}
}
//Pausa entre as notas
delay((tempo * 2)*duration[i]);
apagaled();
}
}

void acendeled()
{
int escolha_led = random(4);
switch (escolha_led)
{
case 0:
digitalWrite(led_vermelho_inf, HIGH);
break;
case 1:
digitalWrite(led_verde, HIGH);
break;
case 2:
digitalWrite(led_vermelho_sup, HIGH);
break;
case 3:
digitalWrite(led_estrela, HIGH);
break;
}
}

void apagaled()
{
digitalWrite(led_vermelho_inf, LOW);
digitalWrite(led_verde, LOW);
digitalWrite(led_vermelho_sup, LOW);
digitalWrite(led_estrela, LOW);
}

void interrupcao_botao()
{
static unsigned long last_interrupt_time = 0;
unsigned long interrupt_time = millis();
// If interrupts come faster than 200ms, assume it's a bounce and ignore
if (interrupt_time - last_interrupt_time > 200)
{
vbot = !vbot;
}
last_interrupt_time = interrupt_time;
}

Esse projeto pode ser melhorado por exemplo com um sensor ultrassônico que aciona o
circuito quando alguém se aproxima ou até mesmo um sensor touch substituindo o push-
button.

5/5

Você também pode gostar