Projeto de Efeitos Sequenciais com 10 LEDs no Arduino Controlados por Push Button

 

Projeto de Efeitos Sequenciais com 10 LEDs no Arduino Controlados por Push Button

Introdução

Neste artigo, vamos desenvolver um projeto utilizando um Arduino para controlar 10 LEDs que exibem diferentes efeitos sequenciais, alterados por meio de um push button. Os LEDs serão conectados nas portas digitais 4 a 13, e o botão será conectado à porta digital 2. Este projeto é uma ótima introdução à programação de microcontroladores, manipulação de entradas e saídas digitais, e criação de efeitos visuais interativos.


Materiais Necessários

  • Arduino (Uno, Nano ou similar)

  • 10 LEDs (qualquer cor)

  • 10 resistores (220Ω a 330Ω)

  • 1 push button

  • 1 resistor de pull-down (10kΩ)

  • Protoboard e jumpers


Montagem do Circuito

  1. LEDs: Conecte os LEDs nas portas 4 a 13 do Arduino, cada um com um resistor em série para limitar a corrente.

  2. Push Button: Conecte um terminal do botão ao pino digital 2 e o outro ao +5V. Use um resistor de 10kΩ como pull-down entre o pino 2 e o GND para evitar flutuações.




Programação no Arduino

O código abaixo implementa três efeitos diferentes de sequência de LEDs, alternados pelo push button:

Código Completo

cpp
Copy
Download
byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // cria um array para os pinos digitais dos LEDs
byte butPin = 2;
byte control = 0;
int ledDelay;
int direction;
int currentLED;
int ledDir;
int ledEsq;
int l;
int h;

void setup() {
  for (int x=0; x<10; x++) { // define todos os pinos dos LEDs como saída
    pinMode(ledPin[x], OUTPUT);
  }
  pinMode(butPin, INPUT_PULLUP);
  Serial.begin(9600);  
}
   

void loop() {
  // muda de efeito
  if(!digitalRead(butPin)) {
    while (!digitalRead(butPin)) {} // espera soltar o botão
    delay(10); // reduz efeito bouncing
    control++;
    if(control>10) control = 1;
    Serial.println(control);
  }
 
  //cria repetições dos efeitos
  if (control==1) efeito1();
  if (control==2) efeito2();
  if (control==3) efeito3();
  if (control==4) efeito4();
  if (control==5) efeito5();
  if (control==6) efeito6();
  if (control==7) efeito7();
  if (control==8) efeito8();
  if (control==9) efeito9();
  if (control==10) efeito10();        
}


void efeito1() {
  // EFEITO 1 - vai e volta
      currentLED = 0;
      direction = 1;
      for(int i = 0; i < 72; i++) { // efeito 1: vai e volta
        digitalWrite(ledPin[currentLED], HIGH); // acende o LED atual
        currentLED += direction; // incrementa de acordo com o valor de direction
        delay(100);
        for (int x=0; x<10; x++) { // apaga todos os LEDs
          digitalWrite(ledPin[x], LOW);
        }
        // altera a direção se tivermos atingido o fim
        if (currentLED == 9) {direction = -1;}
        if (currentLED == 0) {direction = 1;}
        if(!digitalRead(butPin)) break; // interrompe o ciclo
    }
}

void efeito2() {
  // EFEITO 2 - girando
    currentLED = 0;
    direction = 1;
    for(int i = 0; i < 150; i++){ // efeito 2: girando
           
        digitalWrite(ledPin[currentLED], HIGH); // acende o LED atual
        if (currentLED>0){digitalWrite(ledPin[currentLED-1], LOW);} // acende o LED atual
        currentLED += direction; // incrementa de acordo com o valor de direction
        delay(35);
        if (currentLED == 10) {digitalWrite(ledPin[currentLED-1], LOW);currentLED = 0;}
        if(!digitalRead(butPin)) break; // interrompe o ciclo
        }  
}

void efeito3() {
// EFEITO 3 - pares e ímpares    
    currentLED = 0;
    direction = 1;
    for(int i = 0; i < 84; i++){ // efeito 3: pares e ímpares      
        if (direction==1) {
        if ( currentLED % 2 == 0 ) {
        digitalWrite(ledPin[currentLED], HIGH); // acende o LED atual
        currentLED += direction; // incrementa de acordo com o valor de direction
        }
        else {
        digitalWrite(ledPin[currentLED], LOW); // apaga o LED atual
        currentLED += direction; // incrementa de acordo com o valor de direction
        }
        delay (65);
        }
        if (direction==-1){
        if ( currentLED % 2 == 0 ) {
        digitalWrite(ledPin[currentLED], LOW); // acende o LED atual
        currentLED += direction; // incrementa de acordo com o valor de direction
        }
        else {
        digitalWrite(ledPin[currentLED], HIGH); // apaga o LED atual
        currentLED += direction; // incrementa de acordo com o valor de direction
        }
        delay (65);
        }
       
        // altera a direção se tivermos atingido o fim
        if (currentLED == 10) {direction = -1;}
        if (currentLED == -1) {direction = 1;}
        if(!digitalRead(butPin)) break; // interrompe o ciclo
    }
}

void efeito4() {
  //EFEITO 4 - pares e ímpares 2
   for(int i = 0; i < 17; i++){ // efeito 4: pares e ímpares
        if(!digitalRead(butPin)) break; // interrompe o ciclo
        for (int x=0; x<10; x++) { // ACENDE OS LEDs PARES
            if ( x % 2 == 0 ) {
            digitalWrite(ledPin[x], HIGH); // ACENDE o LED atual            
            }
        }
        if(!digitalRead(butPin)) break; // interrompe o ciclo      
        for (int x=0; x<10; x++) { // APAGA OS LEDs IMPARES
            if ( x % 2 != 0 ) {
            digitalWrite(ledPin[x], LOW); // apaga o LED atual            
            }
        }
        if(!digitalRead(butPin)) break; // interrompe o ciclo      
        delay(200);
        for (int x=0; x<10; x++) { // APAGA OS LEDs PARES
            if ( x % 2 == 0 ) {
            digitalWrite(ledPin[x], LOW); // apaga o LED par atual            
            }
            digitalWrite(ledPin[x], LOW); // apaga o LED par atual  
        }
        if(!digitalRead(butPin)) break; // interrompe o ciclo
        for (int x=0; x<10; x++) { // acende OS LEDs IMPARES
            if ( x % 2 != 0 ) {
            digitalWrite(ledPin[x], HIGH); // apaga o LED atual            
            }
            if(!digitalRead(butPin)) break; // interrompe o ciclo
        }
        if(!digitalRead(butPin)) break; // interrompe o ciclo      
        delay(200);      
    }
       for (int x=0; x<10; x++) { // APAGA OS LEDs IMPARES
            if ( x % 2 != 0 ) {
            digitalWrite(ledPin[x], LOW); // apaga o LED atual            
            }
            if(!digitalRead(butPin)) break; // interrompe o ciclo
        }
       
        delay(100);        
}

void efeito5() {
  //EFEITO 5 - VU Meter
    currentLED = 0;
    direction = 1;
    for(int i = 0; i < 82; i++){ // efeito 5: Vu Meter
           
        if (direction==1) {
        digitalWrite(ledPin[currentLED], HIGH); // acende o LED atual
        currentLED += direction; // incrementa de acordo com o valor de direction
        delay(35);
        }
        if (direction==-1){
        digitalWrite(ledPin[currentLED], LOW); // acende o LED atual
        currentLED += direction; // incrementa de acordo com o valor de direction
        delay(35);
        }
        if(!digitalRead(butPin)) break; // interrompe o ciclo
        delay (200);
        // altera a direção se tivermos atingido o fim
        if (currentLED == 10) {direction = -1; currentLED=9;}
        if (currentLED == -1) {direction = 1; currentLED=0;}          
    }
}

void efeito6() {
  // EFEITO 6 - Giroflex
    for(int i = 0; i < 30; i++){
        digitalWrite(ledPin[0], HIGH);
        digitalWrite(ledPin[5], HIGH);
        delay(50);
        digitalWrite(ledPin[0], LOW);
        digitalWrite(ledPin[5], LOW);
        digitalWrite(ledPin[1], HIGH);
        digitalWrite(ledPin[6], HIGH);
        delay(50);
        digitalWrite(ledPin[1], LOW);
        digitalWrite(ledPin[6], LOW);
        digitalWrite(ledPin[2], HIGH);
        digitalWrite(ledPin[7], HIGH);
        delay(50);
        digitalWrite(ledPin[2], LOW);
        digitalWrite(ledPin[7], LOW);
        digitalWrite(ledPin[3], HIGH);
        digitalWrite(ledPin[8], HIGH);
        delay(50);
        digitalWrite(ledPin[3], LOW);
        digitalWrite(ledPin[8], LOW);
        digitalWrite(ledPin[4], HIGH);
        digitalWrite(ledPin[9], HIGH);
        delay(50);
        digitalWrite(ledPin[4], LOW);
        digitalWrite(ledPin[9], LOW);
        if(!digitalRead(butPin)) break; // interrompe o ciclo
    }
}

void efeito7() {
  // EFEITO 7
    for(int i = 0; i < 12; i++){
        for (int x=0; x<10; x++) { // acente todos os LEDs
        digitalWrite(ledPin[x], HIGH);
        }
        if(!digitalRead(butPin)) break; // interrompe o ciclo
        delay(150);

        for (int x=0; x<10; x++) { // APAGA OS LEDs PARES
            if ( x % 2 == 0 ) {
            digitalWrite(ledPin[x], LOW); // apaga o LED par atual
            }
        }
        if(!digitalRead(butPin)) break; // interrompe o ciclo
        delay(350);

        for (int x=0; x<10; x++) { // ACENDE OS LEDs PARES
            if ( x % 2 == 0 ) {
            digitalWrite(ledPin[x], HIGH); // ACENDE o LED atual
            }
        }
        if(!digitalRead(butPin)) break; // interrompe o ciclo
        delay(150);

        for (int x=0; x<10; x++) { // APAGA OS LEDs IMPARES
            if ( x % 2 != 0 ) {
            digitalWrite(ledPin[x], LOW); // apaga o LED atual
            }
        }
        if(!digitalRead(butPin)) break; // interrompe o ciclo
        delay(350);

        for (int x=0; x<10; x++) { // APAGA OS PARES
            if ( x % 2 == 0 ) {
            digitalWrite(ledPin[x], LOW); // apaga o LED atual
            }
        }
        if(!digitalRead(butPin)) break; // interrompe o ciclo
        delay(150);
    }
}

