#include <Arduino.h>
#include "HX711.h"
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Keypad.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
// HX711 circuit wiring
byte Data = A2;
byte PinesSCK = A1;
//#define DEBUG_HX711
#define CALIBRACION 94969.00 // LA CALIBRACION SE SACA DE OTRO PROGRAMA DE HX711 CON UN PESO CONOCIDO 94812.00
HX711 bascula;
/////////////////////telclado//////////////
const byte Filas = 4;
const byte Columnas = 4;
byte PinesFilas[] = {9, 8, 7, 6}; //pines filas
byte PinesColumnas[] = {5, 4, 3, 2}; // pines columnas
char pulsacion;
String PIN_Tecleado = ""; // teclas digitadas
float pesoMinEstablecido = 0.0; // cadena de datos digitados a travez del teclado. Cero por defecto
float pesoMaxEstablecido = 1.0; // Uno por defecto
boolean enMaximo = false; // Indica si se está determinando peso mínimo o máximo.
boolean establecido = false; // Indica si ya se definieron los límites.
boolean puntoEscrito = false; // Indica si ya se ha escrito el punto decimal.
boolean limitesMostrados = false; // Esto evita que, repetidamente, se escriba al LCD los limites ya definidos.
char cadena[17];
const int rele = A0;
const int relevariador = A3;
char Teclas [Filas][Columnas] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'.', '0', '#', 'D'}
};
Keypad Teclado1 = Keypad(makeKeymap(Teclas), PinesFilas, PinesColumnas, Filas, Columnas);
void setup() {
pinMode (rele, OUTPUT);
pinMode(relevariador, OUTPUT); //COMANDO PARA PRENDER EL RELE
//#ifdef DEBUG_HX711
//#endif
Serial.begin(9600);
// Iniciar sensor
bascula.begin(Data, PinesSCK);
// Aplicar la calibración
bascula.set_scale(420);
// Iniciar la tara
// No tiene que haber nada sobre la balanza
bascula.tare();
delay(100);
lcd.begin(20, 4); // Iniciamos el lcd
lcd.backlight(); // Encendemos el back light
lcd.setCursor(0, 0);
lcd.print("INGRESE PESO PARA");
lcd.setCursor(0, 1);
lcd.print("REDUCIR VELOCIDAD");
}
void loop() {
if (bascula.is_ready()) {
float reading = bascula.get_units(8);
if (establecido) {
lcd.setCursor(6, 2);
lcd.print(reading);
lcd.print("kg ");
if (reading >= pesoMaxEstablecido) { // Cuando está por debajo del mínimo
digitalWrite(rele, HIGH);
}
if (reading < pesoMaxEstablecido) {
digitalWrite(rele, LOW);
}
//////////////RELAY PARA REDUCIR LA VELOCIDAD
if (reading >= pesoMinEstablecido) { // Cuando está por debajo del mínimo
digitalWrite(relevariador, HIGH);
}
if (reading < pesoMinEstablecido) {
digitalWrite(relevariador, LOW);
}
///////////FIN DEL CODIGO DE REDUCIR LA VELOCIDAD/////
}
}
pulsacion = Teclado1.getKey();
//#ifdef DEBUG_HX711
switch (pulsacion) {
case '.': // Punto decimal
if (puntoEscrito) { // No hace nada si ya se había escrito un punto previamente
break;
} else {
puntoEscrito = true;
}
case '0' ... '9': // o dígitos,
if (!establecido) { // No hace nada si ya se habían establecido los dos límites
//delay(30);
PIN_Tecleado += pulsacion; // los agregamos a la cadena
lcd.setCursor(2, 3);
lcd.print(PIN_Tecleado );
}
break;
case 'B': // Lo tomaremos como enter para guardar el dato
if (!establecido) { // No hace nada si ya se habían establecido los dos límites
delay(30);
lcd.clear();
PIN_Tecleado.toCharArray( cadena, 17);
if (!enMaximo) {
pesoMinEstablecido = atof (cadena);
} else {
pesoMaxEstablecido = atof (cadena);
}
if (enMaximo) {
establecido = true;
puntoEscrito = true;
} else {
puntoEscrito = false;
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("INGRESE PESO DE");
lcd.setCursor(6, 1);
lcd.print("CORTE");
enMaximo = true;
}
}
PIN_Tecleado = ""; // Tiene sentido vaciar este "búfer" después de establecer un peso.
break;
case 'C': // lo tomaremos como borrar todo
delay(30);
lcd.clear();
// Volver todo a sus valores iniciales
pesoMinEstablecido = 0.0;
pesoMaxEstablecido = 1.0;
enMaximo = false;
establecido = false;
puntoEscrito = false;
limitesMostrados = false;
PIN_Tecleado = "";
lcd.setCursor(0, 0);
lcd.print("INGRESE PESO PARA");
lcd.setCursor(0, 1);
lcd.print("REDUCIR VELOCIDAD");
break;
case 'A':
lcd.clear();
lcd.setCursor(3,0);
lcd.print ("ESPERE TARANDO");
delay(1000);
lcd.clear();
bascula.tare(8);
break;
}
}