#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Inicializar la LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // Direccion I2C: 0x27, 16 columnas y 2 filas

// Definicion de pines para los sensores y botones
const int sensorA_pin = 2;
const int sensorB_pin = 3;
const int start_button_pin = 4;
const int stop_button_pin = 5;
const int reset_button_pin = 6;
const int next_parameter_pin = 7;

// Variables para manejar el cronometro
unsigned long startTime = 0;
unsigned long elapsedTime = 0;
bool running = false;

void setup() {
  Serial.begin(9600);

  // Inicializar la LCD
  lcd.init();
  lcd.backlight();

  // Configurar los pines como entradas
  pinMode(sensorA_pin, INPUT);
  pinMode(sensorB_pin, INPUT);
  pinMode(start_button_pin, INPUT_PULLUP);
  pinMode(stop_button_pin, INPUT_PULLUP);
  pinMode(reset_button_pin, INPUT_PULLUP);
  pinMode(next_parameter_pin, INPUT_PULLUP);

  // Mostrar mensaje inicial en la LCD
  lcd.setCursor(0, 0);
  lcd.print("Proyecto Caida");
  lcd.setCursor(0, 1);
  lcd.print("Libre Fisica I");
  delay(5000); // Esperar 5 segundos
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Ing. Gustavo");
  lcd.setCursor(0, 1);
  lcd.print("Lopez");
  delay(5000); // Esperar 5 segundos
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Cronometro");
}

void loop() {
  // Verificar si se presiona el boton de inicio
  if (digitalRead(start_button_pin) == LOW && !running) {
    startTime = millis() / 1000; // Convertir milisegundos a segundos
    running = true;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Cronometro");
  }

  // Verificar si se presiona el boton de parar
  if (digitalRead(stop_button_pin) == LOW && running) {
    elapsedTime = (millis() / 1000) - startTime; // Convertir milisegundos a segundos
    running = false;
    // Calcular velocidad de caida
    float velocity = calculateVelocity(elapsedTime);
    lcd.setCursor(0, 1);
    lcd.print("Vel: ");
    lcd.print(velocity);
    lcd.print(" m/s");
  }

  // Verificar si se presiona el boton de reiniciar
  if (digitalRead(reset_button_pin) == LOW) {
    startTime = 0;
    elapsedTime = 0;
    running = false;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Reiniciado");
  }

  // Verificar si se presiona el boton de siguiente parametro
  if (digitalRead(next_parameter_pin) == LOW) {
    // Aqui puedes agregar codigo para manejar otro parametro o realizar alguna accion adicional
  }
}

// Funcion para calcular la velocidad de caida
float calculateVelocity(unsigned long time) {
  // Considerando la aceleracion de la gravedad como 9.81 m/s^2
  // v = gt, donde v es la velocidad, g es la gravedad y t es el tiempo
  float gravity = 9.81; // Aceleracion de la gravedad en m/s^2
  float velocity = gravity * time;
  return velocity;
}