void efeito8() {
  // EFEITO 8 - Começa nos cantos
    ledDir = 0;
    ledEsq = 9;
    for(int i = 0; i < 4; i++){
       
        for(int i = 0; i < 5; i++){
            digitalWrite(ledPin[ledDir], HIGH); // acende o LED atual
           
            ledDir = ledDir +1;
            if(!digitalRead(butPin)) break; // interrompe o ciclo
            delay(182);
           
            digitalWrite(ledPin[ledEsq], HIGH); // acende o LED atual
            ledEsq = ledEsq -1;
            if(!digitalRead(butPin)) break; // interrompe o ciclo
            delay(182);
        }
        if(!digitalRead(butPin)) break; // interrompe o ciclo

         ledDir = 0;
         ledEsq = 9;  
         for(int i = 0; i < 5; i++){
            digitalWrite(ledPin[ledDir], LOW); // apaga o LED atual
            ledDir = ledDir +1;
            if(!digitalRead(butPin)) break; // interrompe o ciclo
            delay(182);
           
            digitalWrite(ledPin[ledEsq], LOW); // apaga o LED atual
            ledEsq = ledEsq -1;
            if(!digitalRead(butPin)) break; // interrompe o ciclo
            delay(182);
        }
      if(!digitalRead(butPin)) break; // interrompe o ciclo    
    }
}

void efeito9() {
  // EFEITO 9 - zig e zag
       
    for(int i = 0; i < 7; i++){
       
        l = 1; // apaga
        h = 0; // acende

        for(int i = 0; i < 10; i++){
           
            digitalWrite(ledPin[l], LOW); // apaga o LED atual
            l = l - 1;
            digitalWrite(ledPin[h], HIGH); // acende o LED atual          
            h = h + 2;
            if(!digitalRead(butPin)) break; // interrompe o ciclo  
            delay(90);
           
            digitalWrite(ledPin[l], LOW); // apaga o LED atual
            l = l + 2;
            digitalWrite(ledPin[h], HIGH); // acende o LED atual          
            h = h - 1;
            if(!digitalRead(butPin)) break; // interrompe o ciclo  
            delay(90);
        }
    }
}

void efeito10() {
 
// EFEITO 10 - três em três
       
    for(int i = 0; i < 7; i++){
       
        l = 7; // apaga
        h = 0; // acende

        for(int i = 0; i < 10; i++){
           
            digitalWrite(ledPin[l], LOW); // apaga o LED atual
            l = l + 1;
            if (l>9) {l = 0;}
            digitalWrite(ledPin[h], HIGH); // acende o LED atual          
            h = h + 1;
            if(!digitalRead(butPin)) break; // interrompe o ciclo  
            delay(103);        
        }
        if(!digitalRead(butPin)) break; // interrompe o ciclo  
        l = 7;
        for(int i = 0; i < 3; i++){
        digitalWrite(ledPin[l], LOW); // apaga o LED atual
        l = l + 1;
        if(!digitalRead(butPin)) break; // interrompe o ciclo  
        delay(103);
        }
        if(!digitalRead(butPin)) break; // interrompe o ciclo  
    }
}


Funcionamento do Projeto

  1. Botão: Ao pressionar o botão, o sistema alterna entre três efeitos diferentes.

  2. Efeitos:

    • Efeito 1: Acende os LEDs em sequência, um por vez.

    • Efeito 2: Acende os LEDs em sequência e depois retorna.

    • Efeito 3: Pisca os LEDs em grupos alternados (pares e ímpares).


Importância do Projeto

Este projeto é fundamental para quem está aprendendo Arduino e eletrônica porque:
✅ Introduz conceitos básicos de I/O digital (entrada com botão e saída com LEDs).
✅ Ensina a trabalhar com arrays e estruturas de repetição para controle de múltiplos LEDs.
✅ Aplica técnicas de debounce para evitar leituras falsas do botão.
✅ Estimula a criatividade na criação de diferentes padrões de iluminação.
✅ Prepara para projetos mais complexos, como matrizes de LEDs, displays e automação.


Conclusão

Este projeto de efeitos sequenciais com LEDs e push button é uma ótima maneira de praticar programação e eletrônica com Arduino. Ele pode ser expandido adicionando mais efeitos, sensores ou até mesmo um display para mostrar o modo atual.

Comentários

Postagens mais visitadas