/*******************************************************************************
*
* I20: Cronômetro e velocidade usando módulo infraRed (reflexivo)
* Autor: Angelo Luis Ferreira
* Data: 10/01/2022
*
* https://www.squids.com.br/arduino/index.php/projetos-arduino/projetos-squids/intermediario/369-i20-
como-criar-um-cronometro-com-acionamento-para-medir-velocidade-sensores-reflexivos-com-arduino
*
*******************************************************************************/
#include <LiquidCrystal_I2C.h> //Carrega a biblioteca lcd com I2C
LiquidCrystal_I2C lcd(0x27, 20, 4); // Cria instância do objeto "lcd"(biblioteca LiquidCrystal_I2C.h)
// Constantes de conexão do Arduino
const byte sensor1 = 18; // Pino Arduino em que o sensor reflexivo esquerdo está conectado
const byte sensor2 = 5; // Pino Arduino em que o sensor reflexivo direito está conectado
const byte led = 12; // Pino Arduino em que o led está conectado
// Variáveis iniciais
float distance = 0.2; // distância entre os dois sensores reflexivos (altere com o valor real)
uint32_t t = 0; // Variável para zerar o cronômetro
uint32_t timer; // Variável para armazenar tempo do cronômetro em milissegundos
void setup() {
lcd.init();
lcd.backlight(); // Inicia e define o display com 16 colunas e 2 linhas (lcd c/ I2C)
pinMode(sensor1, INPUT); // Define o pino do sensor1 como entrada
pinMode(sensor2, INPUT); // Define o pino do sensor1 como entrada
pinMode(led, OUTPUT); // Define o LED como saída
digitalWrite(led, LOW); // Define led desligado
reset(); // zera o display do cronômetro
}
void loop() {
checkSensor(); // verifica se o sensor 1 foi ativado
}
void checkSensor() {
if (!digitalRead(sensor1)) { // SE sensor fototransistor (1) estiver ATIVADO
digitalWrite(led, HIGH); // led LIGADO
reset(); // zera o display do cronômetor
t = millis(); // seta início da contagem (zera a contagem)
while (digitalRead(sensor2)) { // aguarda ativar o sensor fototransistor (2) para parar o cronômetro
cron(); // cronometro ativo (rodando)
}
digitalWrite(led, LOW); // led DESLIGADO
speedShow(); // calcula e mostra a velocidade
} else { // SE sensor fototransistor (1) estiver NÃO ATIVADO
digitalWrite(led, LOW); // led DESLIGADO
}
}
// gera o cronômetro
void cron() {
// incia o cronômetro
timer = (millis() - t); // Armazerna em milissegundos o tempo do cronômetro
uint32_t segundos = timer / 1000; // Armazena em segundos o tempo do cronômetro
//Mostra os valores no display LCD
lcd.setCursor(7,0);
lcd.print((segundos / 60) / 10); // Dezena de minuto
lcd.setCursor(8,0);
lcd.print((segundos / 60) % 10); // Unidade de minuto
lcd.setCursor(9,0);
lcd.print(":");
lcd.setCursor(10,0);
lcd.print((segundos % 60) / 10); // Dezena de segundo
lcd.setCursor(11,0);
lcd.print((segundos % 60) % 10); // unidade de segundo
lcd.setCursor(12,0);
lcd.print(",");
lcd.setCursor(13,0);
lcd.print((timer / 10) % 10); // Décimo de segundo
lcd.setCursor(14,0);
lcd.print((timer % 10) % 10); // Centésimo de segundo
}
// calcula e mostra a velocidade
void speedShow(){
float milisecond = timer; // transforma a variável timer em float
float avaregeSpeed = (distance/(milisecond/1000)); // calcula a velocidade média (V = metros/segundos)
lcd.setCursor(0,1);
lcd.print("Veloc: ");
lcd.print(avaregeSpeed, 2); // imprime velocidade média na tela (2 casas decimais)
lcd.print(" m/s");
}
// zera cronômetro
void reset() {
//Zera cronômetro:
lcd.clear(); // Limpa display LCD
lcd.setCursor(0,0);
lcd.print("Timer: ");
lcd.setCursor(7,0); // Posiciona o cursor no display coluna 4, linha 0
lcd.print("00:00,00");
}