Código de Pesquisa

Lição 14/31-3: Exemplo 3 de codificação Arduino millis() com botão de pressão

Lição 14/31-3: Exemplo 3 de codificação Arduino millis() com botão de pressão

Você já precisou que seu Arduino lembrasse quando algo aconteceu—como um pressionamento de botão—e então agisse uma quantidade precisa de tempo depois, tudo isso enquanto mantinha o resto do seu programa funcionando suavemente? Este é um desafio clássico na programação Arduino, e a solução é a função millis(). Este tutorial, parte do curso Arduino Robojax, demonstra um exemplo prático: detectar se um botão de pressão é pressionado uma segunda vez após um atraso de 5 segundos ter decorrido desde o primeiro pressionamento. Esta técnica é fundamental para criar projetos responsivos e não bloqueantes onde o tempo é crítico.

Carro Sunfounder montado

Este padrão de usar millis() para rastrear o tempo sem interromper o programa é essencial para uma ampla gama de aplicações do mundo real. Aqui estão algumas ideias para inspirar seus próprios projetos:

  • Interfaces de Botão com Debounce: Implemente um sistema onde um botão deve ser mantido pressionado por uma duração específica (por exemplo, 3 segundos) para ligar um dispositivo, prevenindo pressionamentos acidentais.
  • Ações Sequenciais: Crie um sistema onde um evento, como um gatilho de sensor de movimento, arma uma ação secundária que ocorre apenas se outro evento acontecer dentro de uma janela de tempo específica.
  • Temporizadores de Interação do Usuário: Construa um projeto que exija uma entrada de "confirmação" (como um segundo pressionamento de botão) dentro de um tempo definido para executar uma função crítica, como enviar um comando ou iniciar um motor.
  • Portão de Sensor: Use um primeiro sinal de um sensor para iniciar uma janela de tempo, durante a qual a leitura de um segundo sensor diferente é considerada válida ou é ignorada.

Hardware Necessário

Este projeto usa componentes do kit Arduino 3-em-1 SunFounder, que é um ótimo recurso para aprendizado. Você precisará de:

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

Guia de Conexões

A fiação para este exemplo é muito simples, graças aos resistores de pull-up internos do Arduino, o que elimina a necessidade de um resistor externo. (No vídeo em 08:29)

  • 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.

Ao usar INPUT_PULLUP, o pino é internamente conectado a 5V, então ele lê HIGH normalmente. Quando o botão é pressionado, ele conecta o pino ao GND, fazendo com que leia LOW. Esta é a lógica que usaremos no código.

Explicação do Código

O núcleo deste projeto é a lógica que rastreia o primeiro pressionamento do botão e depois verifica um segundo pressionamento após um intervalo de tempo específico. O código é projetado para ser não bloqueante, o que significa que não pausará a execução de outras tarefas no seu loop().

No topo do sketch, você encontrará as principais variáveis configuráveis pelo usuário que controlam o comportamento de temporização:

unsigned long event = 5000;// 5 segundos
unsigned long buttonPushed =0;
  • event: Esta é a variável de temporização crucial. Ela define a duração do atraso em milissegundos. Neste exemplo, está definida para 5000, que equivale a 5 segundos. Você pode alterar este valor para qualquer outra duração conforme as necessidades do seu projeto.
  • buttonPushed: Esta variável é usada como um sinalizador e um carimbo de tempo. Ela começa em 0 e é atualizada para o valor de millis() na primeira vez que o botão é pressionado. Este tempo armazenado é então usado para calcular a diferença para a verificação do segundo pressionamento.

A lógica na função loop() funciona em dois estágios. Primeiro, ela lê o estado do botão e, se for pressionado pela primeira vez (pb == LOW && buttonPushed == 0), registra o tempo atual via millis() na variável buttonPushed. O segundo estágio verifica se o botão ainda está pressionado e se um primeiro pressionamento foi registrado. Se sim, calcula a diferença de tempo entre o tempo atual e o tempo do primeiro pressionamento. Se esta diferença for maior ou igual ao seu tempo event, executa a ação—neste caso, imprimindo uma mensagem no Monitor Serial.

Demonstração do Projeto ao Vivo

No vídeo, o código é carregado no Arduino e o Monitor Serial é aberto para observar o comportamento. (No vídeo em 16:03) Você verá o valor de millis() imprimindo continuamente, mostrando o tempo desde o início do programa. Quando você pressiona o botão pela primeira vez, uma mensagem como Primeiro pressionamento em:5019 é impressa. Se você pressionar o botão novamente e mantê-lo pressionado por mais de 5 segundos desde o primeiro pressionamento, a mensagem Ação após 5 segundos do primeiro pressionamento é impressa. Isso demonstra que a ação só é acionada quando o segundo pressionamento ocorre após o atraso especificado ter decorrido.

O poder desta abordagem é que a linha Serial.println(millis()) no topo do loop continua a ser executada sem interrupção, provando que a lógica de temporização não bloqueia a execução de outro código. Esta é a vantagem fundamental de usar millis() em vez da função delay().

Projetos relacionados deste vídeo

Capítulos

  • [00:00] Introdução ao millis() e ao curso
  • [01:19] O que é millis() e por que usá-lo?
  • [03:06] Primeiro exemplo prático: imprimindo millis()
  • [05:46] Usando millis() para acionar um evento após 5 segundos
  • [08:29] Exemplo 2: Ação de botão de pressão com atraso de 5 segundos
  • [12:14] Exemplo 3: Detectando um segundo pressionamento de botão após um atraso
  • [17:20] Introdução à função map()
  • [19:47] Exemplo prático de mapeamento de porcentagens de brilho de LED

Imagens

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
918-Lesson 14/31-3: Arduino coding millis() example 3 with push button
Idioma: C++
/*
Lesson 14/31: Arduino coding millis() example 3 with push button
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
unsigned long buttonPushed =0;

void setup() {
  Serial.begin(9600);//initialize serial monitor
  Serial.println("Introduction to millis");
  pinMode(2,INPUT_PULLUP);
  


}

void loop() {
  // ilmoFan.com example-2 millis()
  Serial.println(millis());
  int pb = digitalRead(2);// read pin 2
  if(pb ==LOW && buttonPushed ==0)
  {
    buttonPushed =millis();
    Serial.print("First push at:");
    Serial.println(buttonPushed);
  }
  if( pb ==LOW &&  buttonPushed >0 )
  {
   unsigned long difference = millis()- buttonPushed;
      if( difference >= event)
      {
        Serial.println("Action after 5 seconds of first push");
      }
  }
  
}

Arquivos📁

Manual do Usuário