#include "HX711.h"
#include <Preferences.h>
// Pines para las celdas de carga
#define DT1 32 // Datos de la celda de carga 1
#define SCK1 33 // Reloj de la celda de carga 1
#define DT2 25 // Datos de la celda de carga 2
#define SCK2 26 // Reloj de la celda de carga 2
// Inicialización de las celdas de carga
HX711 celda1;
HX711 celda2;
// Pines para los valores analógicos de Compresion
#define PIN_COMPRESION 34 // Pin ADC para leer Compresion
// Pines para los botones
#define BOTON_REINICIO_CELDA1 27
#define BOTON_REINICIO_CELDA2 14
// Variables para calibración
float escalaCelda1 = 1.0; // Valor inicial para la escala de celda 1
float escalaCelda2 = 1.0; // Valor inicial para la escala de celda 2
bool transmitir = false; // Control de transmisión de datos
// Inicialización de Preferences
Preferences preferences;
void setup() {
Serial.begin(115200); // Inicia la comunicación serial
celda1.begin(DT1, SCK1); // Configura la celda 1
celda2.begin(DT2, SCK2); // Configura la celda 2
// Configurar botones
pinMode(BOTON_REINICIO_CELDA1, INPUT_PULLUP);
pinMode(BOTON_REINICIO_CELDA2, INPUT_PULLUP);
// Cargar calibraciones desde memoria persistente
cargarCalibraciones();
// Mostrar el menú de comandos
menu();
}
void loop() {
// Leer comandos desde el puerto serial
if (Serial.available() > 0) {
String comando = Serial.readStringUntil('\n'); // Leer comando completo
if (comando == "S") {
transmitir = true;
Serial.println("Transmisión iniciada.");
} else if (comando == "P") {
transmitir = false;
Serial.println("Transmisión detenida.");
} else if (comando == "C1") {
calibrarCelda(celda1, "Celda 1");
guardarCalibraciones(); // Guardar calibración después del ajuste
} else if (comando == "C2") {
calibrarCelda(celda2, "Celda 2");
guardarCalibraciones(); // Guardar calibración después del ajuste
} else if (comando == "M") {
menu(); // Muestra el menú de comandos
} else if (comando == "V") {
mostrarCalibraciones(); // Muestra las calibraciones guardadas
}
}
// Comprobar si se presionó un botón para reiniciar la lectura
if (digitalRead(BOTON_REINICIO_CELDA1) == LOW) {
Serial.println("Reiniciando celda 1...");
celda1.tare(); // Restablecer la tara
delay(1000); // Anti-rebote
}
if (digitalRead(BOTON_REINICIO_CELDA2) == LOW) {
Serial.println("Reiniciando celda 2...");
celda2.tare(); // Restablecer la tara
delay(1000); // Anti-rebote
}
// Enviar datos si la transmisión está habilitada
if (transmitir) {
if (celda1.is_ready() && celda2.is_ready()) {
// Leer valores de las celdas de carga
float profundidad1 = celda1.get_units(10); // Leer y promediar 10 valores
float profundidad2 = celda2.get_units(10); // Leer y promediar 10 valores
// Leer valor analógico para Compresion
int compresion = analogRead(PIN_COMPRESION);
// Formatear y enviar los datos
Serial.print("$");
Serial.print(profundidad1, 2);
Serial.print(";");
Serial.print(profundidad2, 2);
Serial.print(";");
Serial.println(compresion);
delay(500); // Intervalo de transmisión (ajustable)
} else {
Serial.println("Esperando que las celdas de carga estén listas...");
}
}
}
// Función para mostrar el menú de comandos
void menu() {
Serial.println("Comandos disponibles:");
Serial.println("'S' - Iniciar transmisión.");
Serial.println("'P' - Detener transmisión.");
Serial.println("'C1' - Calibrar celda 1.");
Serial.println("'C2' - Calibrar celda 2.");
Serial.println("'V' - Ver calibraciones guardadas.");
Serial.println("'M' - Mostrar este menú.");
}
// Función para calibrar una celda de carga
void calibrarCelda(HX711 &celda, const char *nombre) {
Serial.print("Coloque la celda de ");
Serial.print(nombre);
Serial.println(" sin peso y presione Enter.");
while (Serial.read() != '\n') {} // Esperar a que el usuario presione Enter
celda.tare(); // Calibrar sin peso
Serial.print("Ahora coloque un peso conocido en la celda de ");
Serial.print(nombre);
Serial.println(" y presione Enter.");
while (Serial.read() != '\n') {} // Esperar a que el usuario presione Enter
Serial.println("Ingrese el valor del peso en gramos:");
while (!Serial.available()) {}
float pesoConocido = Serial.parseFloat(); // Leer peso conocido del usuario
Serial.println("Calibrando, por favor espere...");
long lectura = celda.get_units(10); // Promediar 10 lecturas
float escala = lectura / pesoConocido; // Calcular el factor de escala
celda.set_scale(escala);
Serial.print("Calibración completada para ");
Serial.println(nombre);
Serial.print("Factor de escala: ");
Serial.println(escala, 5);
if (nombre == String("Celda 1")) {
escalaCelda1 = escala;
} else if (nombre == String("Celda 2")) {
escalaCelda2 = escala;
}
}
// Función para cargar las calibraciones desde la memoria
void cargarCalibraciones() {
preferences.begin("calibraciones", true); // Modo solo lectura
escalaCelda1 = preferences.getFloat("escala1", 1.0);
escalaCelda2 = preferences.getFloat("escala2", 1.0);
preferences.end(); // Cerrar acceso a memoria
// Aplicar escalas cargadas
celda1.set_scale(escalaCelda1);
celda2.set_scale(escalaCelda2);
Serial.println("Calibraciones cargadas.");
}
// Función para guardar las calibraciones en la memoria
void guardarCalibraciones() {
preferences.begin("calibraciones", false); // Modo escritura
preferences.putFloat("escala1", escalaCelda1);
preferences.putFloat("escala2", escalaCelda2);
preferences.end(); // Cerrar acceso a memoria
Serial.println("Calibraciones guardadas.");
}
// Función para mostrar las calibraciones guardadas
void mostrarCalibraciones() {
Serial.println("Calibraciones guardadas:");
Serial.print("Escala Celda 1: ");
Serial.println(escalaCelda1, 5);
Serial.print("Escala Celda 2: ");
Serial.println(escalaCelda2, 5);
}