Árvore de natal com Arduino

Eletrônica Arduino 24 de Novembro de 2019 às 20:46

Que tal fazer a sua própria árvore de natal para enfeitar a sua casa para o mês de Dezembro? E não vai ser qualquer árvore de natal, ela será feita com componentes eletrônicos e Arduino Uno, dando aquela "cara" maker ao ambiente, além disso você pode usar a criatividade e fazer do seu jeito. A ideia eu tirei do blog filipeflop, onde achei bastante interessante, porém personalizei a árvore e o código do Arduino para combinar com meus outros enfeites de natal.

Árvore de natal com Arduino

Para iniciar separe a seguinte lista de materiais necessários para montar a sua árvore de natal com Arduino.

  • 1 Arduino Uno com cabo USB
  • 1 Placa de fenolite ou fibra de vidro ilhada/perfurada de 10x15cm
  • 8 LEDs vermelhos
  • 5 LEDs verdes
  • 1 Barra de pinos macho 1x6 90°
  • 8 Resistores de 220Ω ou 2KΩ
  • Fios jumpers
  • Bateria (Opcional)

O primeiro passo é realizar o contorno da árvore de natal na placa ilhada utilizando uma caneta de retroprojetor fina (1mm), aquelas canetas para fazer placa de circuito impresso. Faça o desenho conforme a imagem abaixo.

Desenho de uma árvore de natal

Eu utilizei uma placa de fibra de vidro perfurada. No desenho implementei o tronco da árvore para ficar completa e mais fácil de conectar no Arduino. Se você errar o desenho, utilize um pano com álcool para apagar a tinta da caneta de retroprojetor.

Desenho da árvore de natal na placa ilhada.

Depois de completar o desenho, precisamos recortar esta placa seguindo o contorno. É um procedimento um pouco chato, principalmente se a placa é de fibra de vidro, no artigo do filipeflop eles utilizaram uma placa de fenolite e cortaram com uma tesoura, sendo uma ótima opção. Para a minha placa, eu utilizei uma esmerilhadeira ou "Makita" para alguns, é um equipamento bruto e muito perigoso, mas o resultado foi muito bom. É claro que você pode tentar cortar com uma serrinha com muita paciência.

Com a árvore recortada, vamos dar um fundo de tinta verde para ficar bonito. Eu utilizei um pincel fino e tinta de tecido, que é mais resistente que guache. Você pode utilizar tinta spray. Se manchar o outro lado da placa com a tinta de tecido, limpe com um pano e álcool os excessos, sem molhar muito.

Com tudo pronto, podemos colocar os LEDs em suas respectivas posições para representar as bolinhas de natal e suas luzes, onde temos o LED vermelho da estrela, os LEDs superiores e inferiores vermelhos e os centrais verdes. Podemos observar que alguns LEDs são ligados em série, e utilizamos as portas digitais 9, 10, 11, 12 e o GND do Arduino Uno.

Esquema árvore de natal com Arduino Uno.

Utilizando um ferro de solda e estanho, solde primeiramente a barra de pino 1x6 90° no tronco da árvore, depois os LEDs em suas posições, os resistores e os fios jumpers conforme a imagem abaixo.

Ligações dos fios, LEDs e resistores na placa (Árvore de natal)

O resultado é esta árvore de natal! Mas faltando alguns caprichos adicionais de minha parte...

Árvore de natal com LEDs e tinta de tecido verde.

Você pode utilizar lantejoulas verdes e cola branca, aquelas escolares, para dar mais brilho à sua árvore de natal. Só cuidado para não colar lantejoulas nas partes eletrônicas, como terminais dos LEDs ou solda. Use sua criatividade!

Árvore de natal para Arduino Uno.

Código da árvore de natal

Agora é a hora de fazer a árvore de natal piscar, para isso abra a IDE oficial do Arduino, e cole este código, compile e envie ao Arduino Uno.

Lembrando que você também pode modificar o código para personalizar os efeitos dos LEDs com PWM, que dá um efeito bacana.

/**
 * Firmware para árvore de natal com Arduino Uno
 * 
 * Autor: Filipeflop
 * Modificações: Ana Paula Messina - tecdicas
 * 
 * 24/11/2019
 * 
 * Feliz Natal :)
 * 
 */

#define LED_RED_INF 9
#define LED_VERDE 10
#define LED_RED_SUP 11
#define LED_ESTRELA 12

void setup()
{
  pinMode(LED_RED_INF, OUTPUT);
  pinMode(LED_VERDE, OUTPUT);
  pinMode(LED_RED_SUP, OUTPUT);
  pinMode(LED_ESTRELA, OUTPUT);
}
 
