4 de dezembro de 2011

Sequencial de LEDs


Esse é um sequencial de LEDs usando o Arduino.



No vídeo não mostra todas as sequencias, mas programei 11 diferentes. O efeito fica muito legal!
Segue as fotos da montagem final na PCI, o esquema elétrico, e o código fonte.
Fiquem a vontade pra efetuar as melhorias (e muitas), e modificações.

É isso aí! Valeu!








/*------------------------
 SEQUENCIAL LEDS
 Fellipe Couto
 16/07/2011
 ------------------------*/
#include <EEPROM.h>
int qtd = 10; //Quantidade de leds.
int qtdSequencia = 11; //Quantidade de sequencias;
int led[] = {  
  2,3,4,5,6,7,8,9,10,11}; //Pinos dos leds.
int ledControle = 12; //Pino do led de controle. Indica se a variável controle for 0 (sequencia automática).
int controle = 0;

void setup(){
  for (int i=0; i<qtd; i++){ //Configura os pinos dos leds como saída.
    pinMode(led[i],OUTPUT);
  }
  pinMode(ledControle,OUTPUT); //Configura o pino do led controle como saída.
  LeEEPROM();
}

void loop(){
  delay(10);
  VerificaBotaoControle();
  if (controle == 0){
    //AUTOMÁTICO
    for (int j=1; j<=qtdSequencia; j++){
      for (int i=0; i<5; i++){
        sequencia(j);
        if (controle != 0) break; 
      }
      if (controle != 0) break;   
    }
  }
  else{
    sequencia(controle);
  }
}

void VerificaBotaoControle(){
  //Botão controle ligado ao pino analógico 5. Com resistor de pull down 10k.
  if (analogRead(5) > 1000){
    ApagaTodos();
    delay(1000);
    controle++;
    if (controle > qtdSequencia){
      controle = 0;
    }
  }
  if (controle == 0){
    digitalWrite(ledControle,HIGH);
  }
  else{
    digitalWrite(ledControle,LOW);
  }
  GravaEEPROM();
}

void LeEEPROM(){
  controle = EEPROM.read(0);
}

void GravaEEPROM(){
  EEPROM.write(0,controle);
}

void AcendeTodos(){
  for (int i=0; i<qtd; i++){
    digitalWrite(led[i],HIGH);
  }
}

void ApagaTodos(){
  for (int i=0; i<qtd; i++){
    digitalWrite(led[i],LOW);
  }
}

void sequencia(int s){
  switch (s){
  case 1:
    s1();
    break;
  case 2:
    s2();
    break;
  case 3:
    s3();
    break;
  case 4:
    s4();
    break;
  case 5:
    s5();
    break;
  case 6:
    s6();
    break;
  case 7:
    s7();
    break;
  case 8:
    s8();
    break;
  case 9:
    s9();
    break;
  case 10:
    s10();
    break;
  case 11:
    s11();
    break;
  }
}

void s1(){
  int t1 = 40;
  VerificaBotaoControle();
  ApagaTodos();
  //Acende um por um.
  for (int i=0; i<qtd; i++){
    digitalWrite(led[i],HIGH);
    delay(t1);
    VerificaBotaoControle();
  }
  //Apaga um por um.
  for (int i=0; i<qtd; i++){
    digitalWrite(led[i],LOW);
    delay(t1);
    VerificaBotaoControle();
  }
}

void s2(){
  int t1 = 40;
  VerificaBotaoControle();
  ApagaTodos();
  //Acende um por um.
  for (int i=0; i<qtd; i++){
    digitalWrite(led[i],HIGH);
    delay(t1);
    VerificaBotaoControle();
  }
  //Apaga um por um.
  for (int i=0; i<qtd-1; i++){
    digitalWrite(led[i],LOW);
    delay(t1);
    VerificaBotaoControle();
  }
  //Acende um por um. (inverso)
  for (int i=qtd-1; i>=0; i--){
    digitalWrite(led[i],HIGH);
    delay(t1);
    VerificaBotaoControle();
  }
  //Apaga um por um. (inverso)
  for (int i=qtd-1; i>0; i--){
    digitalWrite(led[i],LOW);
    delay(t1);
    VerificaBotaoControle();
  }
}

