#include <HX711.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#include <Servo.h>
// Pines para HX711
uint8_t dataPin = A0;
uint8_t sckPin = A1;
const long peso_conocido = 950; // gr.
// Pines para botones
int pul_0 = A2;
int pul_1 = A3;
int pul_2 = A4;
int pul_3 = A5;
uint8_t btn_calibracion = 9;
// Límite de peso en gramos
const int peso_limite = 2000; // Ajusta según sea necesario
// Variables globales
float fCalibracion;
float pesoActual;
int pesoConv;
// Objetos
HX711 balanza;
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo servo1;
void setup() {
Serial.begin(115200);
// Configuración de HX711 y LCD
balanza.begin(dataPin, sckPin);
lcd.begin(16, 2);
lcd.init();
lcd.backlight();
bienvenidos();
delay(2000);
lcd.clear();
// Configuración de botones
pinMode(btn_calibracion, INPUT_PULLUP);
pinMode(pul_0, INPUT);
pinMode(pul_1, INPUT);
pinMode(pul_2, INPUT);
pinMode(pul_3, INPUT);
// Configuración del servo
servo1.attach(2);
// Consulta para calibrar la balanza
if (digitalRead(btn_calibracion) == HIGH) {
balanza.tare();
while (digitalRead(btn_calibracion) == HIGH) {
lcd.setCursor(0, 0);
lcd.print("Pulsa el boton para calibrar la balanza");
delay(350);
lcd.scrollDisplayLeft();
}
calibracionBalanza();
}
// Lee la calibración desde EEPROM
EEPROM.get(0, fCalibracion);
// Establece el factor de calibración
balanza.set_scale(fCalibracion);
Serial.print("Dato de la EEPROM: ");
Serial.println(fCalibracion);
}
void loop() {
// Lectura del peso
pesoActual = balanza.get_units(10);
if (pesoActual < 0) {
pesoConv = 0;
} else {
pesoConv = int(pesoActual);
}
Serial.print("Peso: ");
Serial.print(pesoConv);
Serial.println(" gr");
// Mostrar peso en el LCD
lcd.setCursor(0, 0);
lcd.print("Peso: ");
lcd.print(pesoConv);
lcd.print(" gr ");
// Verificar si se excede el límite de peso
if (pesoConv > peso_limite) {
lcd.setCursor(0, 1);
lcd.print("Exceso de peso!");
delay(1000); // Mostrar el mensaje durante un segundo
return; // No permitir movimiento del ascensor si hay exceso de peso
}
// Lectura de botones y control del servo
int pizo0 = digitalRead(pul_0);
int pizo1 = digitalRead(pul_1);
int pizo2 = digitalRead(pul_2);
int pizo3 = digitalRead(pul_3);
if (pizo0 == HIGH) {
servo1.write(0);
lcd.setCursor(0, 1);
lcd.print("PISO: PB ");
}
if (pizo1 == HIGH) {
servo1.write(90);
lcd.setCursor(0, 1);
lcd.print("PISO: 1 ");
}
if (pizo2 == HIGH) {
servo1.write(180);
lcd.setCursor(0, 1);
lcd.print("PISO: 2 ");
}
if (pizo3 == HIGH) {
servo1.write(270);
lcd.setCursor(0, 1);
lcd.print("PISO: 3 ");
}
delay(500); // Aumenta el delay para que sea visible el cambio en el LCD
}
void calibracionBalanza() {
long adc_balanza;
// Mensaje
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Coloque el peso");
lcd.setCursor(0, 1);
lcd.print("conocido");
delay(8000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Calibrando");
lcd.setCursor(0, 1);
adc_balanza = balanza.get_value(100);
fCalibracion = float(adc_balanza) / peso_conocido;
Serial.print("Factor de Calibracion: ");
Serial.println(fCalibracion);
// Guarda el factor de calibración en EEPROM
EEPROM.put(0, fCalibracion);
delay(100);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Listo....");
delay(1000);
lcd.clear();
}
void bienvenidos() {
lcd.setCursor(1, 0);
lcd.print("Bienvenidos");
lcd.setCursor(1, 1);
lcd.print("JAD