Eu tenho um problema que, a princípio, (e sendo novo no Arduino), eu era um aplicativo perfeito para um Arduino. No entanto, depois de tentar e deixar de implementá-lo, estou duvidando de mim mesmo!
Simplesmente - preciso controlar muitos LEDs de forma independente, muitos dos quais terão seus próprios padrões individuais - por exemplo, "5 segundos ligado - 5 segundos desligado". "flashes contínuos" - ou sequências como "2 flashes, pausa, 1 flash". Obviamente, sem o luxo dos fios, estou me tornando um pouco desconectada. Seja ótimo em saber se a) o Arduino é a melhor escolha eb) se é - como posso fazer isso!
Desde já, obrigado :)
Respostas:
O manuseio de vários padrões ao mesmo tempo é certamente possível com uma plataforma como o Arduino, e há várias maneiras de você fazer isso.
Um método que eu consideraria é escrever funções que efetivamente representam cada padrão matematicamente. Você passaria o tempo total decorrido no seu programa até agora e executará a ação apropriada para esse momento específico. Ele retornará imediatamente depois (sem atrasos ou qualquer coisa).
Para fazer isso, primeiro você precisa saber quanto tempo dura um único ciclo do padrão. Você pode usar o operador módulo para descobrir até que ponto você está no ciclo atual. A partir daí, tudo o que você precisa fazer é ter algumas
if
condições para determinar o que fazer a qualquer momento.Veja como pode ser o seu padrão "5 segundos ligado e 5 segundos desligado":
É verdade que telefonar constantemente
digitalWrite()
quando você não precisa tecnicamente não é muito eficiente. Porém, não deve causar nenhum dano e é bastante fácil de otimizar, se necessário.Para usar o exemplo acima em um esboço, você só precisa chamá-lo
loop()
e passar o número do qual obtémmillis()
; por exemplo:Outros padrões serão mais complexos, mas seguem o mesmo princípio. Você apenas usaria
if
declarações apropriadas para expressar sua lógica.O essencial é lembrar que a função representa um momento específico no tempo. Ele nunca deve pausar ou atrasar o programa, caso contrário, impedirá a execução de outros padrões.
Edit: Tempo no primeiro ciclo
Como jfpoilpret observou nos comentários, o primeiro ciclo começará em um ponto aleatório. Isso ocorre porque a primeira vez que você chamar
millis()
emloop()
, ele não vai começar em 0 (o dispositivo já terá sido executado por um curto período de tempo antesloop()
é chamado). É fácil resolver, se necessário.Você faria isso deslocando o
totalTime
valor pelo valor que você obteve na primeira vezloop()
. Por exemplo:fonte
%
abordagem é que o momento não será correto na primeira vez, pois será apenas aleatório no início.millis
uma vez no loop e passar seu valor como parâmetro para todas as funções de led, ter cada função como uma sem parâmetro e executar millis dentro de cada uma. Isso permitiria que cada função obtivesse um valor mais preciso, que pode ou não ser importante, dependendo de quanto tempo cada função no loop leva para ser executada e também dos requisitos de correção de tempo do aplicativo.O Arduino é uma ótima opção para a tarefa - fácil de começar. A chave é escrever código sem bloqueio. Você pode dar uma olhada no exemplo BlinkWithoutDelay.
Fiz uma sugestão para sua tarefa:
fonte
Eu sei que o post é antigo, mas verifiquei o exemplo com a abordagem baseada em array e, na minha opinião:
sempre produzirá o tamanho alocado (número de elementos) da matriz - neste caso, 10. Portanto, o tempo não será reiniciado até que você atinja o "final" da matriz, usando elementos indefinidos. Para o LED "0":
Saudações Tommy
fonte