Arduino: relé e millis()

postado em: Blog, Processos | 7

Usar o relógio interno do Arduino com o metodo millis() permite criar algoritmos que podem rodar simultaneamente em paralelo, o que não acontece quando usamos delay(), que “pausa” o Arduino por um tempo determinado.

Abaixo um código exemplo para o terrário do NANO, onde ligamos e desligamos uma lâmpada de 8 em 8 horas (mas que poderia ser qualquer intervalo de tempo). A partir desse modelo pode-se criar outras variáveis e ciclos para controlar outros relés (para água por exemplo), e outros dispositivos.

uma explicação rápida:
usamos unsigned long para guardar valores positivos muito longos, adequado para guardar o valor de millis(), que retorna o tempo sempre em milisegundos (1000 equivale a um segundo).
para ler mais facilmente os intervalos, multiplicamos valores como 10 * 1000; mas em C, para definir um número longo a partir de uma operação matemático, precisamos indicar o tipo dos valores, no caso L de long; 10L * 1000L seriam 10.000 milisegundos (= 10 segundos). 8 horas seriam como colocamos: 8L (horas) * 60L (minutos em uma hora) * 60L (segundos em um minuto) * 1000L (milisegundos em um segundo)
criamos o método print_clock, que recebe como parametro um unsigned long e envia para porta serial o cálculo do tempo em que o programa está rodando. criar os próprios métodos ajuda a manter o código modular, fácil de ser transportado para outros programas.
o ciclo só é executado quando a diferença entre o millis atual (tempo) e o millis guardado (tempo_luz) for maior que o ciclo que definimos (tempo_luz_ciclo).
quando o programa começa, tempo_luz é zero, então assim que o millis() atinge um valor maior que tempo_luz_ciclo, ele roda pela primeira vez. aí então ele guarda o valor de tempo_luz pela primeira vez:
depois disso, ele inverte o boleano volt_luz para ligar ou desligar o relé

7 Responses

  1. marlus

    bom, é só um exemplo, pois ficou decidido que vamos usar sensores LDR para saber quando o terrário está iluminado pelo sol ou não. Para água podemos usar esse exemplo, ou então, colocar sensores de humidade no solo.

    • George Rappel

      Olá, Elias! Para alternar o estado do LED (aceso e apagado) a cada 10 segundos, basta trocar o valor da variável ‘tempo_luz_ciclo’ na segunda linha do código para 10000.

      Usamos 10000 pois a unidade e milissegundos. 10 segundos = 10000 milissegundos.

      Abraços.

  2. Elias Gomes

    George, seria assim, 1 minuto desligado, 10 segundos ligados. Nesse caso, acredito que tenha alguma alteração no código?

  3. Silva B.S

    Só que depois de 49,7 dias o Relay vai travar ! Por que ? O “unsigned long” permite até 4.294.967.295 ms ( ou pouco mais de 4 trilhões de ms ), e isto ao ser “convertido” dará 49,7 dias ( ou “49 dias 16 horas e 48 minutos” ) contínuos de funcionamento. Ao ultrapassar este valor o valor “se torna negativo”, e como “unsigned long” só pode ser positivo ( 32 bits ou 4 bytes ) o sketch causa um “deadlock” ! Então, só basta uma rotina para verificar se este máximo valor foi ultrapassado, e se foi, zerar o contador ( o “tempo” no exemplo ). E isto tem várias maneiras de se fazer, é apenas “trabalho braçal” ( pois Programadores “old school” se preocupam com “testes de mesa” e limites, e o resto – comum hoje em dia – só “aperta teclas”, ainda “não pensam” ). Boa Sorte e Abraços !

  4. johni xavier leme

    como faço para ficar ligado 21 horas e desligado 3 horas

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *