#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "HX711.h"
// Inicializar la pantalla LCD con la dirección I2C (0x27 en este caso)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pines de los botones
const int startButtonPin = 33;
const int pauseButtonPin = 25;
const int resetButtonPin = 26;
const int calibrateButtonPin = 27;
// Pines I2C
const int i2c_sda = 21;
const int i2c_scl = 22;
// Pines del módulo HX711
const int LOADCELL_DOUT_PIN = 5;
const int LOADCELL_SCK_PIN = 18;
// Inicializar el objeto HX711
HX711 scale;
// Variables para manejar el tiempo y el estado del cronómetro
unsigned long startTime = 0;
unsigned long elapsedTime = 0;
bool running = false;
// Variables para la balanza
float calibration_factor = -651.3; // Ajusta esto según tu calibración
float tare = 0;
float maxWeight = 0; // Peso máximo medido
// Variables para manejar el estado de los botones
unsigned long lastPausePressTime = 0;
int pausePressCount = 0;
const unsigned long doublePressInterval = 500; // Intervalo de tiempo para considerar una doble pulsación (en ms)
void setup() {
// Inicializar I2C con pines específicos
Wire.begin(i2c_sda, i2c_scl);
// Inicializar la pantalla LCD
lcd.init();
lcd.backlight();
// Configurar los pines de los botones como entradas
pinMode(startButtonPin, INPUT_PULLUP);
pinMode(pauseButtonPin, INPUT_PULLUP);
pinMode(resetButtonPin, INPUT_PULLUP);
pinMode(calibrateButtonPin, INPUT_PULLUP);
// Inicializar la balanza
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
scale.set_scale(calibration_factor);
scale.tare(); // Resetear la balanza a 0
tare = scale.get_units(); // Obtener el peso actual como tara
}
void loop() {
// Leer el estado de los botones
bool startButtonState = digitalRead(startButtonPin) == LOW;
bool pauseButtonState = digitalRead(pauseButtonPin) == LOW;
bool resetButtonState = digitalRead(resetButtonPin) == LOW;
bool calibrateButtonState = digitalRead(calibrateButtonPin) == LOW;
// Iniciar el cronómetro
if (startButtonState && !running) {
running = true;
startTime = millis() - elapsedTime; // Ajustar el tiempo de inicio al tiempo transcurrido
}
// Manejar la pausa del cronómetro y el doble click para reiniciar PM
if (pauseButtonState) {
if (running) {
running = false;
elapsedTime = millis() - startTime; // Guardar el tiempo transcurrido
}
unsigned long currentTime = millis();
// Verificar si es un segundo click en el intervalo de tiempo permitido
if (currentTime - lastPausePressTime <= doublePressInterval) {
pausePressCount++;
if (pausePressCount == 2) {
maxWeight = 0; // Resetear el peso máximo en el segundo click
pausePressCount = 0; // Resetear el contador de presiones
}
} else {
pausePressCount = 1; // Primer click
}
lastPausePressTime = currentTime; // Actualizar el tiempo de la última presión
}
// Reiniciar el cronómetro
if (resetButtonState) {
running = false;
elapsedTime = 0;
startTime = 0;
}
// Actualizar el tiempo transcurrido si el cronómetro está en marcha
if (running) {
elapsedTime = millis() - startTime;
}
// Calibrar la balanza
if (calibrateButtonState) {
scale.tare(); // Resetear la balanza a 0
tare = scale.get_units(); // Obtener el peso actual como tara
maxWeight = 0; // Resetear el peso máximo
}
// Verificar si el sensor HX711 está listo para tomar una lectura
if (scale.is_ready()) {
// Obtener el peso de la balanza
float weight = scale.get_units() - tare; // Calcular el peso relativo a la tara
// Evitar valores negativos
if (weight < 0) {
weight = 0;
}
// Actualizar el peso máximo si el peso actual es mayor
if (weight > maxWeight) {
maxWeight = weight;
}
// Mostrar la información en la pantalla LCD
lcd.clear();
// Calcular minutos y segundos
unsigned long totalSeconds = elapsedTime / 1000;
unsigned long minutes = totalSeconds / 60;
unsigned long seconds = totalSeconds % 60;
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(minutes);
lcd.print("m ");
lcd.print(seconds);
lcd.print("s");
lcd.setCursor(10, 0);
lcd.print("P:");
lcd.print((int)weight);
lcd.print("g");
lcd.setCursor(0, 1);
lcd.print("PM:");
lcd.print(maxWeight, 2);
} else {
// Si el sensor no está listo, muestra un mensaje de error
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sensor no listo");
}
// Pequeña demora para evitar rebotar botones
delay(100);
}