#include <Wire.h> // Se incluye la libreria para la comunicación I2C
#include <Adafruit_GFX.h> // Se incluye la libreria para hacer gráficos con la pantalla OLED
#include <Adafruit_SSD1306.h> // Se incluye la libreria de la pantalla OLED
#include "HX711.h" // Se incluye la libreria de la célula de carga
#define VERDE 5 // defino entrada 5 digital para el led verde
#define AMARILLO 6 // defino entrada 6 digital para el led amarillo
#define ROJO 7 // defino entrada 7 digital para el led rojo
#define PULSADOR 4 // defino entrada 4 digital para el pulsador
#define ANCHO_PANTALLA 128 // ancho pantalla OLED
#define ALTO_PANTALLA 64 // alto pantalla OLED
const int DATA = 3; // Declaro la variable constante DATA y se conecta en PIN 3
const int CLK = 2; // Declaro la variable constante CLK y se conecta en PIN 2
float PESO_INICIAL; // Declaro la variable PESO INICIAL
float PESO_INSTANTANEO; // Declaro la variable PESO INSTANTANEO
float PESO_AVISO; // Declaro la variable PESO AVISO
float PESO_ALARMA; // Declaro la variable PESO ALARMA
HX711 balanza; // Cargamos la libreria
// Objeto de la clase Adafruit_SSD1306
Adafruit_SSD1306 oled(ANCHO_PANTALLA, ALTO_PANTALLA, &Wire, -1);
void setup() { // Configuramos Arduino
Wire.begin(); // Iniciamos la comunicación I2C
Serial.begin(9600); // Indico los baudios(bits por segundo)a la que se realiza lacomunicación Arduino-PC
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.clearDisplay();
// Tamaño del texto
oled.setTextSize(3.5);
// Color del texto
oled.setTextColor(SSD1306_WHITE);
// Posición del texto
oled.setCursor(5, 5);
// Escribir texto
oled.print("EMPEZAMOS");
// Enviar a pantalla
oled.display();
oled.clearDisplay();
balanza.begin(DATA, CLK); // Iniciamos el ADC HX711 indicando los pines DATA y CLK que se inician
pinMode(ROJO, OUTPUT); // Establezco como salida el pin 7
pinMode(AMARILLO, OUTPUT); // Establezco como salida el pin 6
pinMode(VERDE, OUTPUT); // Establezco como salida el pin 5
pinMode(PULSADOR, INPUT); // Establezco como entrada el pin 4
Serial.print("INICIANDO EQUIPO:"); // Mostramos por pantalla el mensaje entre comillas
oled.print("INICIANDO EQUIPO:");
Serial.println("...");// Mostramos por pantalla el mensaje entre comillas
oled.println("...");
Serial.println(balanza.read()); // Mostramos por pantalla en la linea siguiente los valores que lee de la balanza y que convierte el ADC
oled.println(balanza.read());
Serial.println("NO COLOQUE OBJETO");// Mostramos por pantalla el mensaje entre comillas
oled.println("NO COLOQUE OBJETO");
delay(500); // Hacemos que el programa espere a mostrar el siguiente mensaje
Serial.println("ESPERE...");// Mostramos por pantalla el mensaje entre comillas
oled.println("ESPERE...");
Serial.println("...");// Mostramos por pantalla el mensaje entre comillas
oled.println("...");
delay(1000); // Hacemos que el programa espere a mostrar el siguiente mensaje
balanza.set_scale(216080); // Fijamos el valor de la escala, este valor resulta del cociente entre el valor obtenido de la función get_value(byte n) del programa calibrado_balanza y el peso patrón conocido
balanza.tare(100); //Establece el peso actual como el peso de tara, n indica el número de lecturas que se realizan para obtener la tara, por defecto n=10.
Serial.println("LISTO PARA PESAR");
oled.println("LISTO PARA PESAR");
delay(500);
Serial.println("COLOQUE SUERO");
oled.println("COLOQUE SUERO");
delay(500);
Serial.println("PULSE START");
oled.println("PULSE START");
delay(5000);
}
void loop()
{
if (digitalRead(PULSADOR) == HIGH) { // accionar el pulsador es la condición para que fije el valor del peso inicial
digitalWrite(VERDE, LOW);
digitalWrite(AMARILLO, LOW);
digitalWrite(ROJO, LOW);
PESO_INICIAL = balanza.get_units(10), 3; // fijo el valor como valor inicial de referencia
PESO_AVISO = ((abs(PESO_INICIAL)) * 0.5); // fijo el peso aviso cuando el valor llegué al 50% del peso inicial
PESO_ALARMA = ((abs(PESO_INICIAL)) * 0.2); // fijo el peso aviso cuando el valor llegué al 20% del peso inicial
Serial.print(abs(PESO_INICIAL)); //Devuelve el valor actual ( el restado del peso de tara y dividido por la escala)
oled.print(abs(PESO_INICIAL));
Serial.println("PESO FIJADO");// Muestra el peso en kg
oled.println("PESO FIJADO");
}
else { // si no acciono el pulsador no guardará el valor de peso inicial
digitalWrite(ROJO, LOW);
digitalWrite(AMARILLO, LOW);
digitalWrite(VERDE, HIGH);
Serial.print(abs(PESO_INICIAL)); //Devuelve el valor actual ( el restado del peso de tara y dividido por la escala)
oled.print(abs(PESO_INICIAL));
Serial.println("kg al inicio"); // Muestra el peso en kg
oled.println("kg al inicio");
PESO_INSTANTANEO = balanza.get_units(10), 3; // guardo el valor de peso instantaneo
Serial.print(abs(PESO_INSTANTANEO));
oled.print(abs(PESO_INSTANTANEO));
Serial.println("kg ahora"); // Muestra el peso instantaneo
oled.println("kg ahora");
}
if ((abs(PESO_INSTANTANEO) <= PESO_ALARMA) && (abs(PESO_INSTANTANEO) > 0)) {
digitalWrite(AMARILLO, LOW);
digitalWrite(ROJO, HIGH);
digitalWrite(VERDE, LOW);
Serial.println("ALARMA");
oled.println("ALARMA");
}
else if ((abs(PESO_INSTANTANEO) <= PESO_AVISO) && (abs(PESO_INSTANTANEO) > 0))
{
digitalWrite(AMARILLO, HIGH );
digitalWrite(ROJO, LOW);
digitalWrite(VERDE, HIGH);
Serial.println("AVISO");
oled.println("AVISO");
}
delay(500); // Hacemos que el programa espere a mostrar el siguiente mensaje
}