Código de Pesquisa

Lição 14/31-2: Exemplo 2 de codificação Arduino millis() com evento

Lição 14/31-2: Exemplo 2 de codificação Arduino millis() com evento

Neste tutorial, você aprenderá a usar a função millis() do Arduino para acionar uma ação somente após um período de tempo especificado ter decorrido, tudo sem bloquear o restante do seu programa. Esta é uma técnica fundamental para criar projetos Arduino responsivos onde múltiplas tarefas precisam ser executadas simultaneamente, como piscar LEDs enquanto lê sensores ou monitora pressionamentos de botões. Este exemplo específico foca em acionar um evento após cinco segundos, mas a lógica pode ser aplicada a inúmeros cenários do mundo real.

Carro Sunfounder montado

Aqui estão alguns exemplos práticos de como você pode usar esse padrão em seus próprios projetos:

  • Ativação atrasada: Ligar um ventilador ou bomba somente após um sistema ter funcionado por um tempo definido.
  • Intertravamentos de segurança: Exigir que um botão seja pressionado e mantido por uma duração antes de executar uma ação perigosa, como iniciar um motor.
  • Alertas baseados em tempo: Acionar um alarme ou notificação se uma leitura de sensor não mudar dentro de um determinado intervalo.
  • Temporizadores não bloqueantes: Criar um temporizador "watchdog" que reinicia um dispositivo se ele ficar sem resposta.

O problema central que isso resolve é a limitação da função delay(). Quando você usa delay(5000), o Arduino para de executar qualquer outro código por esses cinco segundos. Isso é aceitável para esboços simples, mas se torna um grande problema em projetos mais complexos onde você precisa ler sensores, atualizar displays ou ouvir pressionamentos de botões enquanto espera. A função millis(), que conta os milissegundos desde que a placa foi ligada, permite que você verifique o tempo sem pausar o programa.

Hardware Necessário

  • Placa Arduino (Uno, Nano, Mega, etc.)
  • Um botão de pressão
  • Fios de conexão (jumpers)

Guia de Conexões

A fiação para este exemplo é muito simples. Ela usa um resistor interno de pull-up, então nenhum resistor externo é necessário para o botão.

  • Conecte uma perna do botão de pressão ao pino GND no Arduino.
  • Conecte a outra perna do botão de pressão ao pino digital 2 no Arduino.

Como usamos INPUT_PULLUP no código, o pino lerá HIGH quando o botão não estiver pressionado e LOW quando estiver pressionado, conectando o pino ao terra. (no vídeo em 08:29)

Entendendo o Código

Este código demonstra um temporizador simples baseado em eventos. O programa imprime continuamente o valor atual de millis() no Monitor Serial. Quando o botão de pressão é pressionado e mantido, e o Arduino está funcionando há pelo menos 5 segundos, ele imprimirá "Take action" no Monitor Serial. O ponto-chave é que a verificação de millis() não interrompe a impressão contínua do tempo.

Vamos detalhar as partes configuráveis pelo usuário do código:

unsigned long event = 5000;// 5 segundos

Esta é a variável mais importante a ser configurada. Ela define a duração do seu "evento" em milissegundos. Neste exemplo, está definida como 5000, que equivale a 5 segundos. Para alterar o atraso, basta modificar este número. Por exemplo, defini-lo como 10000 faria a ação ser acionada após 10 segundos. É crucial usar o tipo de dado unsigned long, pois o valor de millis() pode crescer muito e eventualmente exceder o valor máximo de uma variável int padrão, causando erros na comparação. (no vídeo em 05:46)

pinMode(2,INPUT_PULLUP);

Esta linha configura o pino digital 2 como entrada e ativa seu resistor interno de pull-up. Este é um passo de configuração essencial que permite conectar um botão sem resistor externo. O pino lerá HIGH por padrão e ficará LOW quando o botão for pressionado, conectando-o ao terra. Se desejar usar um pino diferente, altere o número 2 aqui e na linha digitalRead(2) dentro do loop. (no vídeo em 08:46)

A lógica dentro do loop() é direta. Ela lê o estado do botão. Se o botão estiver pressionado (pb == LOW), então verifica se o tempo atual (millis()) é maior ou igual ao seu tempo de event definido. Se ambas as condições forem verdadeiras, imprime a mensagem de ação. O restante do loop, que imprime o tempo, continua a ser executado sem interrupção, demonstrando o poder de millis() sobre delay().

Este exemplo verifica o tempo desde o momento em que o Arduino inicia. O terceiro exemplo na série de vídeos baseia-se nisso registrando o tempo do primeiro pressionamento do botão e acionando uma ação somente se um segundo pressionamento ocorrer pelo menos 5 segundos depois. Essa lógica é abordada em Lição 14/31-3: Exemplo 3 de codificação Arduino millis() com botão de pressão.

Demonstração do Projeto ao Vivo

Depois de carregar o código e abrir o Monitor Serial (a 9600 baud), você verá um fluxo contínuo de números, representando os milissegundos desde que a placa foi ligada. Se você pressionar e segurar o botão de pressão antes de 5 segundos terem passado, nada acontecerá. No entanto, se você pressionar e segurar o botão após a marca de 5 segundos, verá a mensagem "Take action" impressa no Monitor Serial. A ação continuará a ser impressa enquanto o botão estiver pressionado. Isso demonstra um temporizador não bloqueante que permite que outro código (a impressão) seja executado perfeitamente. (no vídeo em 10:52)

Projetos relacionados deste vídeo

Este vídeo faz parte de uma série de múltiplas partes sobre funções de temporização e mapeamento no Arduino. Explore os outros tutoriais criados a partir deste mesmo material de origem:

Capítulos

  • [00:00] Introdução ao millis() e ao Kit SunFounder
  • [01:19] O que é millis() e por que usá-lo em vez de delay()?
  • [03:06] Demonstração prática: imprimindo o valor de millis()
  • [05:46] Criando um evento com millis() e unsigned long
  • [08:29] Ligação e codificação de um botão de pressão com INPUT_PULLUP
  • [10:52] Executando o exemplo de evento com um botão de pressão
  • [12:14] Prévia do exemplo 3: detectando um segundo pressionamento do botão
  • [17:20] Introdução à função map()
  • [19:47] Codificando e demonstrando a função map() com um LED

Imagens

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
917-Lesson 14/31-2: Arduino coding millis() example 2 with event
Idioma: C++
/*
Lesson 14/31: Arduino coding millis() example 2 with event
Get this code and watch video Download and resource page https://robojax.com/RJT597
YouTube video https://www.youtube.com/watch?v=lqgzQohNiIM
 
  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */


unsigned long event = 5000;// 5 seconds
void setup() {
  Serial.begin(9600);//initialize serial monitor
  Serial.println("Introduction to millis");
  pinMode(2,INPUT_PULLUP);
  


}

void loop() {
  // Robojax.com millis() example 1
  Serial.println(millis());
  int pb = digitalRead(2);// read pin 2
  if(pb ==LOW)
  {
      if(millis() >= event)
      {
        Serial.println("Take action");
      }// if end
  }// if end
  
}// loop end

Arquivos📁

Manual do Usuário