void s3(){
  //ABRE E FECHA.
  int t1 = 50;
  VerificaBotaoControle();
  ApagaTodos();
  for (int i=0; i<qtd/2; i++){
    digitalWrite(led[i],HIGH);
    digitalWrite(led[qtd-1-i],HIGH);
    delay(t1);
    VerificaBotaoControle();
  }
  for (int i=0; i<(qtd/2)-1; i++){
    digitalWrite(led[i],LOW);
    digitalWrite(led[qtd-1-i],LOW);
    delay(t1);
    VerificaBotaoControle();
  }
  for (int i=(qtd/2)-2; i>=0; i--){
    digitalWrite(led[i],HIGH);
    digitalWrite(led[qtd-1-i],HIGH);
    delay(t1);
    VerificaBotaoControle();
  }
  for (int i=(qtd/2)-1; i>0; i--){
    digitalWrite(led[i],LOW);
    digitalWrite(led[qtd-1-i],LOW);
    delay(t1);
    VerificaBotaoControle();
  }
}

void s4(){
  //POLÍCIA 01
  int t1 = 50;
  VerificaBotaoControle();
  //Lado 1 acesso. (piscando)
  ApagaTodos();
  for (int j=0; j<qtd/2; j++){
    for (int i=0; i<qtd/2; i++){
      digitalWrite(led[i],HIGH);
    }
    delay(t1);
    for (int i=0; i<qtd/2; i++){
      digitalWrite(led[i],LOW);
    }
    delay(t1);
    VerificaBotaoControle();
  }
  //Lado 2 acesso. (piscando)
  ApagaTodos();
  for (int j=0; j<qtd/2; j++){
    for (int i=qtd/2; i<qtd; i++){
      digitalWrite(led[i],HIGH);
    }
    delay(t1);
    for (int i=qtd/2; i<qtd; i++){
      digitalWrite(led[i],LOW);
    }
    delay(t1);
    VerificaBotaoControle();
  }
}

void s5(){
  //POLÍCIA 02 
  int t1 = 50;
  int t2 = 300;
  VerificaBotaoControle();
  for (int i=0; i<qtd-1; i++){
    AcendeTodos();
    delay(t1);
    ApagaTodos();
    delay(t1);
    VerificaBotaoControle();
  }
  delay(t2);
}

void s6(){
  //FLASHS UM POR UM
  int t1 = 10;
  int t2 = 100;
  VerificaBotaoControle();
  ApagaTodos();
  for (int i=0; i<qtd; i++){
    digitalWrite(led[i],HIGH);
    delay(t1);
    digitalWrite(led[i],LOW);
    delay(t2);
    VerificaBotaoControle();
  }
}

void s7(){
  //FLASHS RANDOMICOS
  randomSeed(analogRead(0));  //Para o random ficar aleatorio, sem repetir a sequencia.
  int t1 = 10;
  int t2 = 100;
  int p = random(qtd);
  VerificaBotaoControle();
  ApagaTodos();
  for (int i=0; i<15; i++){
    digitalWrite(led[p],HIGH);
    delay(t1);
    digitalWrite(led[p],LOW);
    delay(t2);
    p = random(qtd);
    VerificaBotaoControle();
  }
}

void s8(){
  int t1 = 10;
  VerificaBotaoControle();
  for (int i=0; i<2; i++){
    AcendeTodos();
    delay(t1);
    ApagaTodos();
    for (int x=0; x<100; x++){
      VerificaBotaoControle();
      delay(t1);
    }
  }
}

void s9(){
  //CORRE NUM EFEITO MEIO 3D. :P
  int t1 = 60;
  VerificaBotaoControle();
  ApagaTodos();
  for (int i=1; i<qtd; i++){
    digitalWrite(led[i-2],LOW);
    digitalWrite(led[i-1],LOW);
    digitalWrite(led[i],HIGH);
    delay(t1);
    digitalWrite(led[i],LOW);
    digitalWrite(led[i-1],HIGH);
    delay(t1);
    VerificaBotaoControle();
  }
}

void s10(){
  int t1 = 150;
  VerificaBotaoControle();
  ApagaTodos();
  for (int x=0; x<3; x++){
    for (int i=0; i<qtd; i++){
      if (i%2 == 0){
        digitalWrite(led[i],HIGH);
      }
      else{
        digitalWrite(led[i],LOW);
      }
    }
    VerificaBotaoControle();
    delay(t1);
    for (int i=0; i<qtd; i++){
      if (i%2 == 0){
        digitalWrite(led[i],LOW);
      }
      else{
        digitalWrite(led[i],HIGH);
      }
    }
    VerificaBotaoControle();
    delay(t1);
  }
}

