Dificuldade com as bibliotecas para a fita LED WS2812B

Sou novato tanto em programação quanto em Arduíno mas mesmo assim estou desenvolvendo (para uso pessoal e por hobby) um relógio despertador que conta com diversos recursos como sensores, fita Led RGB WS2812B de 5V, gravação de voz, entre outros. Estou quase terminando o meu código no Arduíno Pro Mini Atmega 328P 16MHz e só agora no final decidi usar a fita de LEDs endereçáveis mas estou com muita dificuldade em usar os efeitos presentes nos exemplos da biblioteca NeoPixel da Adafruit (Adafruit_NeoPixel-master), pois como eles usam "For" e "delay()", quando eu chamo as funções dos LEDs só a fita funciona, o restante do código deixa de funcionar.


Não sei se alguém aqui já usou essa fita mas eu gostaria muito de um exemplo de como fazer os mesmos efeitos sem usar "For" e "delay()". Eu mesmo tentei por alguns dias substituir essas funções por "if" e "millis()" porém não tive sucesso.


Eu uso o exemplo "strandtest.ino" como referência.

Onde era:

void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<RGB.numPixels(); i++) {
    RGB.setPixelColor(i, c);
    RGB.show();
    delay(wait);
  }
}

Eu tentei mudar para:

void colorWipe ( uint32_t c, uint8_t wait ) 
{
  static uint16_t i = 0;

  if ( i == 0 ) {
    RGB.setPixelColor(i, c);  
    RGB.show();  
    delayInverte_Led_RGB = millis();  
    i++;  
  }                
  if ( ((millis() - delayInverte_Led_RGB) >= wait)  &&  i < RGB.numPixels() ) {  
    RGB.setPixelColor(i, c);  
    RGB.show(); 
    delayInverte_Led_RGB = millis(); 
    i++;    
  }    
}

Mas não funcionou (acende apenas um único LED e não faz mais nada).

Se alguém puder me ajudar. Um exemplo novo na biblioteca seria muito bem vindo também! Creio que os exemplos atuais não visam a multitarefa mas sim consideram que o usuário usará apenas a fita LED no seu projeto e nada mais...

Gostaria muito de conseguir usar todos os efeitos do exemplo "strandtest.ino" no meu código sem que isso trave tudo. Meu código atual já tem mais de 2300 linhas de código e eu jamais uso "for" ou "delay()" pois sei que isso trava o processador em um único processo (como eu tenho relógio no display e a informação da leitura de alguns sensores, isso jamais pode acontecer). Faço tudo com millis() e micros(), porém dessa vez não estou conseguindo...

Ajuda!!!

Exibições: 967

Responder esta

Respostas a este tópico

Bom dia, 

Recomendo que estude como a biblioteca funciona, para depois tentar modifica-la. 

https://github.com/adafruit/Adafruit_NeoPixel

Ou tentar outra que sirva para sua montagem. 

Obrigado pelo retorno!

Acho que essa questão de estudar a fundo o código da biblioteca ainda é algo muito avançado p/ mim que estou no inicio do aprendizado. Mas pretendo fazer isso no futuro sim, assim que conseguir mais um pouco de tempo livre.

Cheguei a tentar outra biblioteca, a light_WS2812, mas achei os efeitos apresentados nos exemplos dela muito feios. Os efeitos da Adafruit são bem mais bonitos (principalmente o rainbowCycle).

O mineirin RV conseguiu fazer com sucesso o que eu estava tentando fazer e não estava conseguindo. Ele postou a solução (em anexo) mais abaixo. Valeu!

Quando vc roda direto o exemplo, que vem para 60 leds (definido logo no inicio), funciona ???

Ref:

https://github.com/adafruit/Adafruit_NeoPixel/blob/master/examples/...

Na verdade, todos os exemplos deles funcionam, porém como eles usam "for" junto com "delay()" esses exemplos deles são para testarmos de forma isolada, sem o código estar fazendo outras coisas em "paralelo", como atualizando informações em um LCD, lendo botões, etc.

Mas a solução que o mineirin RV passou na postagem dele mais abaixo funcionou perfeitamente em "paralelo" com o restante do meu programa (funciona com multitarefas).

Obrigado.

Bom dia RD

Recomendações: 
     1. Remova seu sketch da área de texto do seu tópico;
     2. Leia http://labdegaragem.com/forum/topics/sugest-o-de-como-postar
     3. Comente as linhas do seu sketch. Fica mais fácil entender o que vc quer fazer com cada 
          linha e facilita a ajuda.
     4. Clique em : " Deseja carregar arquivos? " e depois em " Escolher arquivo" e anexe o arquivo 
          com o seu sketch.

RV

Bom dia RD,

não concordo com o post de sketches na area de texto do tópico por razões técnicas e

de visualização do tópico.

Mas como você colocou fragmentos do seu sketch para explicar a dificuldade com seu projeto,

vou abrir exceção e tentar ajudar.

Segue anexo um code resumido modificando o uso de delay para millis().

Não testei este code montado, somente compilei.

Faça um teste ai na sua montagem e depois de um retorno dizendo como foi o resultado.

RV

Anexos

Obrigado pela dica sobre postagem de códigos!

Antes de postar eu realmente gastei vários minutos tentando achar o botão "code" ou "inserir código" que os fóruns do gênero costumam ter e não achei. Então abri outros tópicos p/ ver como a galera fazia e vi que colocavam o código como texto mesmo (o que também acho horrível pois dificulta a leitura e fica muito poluído).

Vou começar a carregar como sketch então (eu não tinha pensado nisso).

De toda forma sugiro aos moderadores do fórum incluírem um botão para inserir a caixa de código (e pode ter um limite de linhas por exemplo, assim ninguém coloca um código muito grande e sim apenas um trecho, no máximo, p/ não poluir o tópico). É só uma dica, pois nos outros fóruns é mais prático essa inclusão de códigos pequenos...

Quanto ao seu código, está perfeito! Era justamente isso que eu estava tentando fazer, sem sucesso. Muito obrigado mesmo!

Obs: só corrigi uma linha onde tinha um ";" no final de um "if" (troquei por chave) e inclui um comando para apagar os LEDs depois de cada ciclo. Segue em anexo o seu código com essa correção que falei.

Anexo: FitaLED_2.ino

Assim que eu tiver mais tempo vou tentar implementar essa sua lógica nas demais funções e aí posto aqui o resultado, para compartilhar com a galera. Mas uma vez, muito obrigado mesmo!!!

RD, ao clicar em responder,

bem abaixo tem uma pergunta assim:

"Deseja carregar arquivos?"

Se clicar nela, abre a botões de escolher até 3 arquivos no seu PC.

RV

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço