Básico - Hub 006

Altere o efeito sequencial de leds pressionando o botão

 

Sugerido por: Wilber Spinoza

Objetivo

Criar 10 efeitos diferentes de iluminação sequencial com 10 LEDs ou utilizando uma barra gráfica. Esses efeitos são alterados pressionando um botão, ou seja, cada vez que pressiono o botão, altero um efeito.

Componentes necessários

Referência

Componente

Quantidade

Imagem

Observação

Protoboard Protoboard 830 pontos 1 Resultado de imagem para protoboard 830v

No mínimo utilizar protoboard com 830 pontos

Jumpers Kit cabos ligação macho / macho 1  
Led 5mm

LED 5mm

10 Resultado de imagem para led vermelho

No projeto utilizamos 10 leds azuis

Você também poderá utilizar LEDs de 5 ou 3 mm nas cores que desejar, alto brilho ou difuso.

Resistor

Resistor

10

10 Resistores 150Ω (ou superiores)

Se precisar usar outros valores, calcule o resistor apropriado para o led utilizado - Calcular Resistor ou use a Tabela Resistor para Leds

Barra Gráfica (bargraph) Barra Gráfica de Leds 1

Opcional: Você poderá substituir os leds por barra gráfica(10 segmentos) nas cores que desejar

Arduino UNO R3 Arduino UNO 1

Você poderá utilizar uma placa Arduino UNO original ou similar

Montagem do Circuito com Leds - Simulação

 

Montagem do Circuito com Barra Gráfica

 

Referências

Projeto 17 - Dez efeitos de iluminação sequencial com leds ou barra gráfica

Como usar push button com Arduino (programação)

Código do Projeto (Sketch)

Faça o dowload e abra o arquivo hub006.ino no IDE do Arduino:

Ou se preferir, copie e cole o código abaixo no IDE do Arduino:

/*******************************************************************************
*
*    HB 06 - Efeitos de iluminação sequencial com leds - muda com botão
*        Sugerido por Wilber Spinoza
*        Adaptado por: Angelo Luis Ferreira
*           http://squids.com.br/arduino
*
******************************************************************************/
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  
    }
}

Obs. Ao abrir o monitor serial do IDE do Arduino visualizaremos os valores da variável "control" que indica qual efeito está sendo visualizado:

Vídeo

Desafios

Com base neste projeto, resolva o seguinte desafio:

Compartilhe:

Doações

Contribua pra manter o site online :)

Inscreva-se no canal Squids

Você está preparado?

Squids Arduino News

Desafio 82 - Projeto 92 Relógio digital com temperatura, umidade e datas Com base no projeto Projeto 92 - Criando um relógio digital com OLED SSD1306, módulo DS3231 e Arduino resolva os seguin...

Básico - Projeto 92 Criando um relógio digital com Oled SSD1306 - bibliotecas Adafruit Objetivo O objetivo neste projeto é criar um relógio digital usando um display OLED junto com o Real Time ...

Desafio 81 - Projeto I09 Controlando 2 motores com driver L9110s (menu via display LCD) Com base no projeto I09 - Motores DC com Driver Ponte H L9110 e Arduino - Controle de 4 velocidades pelo ...

Intermediário - Projeto 09 Motores DC com driver ponte H L9110s e Arduino - 4 velocidades Objetivo Neste tutorial vamos mostrar como controlar a velocidade de 2 motores CC (corrente contínua) a...

Básico - Hub 008 Usar o módulo display 4 dígitos 74HC595   Sugerido por: Tim Santos Objetivo O objetivo é adaptar o  Projeto 63 - Usando o módulo TM1637 (display 4 dígitos) com Arduino e u...

Outros artigos

Mais: Desafios Projetos Básicos Projetos Intermediários Básico

Topo