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.
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:
- Lição 14/31-1: Arduino Millis (sem delay) e funções map | SunFounder Robojax
- Lição 14/31-3: Arduino codificando millis() exemplo 3 com botão de pressão
- Lição 14/31-4: Arduino codificando map() exemplo 1
- Lição 14/31-5: Arduino codificando map() exemplo 2
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
/*
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
Coisas que você pode precisar
-
AmazonasSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazonas
-
Amazonas
-
Amazonas
-
Amazonas
-
Outro
Recursos e referências
-
Externo
Arquivos📁
Manual do Usuário
-
SunFounder 3-in-1 Arduino Smart Car assembly manualThis document shows step by step assembly of SunFounder 3-in-1 Arduino Smart Car
SunFounder_car_assembly_manual.pdf1.20 MB