Árvore de Natal DIY musical com buzzer 2

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?

Árvore de Natal com buzzer

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:

Detalhe conexões

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.

Circuito Arduino e árvore de natal DIY 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;
}

Quer saber como ficou a nossa árvore? Confira no vídeo abaixo!

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.

Faça seu comentário

Acesse sua conta e participe

2 Comentários

  1. ow como eh o esquema ELETRICO da arvore Tio
    responde ai
    valeu

    1. 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