void s11(){
  int t1 = 40;
  int t2 = 300;
  VerificaBotaoControle();
  ApagaTodos();
  delay(t2);
  for (int i=0; i<qtd; i++){
    if (i != 0){
      digitalWrite(led[i-1],LOW);
    }
    digitalWrite(led[i],HIGH);
    delay(t1);
    VerificaBotaoControle();
  }
  for (int i=0; i<qtd-1; i++){
    if (i != 0){
      digitalWrite(led[i-1],LOW);
    }
    digitalWrite(led[i],HIGH);
    delay(t1);
    VerificaBotaoControle();
  }
  for (int i=0; i<qtd-2; i++){
    if (i != 0){
      digitalWrite(led[i-1],LOW);
    }
    digitalWrite(led[i],HIGH);
    delay(t1);
    VerificaBotaoControle();
  }
  for (int i=0; i<qtd-3; i++){
    if (i != 0){
      digitalWrite(led[i-1],LOW);
    }
    digitalWrite(led[i],HIGH);
    delay(t1);
    VerificaBotaoControle();
  }
  for (int i=0; i<qtd-4; i++){
    if (i != 0){
      digitalWrite(led[i-1],LOW);
    }
    digitalWrite(led[i],HIGH);
    delay(t1);
    VerificaBotaoControle();
  }
  for (int i=0; i<qtd-5; i++){
    if (i != 0){
      digitalWrite(led[i-1],LOW);
    }
    digitalWrite(led[i],HIGH);
    delay(t1);
    VerificaBotaoControle();
  }
  for (int i=0; i<qtd-6; i++){
    if (i != 0){
      digitalWrite(led[i-1],LOW);
    }
    digitalWrite(led[i],HIGH);
    delay(t1);
    VerificaBotaoControle();
  }
  for (int i=0; i<qtd-7; i++){
    if (i != 0){
      digitalWrite(led[i-1],LOW);
    }
    digitalWrite(led[i],HIGH);
    delay(t1);
    VerificaBotaoControle();
  }
  for (int i=0; i<qtd-8; i++){
    if (i != 0){
      digitalWrite(led[i-1],LOW);
    }
    digitalWrite(led[i],HIGH);
    delay(t1);
    VerificaBotaoControle();
  }
  delay(t1);
  VerificaBotaoControle();
  digitalWrite(led[0],HIGH);
  delay(t2);
  for (int i=0; i<qtd; i++){
    if (i != 0){
      digitalWrite(led[i-1],HIGH);
    }
    digitalWrite(led[i],LOW);
    delay(t1);
    VerificaBotaoControle();
  }
  for (int i=0; i<qtd-1; i++){
    if (i != 0){
      digitalWrite(led[i-1],HIGH);
    }
    digitalWrite(led[i],LOW);
    delay(t1);
    VerificaBotaoControle();
  }
  for (int i=0; i<qtd-2; i++){
    if (i != 0){
      digitalWrite(led[i-1],HIGH);
    }
    digitalWrite(led[i],LOW);
    delay(t1);
    VerificaBotaoControle();
  }
  for (int i=0; i<qtd-3; i++){
    if (i != 0){
      digitalWrite(led[i-1],HIGH);
    }
    digitalWrite(led[i],LOW);
    delay(t1);
    VerificaBotaoControle();
  }
  for (int i=0; i<qtd-4; i++){
    if (i != 0){
      digitalWrite(led[i-1],HIGH);
    }
    digitalWrite(led[i],LOW);
    delay(t1);
    VerificaBotaoControle();
  }
  for (int i=0; i<qtd-5; i++){
    if (i != 0){
      digitalWrite(led[i-1],HIGH);
    }
    digitalWrite(led[i],LOW);
    delay(t1);
    VerificaBotaoControle();
  }
  for (int i=0; i<qtd-6; i++){
    if (i != 0){
      digitalWrite(led[i-1],HIGH);
    }
    digitalWrite(led[i],LOW);
    delay(t1);
    VerificaBotaoControle();
  }
  for (int i=0; i<qtd-7; i++){
    if (i != 0){
      digitalWrite(led[i-1],HIGH);
    }
    digitalWrite(led[i],LOW);
    delay(t1);
    VerificaBotaoControle();
  }
  for (int i=0; i<qtd-8; i++){
    if (i != 0){
      digitalWrite(led[i-1],HIGH);
    }
    digitalWrite(led[i],LOW);
    delay(t1);
    VerificaBotaoControle();
  }
  delay(t1);
  VerificaBotaoControle();
  digitalWrite(led[0],LOW);
  delay(t1);
}

36 comentários:

  1. Entendi tudo desse código rsrs... Muito legal! Bjus!

    ResponderExcluir
  2. Felipe, bacana o sequencial, você tem como me passar o esquema completo e a placa pra fazer?

    meu e-mail é robsonribsilva@yahoo.com.br

    Abração e parabéns pelo blog! ;)

    ResponderExcluir
  3. Muito legal!
    Gostei muito deste projeto!
    Parabéns pelo blog, espero ansioso pelos próximos posts.
    Abs
    Antonio Henrique

    ResponderExcluir
  4. Respostas
    1. Fala Dr. Fellipe. Usei o seu código no 'stand-alone' do Arduino e ficou show. Gostei muito. Estou usando como sinalizador na entrada da minha empresa. Abraços.

      Excluir
    2. Dr. Marcelo! Legal!! Obrigado e abraços!!!

      Excluir
  5. Fala meu amigo!
    se possível manda pra mim o esquema desse sequencial.
    se vc tiver tbm o desenho da placa!
    desde já obrigado!
    jott.a@ig.com.br

    ResponderExcluir
  6. Ola Felipe, blza?
    POr acaso vc tem algum projeto de sequencial igual a este mais usando leds RGB.

    Desde ja agradeço pela atenção.

    Edson
    videofax4212@hotmail.com

    ResponderExcluir
    Respostas
    1. Boa noite, Edson!

      Não tenho um sequencial pronto com LEDs RGB, mas hoje postei um outro sequencial que pode ser adaptado para RGB. Já que para esses LEDs seriam necessários mais saídas para controle.
      http://www.efeitonerd.com.br/2012/09/super-sequencial-de-leds.html

      Abraços!

      Excluir
  7. Felipe, boa tarde, por favor, tenho um arduino mega, e não consegui fazer funcionar com essas linhas de comando, me ajuda por favor.

    ResponderExcluir
  8. OLá, por favor sou iniciante do arduino, e estou urgentemente precisando fazer algo parecido com este: http://www.youtube.com/watch?v=lKBRCLFI4-k porém comprei um mega e como ele tem saídas de sobra, gostaria de usa-las, sem os circuitos 74hc595. por favor me ajude. Se precisar até te pago pelo trabalho. aliancavideoproducoes@hotmail.com

    ResponderExcluir
  9. PRECISO FAZER UMA PLACA PARECIDO COM ESSE, POREM COM SOMENTE O PRIMEIRO SEQUECIAL (UM NA SEQUENCIA DO OUTRO), PRA COLOCAR EM UMA LANTERNA DE CARRETA DE BARCO.
    VAI DAR UM EFEITO MUITO LEGAL NAS SETAS.
    PODERIA ME DIZER QUAIS OS MATERIAIS E O ESQUEMA DE MONTAGEM PRA ESSA PLACA QUE PRECISO?

    ResponderExcluir
    Respostas
    1. Bom dia, Edson!

      Legal a ideia de fazer o projeto na seta!

      O projeto do blog atenderia. Montei utilizando as configurações do Arduino, e a primeira sequencia é a "s1()" no código fonte.

      Os componentes são poucos. Procure sobre Arduino Standalone. São esses os componentes que estão na placa de circuito que fiz e postei no blog.

      Qualquer dúvida, estamos aí!

      Abraços!!

      - CI Regulador de tensão 5v - LM7805
      - Capacitor eletrolítico - 100uF (02 unidades)
      - Capacitor cerâmico - 22pF (02 unidades)
      - Resistor - 10KΩ
      - Microcontrolador ATMega328-PU (com bootloader Arduino)

      Excluir
    2. felipe tem como passar o material como placa esquemático etc dessa postagem para eu tentar fazer aqui ??
      luisaugustocastro@hotmail.com

      Excluir
  10. Boa noite Felipe. Sua programação indica q a sequencia devera funcionar até o contador chegar a 5 (cinco) mudando para a próxima sequencia, minha pergunta é como fazer a mudança via botão, e tipo somente dois efeitos, o vai e vem e o q sai dos leds externos para os internos depois inverte (deu para entender esse segundo), e a troca ficaria no clic do botão. Abraço. instrutor.dc@gmail.com

    ResponderExcluir
    Respostas
    1. Bom dia!

      Caso queira trocar a sequência antes do contador chegar a cinco, já existe um botão ligado ao pino A5 para isso. É executada a função VerificaBotaoControle(), onde passa para a próxima sequência.
      As sequências são controladas através do 'for' dentro do loop principal do Arduino, em conjunto com a função sequencia(). Nessa função você pode excluir ou incluir novas chamadas de funções, e depois é só atualizar o número de sequências dentro do loop principal.

      Abraços!

      Excluir
  11. Bom dia Felipe, preciso de um circuito para controlar laser você teria algo para isso?
    Obrigado.
    João Miguel, se puder entre em contato comigo joao.fornazieri@hotmail.com

    ResponderExcluir
  12. Oi
    Estou procurando um meio para fazer uma sequência com uns 100 leds, mas no tipo super máquina, onde apenas 1 acende e vai de um lado para outro.
    Pode me ajudar a achar um início pras minhas buscas?
    Obrigado
    contato@fernandoflorim.com.br

    ResponderExcluir
    Respostas
    1. Bom dia, Fernando!
      Esse projeto pode te ajudar: http://www.efeitonerd.com.br/2012/09/super-sequencial-de-leds.html
      Qualquer dúvida, só falar!
      Abraços!

      Excluir
  13. tem como me mandar o esquema pra mim montar na PCI? Meu e-mail é gabrielcds80@hotmail.com

    ResponderExcluir
  14. Boa tarde Felipe!
    Parabéns pelo projeto, muito bom.
    Felipe, preciso usar uma dessas sequências para montar uma seta para direta e outra para esquerda e um strobo, usando para isso quatro portas para direita, quatro para esquerda e duas portas para o strobo e sendo controlado cada um por um botão, como devo fazer esta modificação no seu projeto. Meu e-mail é ribamarlima@ig.com.br. Obrigado.

    ResponderExcluir
    Respostas
    1. Bom dia, Ribamar!
      Para o projeto que precisa, parece que seria necessário desenvolver outro projeto diferente desse. Seria necessário mais outros botões para o acionamento das setas, correto?! Você pode aproveitar as sequencias que achar interessante desse fonte, e adiciona-las ao seu projeto. As funções das sequencias são as s1(), s2(), s3(),... Cada função é uma sequencia diferente.
      Abraços!

      Excluir
  15. oi gostei muito do seu projeto, poderia me dizer se poderia colocar uns 100 a 200 leds ???????? tem como ????

    ResponderExcluir
    Respostas
    1. É possível sim. Seria necessário alterações na lógica do código fonte e também no hardware.
      Um exemplo:
      http://www.efeitonerd.com.br/2012/09/super-sequencial-de-leds.html

      Excluir
  16. Olá gostaria de saber se teria como mudar a função pela porta serial ao invés de um botão ?

    ResponderExcluir
    Respostas
    1. Boa tarde!
      É possível sim.
      https://www.arduino.cc/en/Reference/Serial
      Abraços!

      Excluir
  17. Qual Arduino foi utiizado ????????????/

    ResponderExcluir
    Respostas
    1. Boa tarde! Foi montado de forma stand-alone. Não foi utilizado a placa arduino em si. Microcontrolador rodando com o bootloader do arduino UNO.

      Excluir
  18. Boa noite amigo. Não sei o nos 2 arduinos que montei, não consigo deixar que os efeitos fiquem de forma automatica, eu sempre preciso mudar os efeitos pelo botão.
    Seria possível remover o botão e deixar que os efeitos sigam em loop, um na sequencia do outro. Poderia me dizer como devo alterar o código. Abraços

    ResponderExcluir
  19. Boa noite amigo. Não sei o nos 2 arduinos que montei, não consigo deixar que os efeitos fiquem de forma automatica, eu sempre preciso mudar os efeitos pelo botão.
    Seria possível remover o botão e deixar que os efeitos sigam em loop, um na sequencia do outro. Poderia me dizer como devo alterar o código. Abraços

    ResponderExcluir
    Respostas
    1. Bom dia!
      Para ficar sempre no automático, a varíavel 'controle' deve estar com valor zero (0). Para forçar sempre o automático, pode comentar a chamado da função VerificaBotaoControle (linha 24). No botão, está ligado o resistor para pull-down de 10k?

      Excluir
  20. Fellipe boa noite
    Eu posso gravar o ci no arduino e coloca-lo na placa?
    tou meio confuso

    ResponderExcluir
  21. Ola.....muito bom o tegu projector e Blog.....gostaria de Montar em circuito impresso.....sera que Vic pode enviar os desenhos da Placa e circuito,para meu Email : marcomputter@gmail.com

    ResponderExcluir
  22. Olá Pessoal estou começando agora,com o arduino. Tenho algumas dificuldades na programação, mas estou gostando muito. mais quando acho postagens desse feitio fico muito feliz, Sou contramestre em eletricidade mas sempre fui apaixonado por eletrônica e agora uma nova era, estou disponível para troca de idéias e-mail nossaradio@hotmail.com

    ResponderExcluir
  23. Olá Felipe, dentro desse trecho de código:

    if (analogRead(5) > 1000){
    ApagaTodos();
    delay(1000);
    controle++;
    if (controle > qtdSequencia){
    controle = 0;
    }

    onde você compara: (analogRead(5) > 1000) esse 1000 seria o que?

    Tenho aprendido muito com seus códigos. Obrigado por compartilhar....

    ResponderExcluir