#include <HX711.h> //libreria de celda de carga
#include <LiquidCrystal_I2C.h> //libreria de LCD I2C
#include <LiquidCrystal.h> //libreria de LCD
#include <EEPROM.h> //libreria EEPROM
#define DOUT A1 //Entradas analogicas para la celda de carga
#define CLK A2 // Control de Apagado (Activo Alto), entrada de reloj en serie
HX711 balanza; //Declarar la variable
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //Pines utilizados por el LCD
int tecla = A0; // Devuelve a un dato numerico
unsigned long direccion = 0; // Declara una variable como tipo long
unsigned long refLSB = -103434.00 ; // Declara una variable como tipo long
unsigned long refMSB = 0; // Declara una variable como tipo long
unsigned long med; // Declara una variable como tipo long
void setup() // Se utiliza para iniciar los modos de trabajo de los pines o el puerto serie
{
// Inicialización serial
Serial.begin(19200); // Abre el puerto serie, configurando la velocidad en 19200bps
balanza.begin (DOUT, CLK); //* Abre el puerto *
lcd.begin(16,2); // Inicialización del LCD
Reset(); // Inicialización de la celda de carga con un reset
}
void loop() // Ejecuta en forma ciclica y posibilita que el programa este respondiendo continuamente.
{
Peso(); //Lectura de Peso
lcd.setCursor(0, 1); // Funcion de los botones
int valor = analogRead(tecla); // Devuelve a un dato numerico
if (valor >635 && valor<645) //Start
{
lcd.clear(); // Limpia la LCD
Peso(); // Lectura de peso
while (balanza.get_units(10) <= refLSB) // Hasta que el valor de la balanza sea mayor o igual al valor de referencia digitado por el usuario
{
digitalWrite (3, HIGH); // Encender
lcd.setCursor (0,0); // Funcion de los botones
Peso(); // Lectura de peso
lcd.setCursor (0,1); // Funcion de los botones
lcd.print ("Peso Ref:"); // Imprime un mensaje en la LCD "Peso referido"
lcd.print (refLSB); // Imprime un mensaje en la LCD "refLSB"
delay(50); // Comando de tiempo de espera en ms
}
lcd.clear(); // Limpiar LCD
digitalWrite (3, LOW); // Apagar
lcd.setCursor (0,1); // Fubcion de los botones
lcd.print ("LLenado completado!"); // Imprime un mensaje " Llenado completado"
delay(50); // Comando de tiempo de espera en ms
lcd.clear(); // Limpiar LCD
delay(50); // Comando de tiempo de espera en ms
Peso(); // Lectura de peso
}
else if (valor == 0) //Tarar
{
lcd.clear(); //Limpiar LCD
lcd.print("Tarando..."); // Imprime "Tareando..."
balanza.tare(balanza.get_units(10)); //Define el peso de tara
delay(100); // Comando de tiempo de espera en ms
lcd.clear(); //Limpiar LCD
lcd.setCursor (0,0); // Funciones de los botones
lcd.print(balanza.get_units(10)); // imprime el valor de la balanza con todo y unidades
lcd.setCursor (0,1); // Funcion de los botones
lcd.print ("Tara completada"); // Imprime Tara completada
delay(50); // Comando de tiempo de espera en ms
lcd.clear(); //Limpia LCD
Peso(); // Lectura Peso
}
else if (valor >405 && valor<415) //Set
{
lcd.clear(); // Limpia LCD
lcd.setCursor(0,0); // Funcion de los botones
lcd.print("Ref:"); // Imprime "Ref"
delay(100); // Comando de tiempo de espera en ms
lcd.setCursor (0,1); //Inicializa la variable en 0
lcd.print (refLSB); // Imprimir "refLSB"
lcd.print ("g"); // Imprimir "gramos"
}
else if(valor >95 && valor<105) //Boton UP
{
int med = UP(); // Devuelve a un dato numerico de up
}
else if(valor >250 && valor<260) //Boton DOWN
{
int med = DOWN(); // Devuelve a un dato numerico de down
}
// else if (valor >405 && valor<415 && refLSB != 0)
// {
// med = refLSB;
// lcd.setCursor(0,1);
// lcd.print("Peso:");
// lcd.print(med);
// }
}
void Peso() // Iniciar el proceso de lectura de peso
{
//Lectura de peso
lcd.setCursor(0,0); // Funcion de botones
lcd.print("Peso: "); // Imprime peso
lcd.print(balanza.get_units(10),0); // Imprime valor de balanza en unidades
lcd.println(" g"); // Imprime gramos
delay(100); // Comando de tiempo de espera en ms
}
void Reset() // Inicia el rpoceso de reset
{
int escala = 529.25; //depende de la escala
lcd.setCursor(0,0); // Funcion de los botones
lcd.print("ADC:"); // CONVERSOR ANALOGO DIGITAL
lcd.println(balanza.read()); //Lee el valor de la balanza
delay(100); // Comando de tiempo de espera en ms
lcd.clear(); // Limpia LCD
lcd.println("Despeje"); // Imprime " Despeje"
delay(100); // Comando de tiempo de espera en ms
lcd.clear(); // Limpia LCD
lcd.println("Espere..."); // Imprime Espere
delay(100); // Comando de tiempo de espera en ms
lcd.clear(); // Limpia pantalla
EEPROM.get(0,refLSB); // Digitar el dato de la EEPROM
refLSB = -103434.00 ; //* Bits menos significativo
EEPROM.update(0,refLSB); // Digitar el bit menos significativo en la EEPROM
lcd.println("..."); // Imprime ...
delay(100); // Comando de tiempo de espera en ms
lcd.clear(); // Limpia LCD
balanza.set_scale(escala); // Establece la escala
balanza.tare(50); //El peso actual es considerado Tara. Depende del peso de la plataforma
lcd.println(" Listo"); // Imprime Listo
delay(100); // Comando de tiempo de espera en ms
lcd.clear(); // Limpiar LCD
lcd.println(balanza.get_value(10),0); //Verifica que el valor de la balanza haya sido tarado
delay(100); // Comando de tiempo de espera en ms
}
int UP () // Se declara una variable
{
lcd.print (" "); // Imprimir un mensaje
EEPROM.get(direccion,refLSB); // Agregar un valor en la EEPROM
refLSB = refLSB + 1; // Valor de la variable aumentandole un 1
lcd.setCursor(0,1); // Funcion de botones
lcd.print (refLSB); // Imprimir el bit menos significativo
lcd.print ("g"); // Imprimir gramos
EEPROM.update(direccion ,refLSB); // Digitar el valor de la direccion para la EEPROM
delay(50); // Comando de tiempo de espera en ms
}
int DOWN() // Se declara una variable
{
refLSB = 0; // *Bits menos significativo
EEPROM.update(0,refLSB); //Digitar un valor a la EEPROM
delay(50); // Comando de tiempo de espera en ms
lcd.print (" "); // Imprime un mensaje la LCD
EEPROM.get(0,refLSB); // Digitar un valor a la EEPROM
refLSB = refLSB - 1; // Declarar un valor a la variable restandole 1
lcd.setCursor(0,1); // Funcion de botones
lcd.print (refLSB); // Imprime un valor
lcd.print ("g"); //Imprime gramos
EEPROM.update(0,refLSB); // Digitar un valor en la EEPROM
delay(50); //// Comando de tiempo de espera en ms
}
Estamos realizando una programación en la cual consiste pesar líquidos, con una bascula. Nuestro Hardware del circuito tiene los siguientes elementos: Arduino Genuino 1, LCD 16,2 KEYPAD SHIELD FOR ARDUINO, amplificador Hx711 y una celda de carga de 50 kg como prueba. Nuestro problema principal es que la celda de carga no nos genera mediciones con sentido, salen números negativos y cuenta aleatoriamente.
¿Cómo se puede solucionar? ¡AYUDA!