/******************************************************************************* * * I20: Cronômetro e velocidade usando módulo infraRed (reflexivo) * Autor: Angelo Luis Ferreira * Data: 10/01/2022 * * http://squids.com.br/arduino * *******************************************************************************/ #include //Carrega a biblioteca lcd com I2C LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); // Cria instância do objeto "lcd"(biblioteca LiquidCrystal_I2C.h) // Constantes de conexão do Arduino const byte sensor1 = 2; // Pino Arduino em que o sensor reflexivo esquerdo está conectado const byte sensor2 = 3; // 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() { Serial.begin(9600); // Inicia a comunicação serial (Monitor Serial) lcd.begin(16, 2); // 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"); }