void loop()
{
  for (int x=0;x<=6;x++)
  {
    int valor = random(1, 5);
    switch (valor)
    {
      case 1:
          digitalWrite(LED_ESTRELA, HIGH);
          ControlePWM(LED_RED_SUP, 80, 50);
          ControlePWM(LED_VERDE, 80, 50);
          ControlePWM(LED_RED_INF, 80, 50);
          ControlePWM(LED_VERDE, 80, 50);
          
          ControlePWM(LED_RED_SUP, 80, 50);
          ControlePWM(LED_VERDE, 80, 50);
          ControlePWM(LED_RED_INF, 80, 50);
          ControlePWM(LED_VERDE, 80, 50);
          
          ControlePWM(LED_RED_SUP, 80, 50);
          ControlePWM(LED_VERDE, 80, 50);
          ControlePWM(LED_RED_INF, 80, 50);
          ControlePWM(LED_VERDE, 80, 50);
          
          ControlePWM(LED_RED_SUP, 80, 50);
          ControlePWM(LED_VERDE, 80, 50);
          ControlePWM(LED_RED_INF, 80, 50);
          ControlePWM(LED_VERDE, 80, 50);
          
          ControlePWM(LED_RED_SUP, 80, 50);
          ControlePWM(LED_VERDE, 80, 50);
          ControlePWM(LED_RED_INF, 80, 50);
          ControlePWM(LED_RED_INF, 80, 50);
        break;
      case 2:
          digitalWrite(LED_ESTRELA, HIGH);
          ControlePWM(LED_RED_SUP, 50, 30);
          ControlePWM(LED_VERDE, 50, 30);
          ControlePWM(LED_RED_INF, 50, 30);
          ControlePWM(LED_VERDE, 50, 30);
          
          ControlePWM(LED_RED_SUP, 50, 30);
          ControlePWM(LED_VERDE, 50, 30);
          ControlePWM(LED_RED_INF, 50, 30);
          ControlePWM(LED_VERDE, 50, 30);
          
          ControlePWM(LED_RED_SUP, 50, 30);
          ControlePWM(LED_VERDE, 50, 30);
          ControlePWM(LED_RED_INF, 50, 30);
          ControlePWM(LED_VERDE, 50, 30);
          
          ControlePWM(LED_RED_SUP, 50, 30);
          ControlePWM(LED_VERDE, 50, 30);
          ControlePWM(LED_RED_INF, 50, 30);
          ControlePWM(LED_VERDE, 50, 30);
          
          ControlePWM(LED_RED_SUP, 50, 30);
          ControlePWM(LED_VERDE, 50, 30);
          ControlePWM(LED_RED_INF, 50, 30);
          ControlePWM(LED_RED_INF, 50, 30);
        break;
      case 3:
          digitalWrite(LED_ESTRELA, HIGH);
          ControlePWM(LED_RED_INF, 80, 50);
          ControlePWM(LED_VERDE, 80, 50);
          ControlePWM(LED_RED_SUP, 80, 50);
          
          ControlePWM(LED_RED_INF, 80, 50);
          ControlePWM(LED_VERDE, 80, 50);
          ControlePWM(LED_RED_SUP, 80, 50);
          
          ControlePWM(LED_RED_INF, 80, 50);
          ControlePWM(LED_VERDE, 80, 50);
          ControlePWM(LED_RED_SUP, 80, 50);
          
          ControlePWM(LED_RED_INF, 80, 50);
          ControlePWM(LED_VERDE, 80, 50);
          ControlePWM(LED_RED_SUP, 80, 50);
          
          ControlePWM(LED_RED_INF, 80, 50);
          ControlePWM(LED_VERDE, 80, 50);
          ControlePWM(LED_RED_SUP, 80, 50);
        break;
      case 4:
        for(int x=0;x<=6;x++)
        {
          digitalWrite(LED_ESTRELA, HIGH);
          delay(50);
          digitalWrite(LED_ESTRELA, LOW);
          delay(50);
        } 
        ControlePWM(LED_RED_SUP, 100, 50);
        ControlePWM(LED_RED_SUP, 100, 50);
        ControlePWM(LED_RED_SUP, 100, 50);

        ControlePWM(LED_VERDE, 100, 50);
        ControlePWM(LED_VERDE, 100, 50);
        ControlePWM(LED_VERDE, 100, 50);
        
        ControlePWM(LED_RED_INF, 100, 50);
        ControlePWM(LED_RED_INF, 100, 50);
        ControlePWM(LED_RED_INF, 100, 50);
      break;
    }
  }

  for (int x=0;x<=35;x++)
  {
    int valor = random(1, 5);
    int tempo = 300;
    switch (valor)
    {
      case 1:
        analogWrite(LED_RED_INF, 254);
        delay(tempo);
        analogWrite(LED_RED_INF, 0);
        break;
      case 2:
        analogWrite(LED_RED_SUP, 254);
        delay(tempo);
        analogWrite(LED_RED_SUP, 0);
        break;
      case 3:
        analogWrite(LED_VERDE, 254);
        delay(tempo);
        analogWrite(LED_VERDE, 0);
        break;
      case 4:
        digitalWrite(LED_ESTRELA, 1);
        delay(tempo);
        digitalWrite(LED_ESTRELA, 0);
        break;
    }
  }
  
  int tempo = 20;
  for (int x=0;x<=20;x++)
  {
    delay(tempo);
    analogWrite(LED_RED_INF, 254);
    delay(tempo);
    analogWrite(LED_RED_SUP, 254);
    delay(tempo);
    analogWrite(LED_VERDE, 254);
    delay(tempo);
    digitalWrite(LED_ESTRELA, HIGH);
    delay(tempo);
    analogWrite(LED_RED_INF, 0);
    analogWrite(LED_RED_SUP, 0);
    analogWrite(LED_VERDE, 0);
    digitalWrite(LED_ESTRELA, LOW);
  }
}
 
void ControlePWM(int led, int time_up, int time_dowm)
{
  for (int x=0; x<=254;x+=time_up)
  {
    analogWrite(led, x);  
    delay(20);
  }
  for (int x=254;x>=0;x-=time_dowm)
  {
    analogWrite(led, x);
    delay(20);
  }
  analogWrite(led, 0);
}

Veja o resultado final!

Nossa árvore de natal está pronta, e você pode utiliza-la para decorar seu ambiente para a família e convidados neste dia tão especial!

Boas festas e feliz natal! 🎅

Ana Paula Messina

Analista de sistemas e membro do tecdicas.