Ola, estou com uma duvida, eu estou utilizando o millis para fazer uma pausa de 5 segundos para trocar três cores de uma fita de leds, abaixo deixo dois sketch, o primeiro (sketch_errado) ,que  faz a pausa mas executa uma unica vez, e o segundo (sketch_certo),que faz a pausa e executa varias vezes (que é o certo),minha duvida é pq isso acontece? alguém teria uma dica pra resolver esse problema.

Obs: nos sketch eu estou imprimindo uma mensagem caso vcs queiram testar.

sketch_errado.ino

sketch_certo.ino

Exibições: 272

Anexos

Responder esta

Respostas a este tópico

olá Matheus.

      Quando li o texto aqui do seu tópico e vi os dois códigos que vc postou,  ficou claro pra mim toda a questão.

      Na realidade Matheus, vc não está com uma dúvida. Vc está com uma boa quantidade de dúvidas.

      Mas também me parece evidente que vc quer ir em frente e aprender. Uma amostra disso é o fato de que vc abriu vários tópicos aqui no LDG, e essencialmente todos eles tratavam da mesma coisa, e apesar de aparentemente vc não ter obtido as respostas que queria, vc não desistiu. E isto é o que realmente é importante, insistir e seguir em frente.

      Mas também é necessário ter os pés no chão, e principalmente os olhos abertos e a mente centrada. Senão, irão passar pelas suas mãos, informações significativas, mas que vc poderá descartar ou mesmo ignorar se não estiver realmente centrado.

      Bem, é muito fácil apontar os problemas com os seus dois códigos.  Sim, nos dois existem problemas, tanto no que vc chamou de "errado" como no "certo".  Vou destacar um que é bastante sutil, principalmente para principiantes (e acredite:  até mesmo pessoas experientes podem cometer erros assim), mas  inicialmente  não vou dizer o motivo (direi depois em outro post aqui mesmo no seu tópico).  Mesmo no seu código "certo",  se vc deixar ele executando por vários minutos, e se ficar todo o tempo prestando atenção nele,  vai ver que eventualmente, ele irá falhar. Ou seja, ele irá pular uma das mensagens. Não dá pra afirmar qual delas ele irá "pular" primeiro, e conforme o tempo passa,  irá ficar "aleatório" isso, ou seja,  ele poderá pular ora uma, ora outra. E acredite: em algum momento poderá pular até mesmo duas mensagens, e até mesmo pular todas as três mensagens (será raro essa ocorrência, mas ela irá ocorrer em algum momento).

      Então em nosso próximo diálogo aqui, explicarei em detalhes estes "problemas", tanto no seu código "errado" como no "certo".

      Isto porque,  irei mostrar como deveria estar o código, de uma forma que ele sempre funcionará corretamente, independente de quanto tempo vc o deixe executando. Além disso, essa forma de codificar, abre caminhos ilimitados para o que vc pode fazer. E melhor: ela é extremamente simples e confiável. Mas claro tem que aprender a fazer isso (o que também é simples).

      Um detalhe:  na implementação eu usei apenas duas Variáveis,  enquanto vc usou sete Variáveis  no seu código "certo" (ou seja, mais que o triplo).

      O bom é que,  o que o seu código faz é bem simples, e isso ajuda bastante vc a aprender as técnicas.

      O código que implementei, é este aqui:   "Mensagens_Temporizadas_01.zip"

      Ele está totalmente comentado, explicando seu funcionamento de forma clara e objetiva (os comentários tem que ser funcionais, e não a torto e à direita).  E principalmente:  ele está organizado.  Veja:  a organização é absolutamente necessária em programação,  senão vc será conduzido ao desastre em algum momento (pode demorar um pouco, mas irá acontecer).  E mais ainda: este código segue regras as quais chamamos de "boas práticas de programação". Então se concentre no código (e esqueça os que vc postou antes), e analise ele até vc entender claramente (irei ajudar neste processo, se vc precisar e se vc permitir).

      E caso vc use o Proteus,  eu implementei a simulação deste Sistema no mesmo. Na figura a seguir vc pode ver o resultado:

(clique na figura para "zoom").

      Claro, na simulação (assim como na execução "real"), o ideal seria "printar" no Terminal do Arduino,  o tempo que passou entre uma mensagem e outra, pra vc conferir se está realmente correto. Isto é muito simples de fazer, mas preferir não inserir isto no código para que ele ficasse o mais próximo do que vc estava tentando fazer, e assim evitar inserir quaisquer outras informações que atrapalhassem o entendimento.  Numa versão seguinte, posso inserir a "printagem" desse tempo.  Mas na execução "real", vc pode também ligar a "printagem" do tempo na opção "Show timestamp" no Terminal do Arduino,  facilitando bastante conferir o funcionamento (claro, existirá alguma variação mínima nos tempos, devido aos processamentos dentro do Windows e todos os Drivers executando).

      Seguem os arquivos para a simulação no Proteus:  "Simulacao_Proteus.zip"

      Fique à vontade para perguntar.

      Abrçs,

      Elcids

