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:
- Buzzer Ativo 5V
- Kit Push-button com capas coloridas
- Potenciômetro Trimpot 1K
- Mini Protoboard 170 pontos
- Jumpers macho-macho
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:
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
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.
//Programa: Arvore de Natal sonora //Autor: MakerHero //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); } } //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.
Gostou deste post de Árvore de Natal DIY com buzzer? Deixe seu comentário logo abaixo.
ow como eh o esquema ELETRICO da arvore Tio
responde ai
valeu
Olá Guilherme,
Você pode consultar o esquemático no seguinte tutorial: https://www.makerhero.com/blog/arvore-de-natal-com-arduino/
Abraço!
Rosana – Equipe MakerHero