// include the library code:
#include <LiquidCrystal.h>
// Definición de pines para los sensores de ultrasonidos
const int triggerPinInicial = 3;
const int echoPinInicial = 2;
const int LedPasoInicial = 4;
const int triggerPinFinal = 13;
const int echoPinFinal = 12;
const int LedPasoFinal = 11;
// pines pantalla
const int rs = 10, en = 9, d4 = 8, d5 = 7, d6 = 6, d7 = 5;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// Variables para el cronómetro
unsigned long startTime = 0;
unsigned long endTime = 0;
unsigned long elapsedTime;
//variables para medir distancia
boolean pasoInicial=false;
boolean pasoFinal=false;
float distanciaInicial;
float distanciaFinal;
float speed;
// Constante para la distancia de activación del cronómetro (en centímetros)
const int activationDistance = 50;
// Constante para la distancia entre los sensores (en centímetros)
const int sensorSeparation = 14;
void setup() {
// Inicializar los pines de los sensores de ultrasonidos
pinMode(triggerPinInicial, OUTPUT);
pinMode(echoPinInicial, INPUT);
pinMode(triggerPinFinal, OUTPUT);
pinMode(echoPinFinal, INPUT);
// Inicializar el puerto serie
Serial.begin(9600);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("Velocidad:");
}
void loop() {
//Si no se ha detectado el primer paso
if(pasoInicial==false){
// Medir la distancia con el primer sensor
distanciaInicial = measureDistance(triggerPinInicial, echoPinInicial);
Serial.print("La distanciaInicial es: ");
Serial.print(distanciaInicial);
Serial.print("\n");
//Si la distancia Inicial es menor que la distancia de activación
if (distanciaInicial <= activationDistance) {
digitalWrite(LedPasoInicial, HIGH); //encendmos el Led de paso inicial
pasoInicial = true; //activamos la variable de paso inicial
//activamos el reloj
if (startTime == 0) {
startTime = millis();
Serial.println("Cronómetro activado");
}
}else{
digitalWrite(LedPasoInicial, LOW); //apagamos el Led de paso inicial
}
}
//Si no se ha detectado el segundo paso
if(pasoInicial==true && pasoFinal==false){
// Medir la distancia con el segundo sensor si no se ha registrado el segundo paso
distanciaFinal = measureDistance(triggerPinFinal, echoPinFinal);
Serial.print("La distanciaFinal es: ");
Serial.print(distanciaFinal);
Serial.print("\n");
//Si la distancia Final es menor que la distancia de activación
if (distanciaFinal <= activationDistance) {
digitalWrite(LedPasoFinal, HIGH); //encendmos el Led de paso Final
pasoFinal = true; //activamos la variable de paso Final
//detenemos el reloj
if (startTime != 0) {
endTime = millis();
elapsedTime = endTime - startTime;
speed = calculateSpeed(elapsedTime);
Serial.print("Velocidad: ");
Serial.print(speed);
Serial.println(" km/h");
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
// print the number of seconds since reset:
lcd.print(speed);
lcd.print(" km/h ");
// Reiniciar el cronómetro
startTime = 0;
endTime=0;
speed= 0;
pasoInicial = false;
pasoFinal = false;
digitalWrite(LedPasoInicial, LOW);
digitalWrite(LedPasoFinal, LOW);
delay(5000);
lcd.setCursor(0, 1);
lcd.print("Esperando...");
}
}else{
digitalWrite(LedPasoInicial, LOW); //apagamos el Led de paso inicial
}
}
}
float measureDistance(int triggerPin, int echoPin) {
// Generar un pulso corto para activar el sensor
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
// Medir la duración del pulso de eco
float duration = pulseIn(echoPin, HIGH);
// Calcular la distancia en centímetros
float distance = duration * 0.034 / 2;
return distance;
}
float calculateSpeed(unsigned long elapsedTime) {
// Calcular la velocidad en cm/s
Serial.println("El tiempo es");
Serial.println(elapsedTime);
float speed = (sensorSeparation) / (elapsedTime / 1000.0);
speed= speed *0.036; //velocidad en km/h
return speed;
}
No hay comentarios:
Publicar un comentario