Ola Elcids, seu sketch funcionou perfeitamente, só mais uma duvida. Eu modifiquei o seu código para receber o tempo e as cores pela serial. Quando envio pela 1° vez ex vermelho,verde,azul ele executa corretamente, mas se eu envia  outros valores ex roxo,amarelo,branco enquanto ele esta executando o vermelho, ele envia amarelo,branco,roxo e depois continua a sequência de cores normalmente, teria como eu "forçar" ele executar roxo,amarelo,branco.

sketch_apr27b.ino

Abrçs,

Matheus

olá Matheus.

      Irei verificar este seu código "sketch_apr27b.ino".

      Mas o melhor seria se vc descrevesse o que ele deve fazer.  Vou te sugerir que dê uma olhada em como isto pode ser feito.  Mas por favor, faça o possível para olhar isto. É neste post:   "exemplo de como descrever o funcionamento"

      O tópico onde está este post que te passei acima, é longo, então basta ler especificamente o post do link, somente ele ok?

      Acredito que vai te ajudar a descrever o funcionamento do seu Sistema aqui, facilitando assim para que eu possa ajudá-lo.

      Abrçs,

      Elcids

1° estou utilizando uma fita de leds ws2812 de 60 leds ligada na digital 6 de um arduino mega, que esta sendo alimenta por uma fonte de computador.

2° estou enviando pela serial valores para controlar a fita ex:

03 05 255 00 06 255,000,000 000,255,000 000,000,255 255,000,255 000,255,255

03 é a customização, que é a quantidade de cores que a fita vai acender.

05 é o efeito que indica se a fita vai ficar acesa, piscando entre outros.

255 é o brilho.

00 é o milissegundos para dar uma pausa para acender cada led.

06 é o segundos para dar uma pausa entre as trocas de cores.

e o resto é o rgb das cinco cores.

3° leio esses valores da serial, utilizo o substring para separar os valores e gravo em um vetor de strings, converto as strings em inteiro e gravo num vetor inteiro. Depois gravo na eeprom do arduino.

4° depois faço alguns if para verificar qual customização foi enviada e utilizo o switch case para ver o efeito enviado,depois chamo a função do efeito. Como o "sketch_apr27b.ino" é só para teste não tem essa parte, mas vou deixar o sketch principal abaixo.

Controle_Leds.ino

olá Matheus.

      Partindo do seu código "sketch_apr27b.ino",  fiz a implementação para obter o resultado que vc esperava.

      Infelizmente este seu código "27b" ainda estava um pouco bagunçado, e desrespeitando regras de boas práticas de programação (já percebi que isto não é seu objetivo).

      Assim eu o organizei, analisei o que precisava ser feito, e reestruturei de uma forma que será fácil pra vc entender e usar. Alterei alguns nomes de Variáveis e Funções, de forma a ficar mais lógico o entendimento.

      Como ainda é um código simples,  espero que vc o use para aprender como a coisa deve ser feita, principalmente em termos de organização do código.  Olhe com cuidado, e se vc realmente quiser,  tenho certeza que vc irá aprender.

      Segue o código:   "Fita_LED_01.zip"

      Abrçs,

      Elcids

ah Matheus,

      Caso vc queira que a atualização tenha efeito imediatamente (ou seja, sem esperar concluir o ciclo atual), então use este outro código, onde acrescentei esta característica:

      Segue o arquivo:   "Fita_LED_02.zip"

      Abrçs,

      Elcids

Ola Elcids, desculpa a demora pra responder, estava meio ocupado esses dias e só pude mexer com arduino essa semana. Fiz algumas modificações no seu sketch e esta funcionando perfeitamente , muito obrigado por ter me ajudado.

Controle_Leds.ino

olá Matheus.

      Ok.

      Vi que vc usou novamente o "readString". Esta função tende a ser "bloqueante", uma vez que está condicionada a um "timeout" (claro, pode ser alterado a qualquer momento via "setTimeout", mas isso não é muito adequado,  a não ser que seja feito sempre antes da chamada de qualquer outra função que dependa desse "timeout").

      Neste momento, isto não está tendo impacto no seu código. Mas a médio ou longo prazo, se vc acrescentar outros elementos (como sensores ou módulos que necessitem pronta resposta), então o "readString" poderá se tornar um problema.

      Então se possível, procure usar da forma como demonstrei nos códigos "Fita_LED_xx", os quais postei anteriormente. Usando da forma como está nestes códigos (sem o "readString"),  vc evitará eventuais problemas "futuros" de engasgamento no funcionamento do seu Sistema.

      Abrçs,

      Elcids

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço