Medidor de Velocidade

De Garoa Hacker Clube
Revisão de 18h20min de 14 de setembro de 2024 por Gabriel Almeida (discussão | contribs)
Ir para navegação Ir para pesquisar

Circuito

Muito simples, apenas um Arduino, dois sensores que são lâminas de papel aluminio e um display LCD. Funcionamento: Com o GND do Arduino ligado a um dos trilhos é colocado 2 lâminas de papel alumínio em cima do trilho mas sem encostar, quando o trem passa ele faz o papel aluminio encostar no trilho e o Arduino começa a contar o tempo, quando a roda encosta na outra folha o Arduino então usa a distância colocada no código ( DIST_MM ) para calcular a velocidade do trem, tanto em cm/s real quanto o que seria equivalente em km/h considerando a escala 1:87

Componentes

  • Arduino Uno (ou semelhante)
  • Papel Alumínio
  • Display LCD
  • Potenciômetro (controle do LCD)

https://www.tinkercad.com/things/eed0i7NN28G-fantastic-bombul/editel?sharecode=9VOF30qxlMP9vHSS02JtBoU2ATyaAA2d22DF8d53F3w

Implementação

https://t.me/garoaclube/50718/53895 (idéia primordial)

https://t.me/garoaclube/50718/56158 (com displayLCD 20x4)

TODO

  • colocar um display para exibir a velocidade.
  • melhorar o código com uma função para fazer o Seria.print
  • exibir o tempo obtido?
  • deixar configurável a distância sem precisar subir de novo o programa no Arduino.

Código


#include <LiquidCrystal.h>

#define SENSOR_1    7  // Pino do sensor 1
#define SENSOR_2    8  // Pino do sensor 2
#define LED_STATUS   13  // Pino do LED de leitura

const float DIST_MM = 74; // Distância em mm

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

unsigned long startTime = 0; // Tempo em microssegundos
unsigned long elapsedTime = 0; // Tempo decorrido em microssegundos
float speed_mm_per_us = 0; // Velocidade em mm/µs
float speed_kmh = 0; // Velocidade em km/h

void setup() {
  lcd.begin(16, 2); // Inicializa o LCD com 16 colunas e 2 linhas
  pinMode(SENSOR_1, INPUT_PULLUP);
  pinMode(SENSOR_2, INPUT_PULLUP);
  pinMode(LED_STATUS, OUTPUT);
  
  lcd.print("hello world!");
  delay(500);
  lcd.clear();
  lcd.print("Vel(cm/s) Maquete");
  lcd.setCursor(0, 1);
  lcd.print("Vel(Km/h): Real");
  delay(2000);
  lcd.clear();
  lcd.print("Esperando");
}

void loop() {
  if (!digitalRead(SENSOR_1)) {
    startTime = micros();
    lcd.clear();
    lcd.print("Fazendo leitura");
    digitalWrite(LED_STATUS, HIGH);
    
    while (digitalRead(SENSOR_2)) {
      // Espera até o SENSOR_2 ser acionado
    }
    
    elapsedTime = micros() - startTime;
    calculateSpeed();
    displaySpeed();
    delay(5000);
    lcd.clear();
    lcd.print("Esperando");
    digitalWrite(LED_STATUS, LOW);
  }
  if (!digitalRead(SENSOR_2)) {
    startTime = micros();
    lcd.clear();
    lcd.print("Fazendo leitura");
    digitalWrite(LED_STATUS, HIGH);
    
    while (digitalRead(SENSOR_1)) {
      // Espera até o SENSOR_2 ser acionado
    }
    
    elapsedTime = micros() - startTime;
    calculateSpeed();
    displaySpeed();
    delay(5000);
    lcd.clear();
    lcd.print("Esperando");
    digitalWrite(LED_STATUS, LOW);
  }
}

void calculateSpeed() {
  // Calcula a velocidade em mm/µs e km/h
  speed_mm_per_us = DIST_MM / elapsedTime;
  speed_kmh = speed_mm_per_us * 3600 * 87; // 87 é o fator de escala
}

void displaySpeed() {
  lcd.clear();
  lcd.print("Vel(cm/s): ");
  lcd.print(speed_mm_per_us * 1e5); // Convertendo para cm/s
  lcd.setCursor(0, 1);
  lcd.print("Vel(Km/h): ");
  lcd.print(speed_kmh); // Velocidade em km/h
}