Hola gente comparto este proyecto que hice hace más de dos años, una balanza de peso dinámico para paquetes de 1Kg había tenido problemas con la pantalla, se hablo con el fabricante y ese modelo ya estaba discontinuado y sugirió reemplazar toda la balanza, el costo era de 10 mil USD entonces decidí probar un Arduino Nano con un Hx711 y celda de carga de 5kg el resultado fue que funciono mejor de que pensaba tengo un error de unos 3 gramos y es mas que aceptable al pesar algo en movimiento, el programa es extremadamente sencillo lo que hace es pesar el paquete si esta dentro de un rango establecido lo deja pasar sino un cilindro neumático le pega al paquete y lo descarta. El programa es muy mejorable porque los pesos establecidos son fijos pero como eso nunca se modifica no lo vi necesario use los tan odiados delays, pero en este caso una vez que se peso el paquete no tengo otra cosa que hacer. En principio tenía dudas si andaría porque he leído que arduino no sirve para entornos industriales y hasta un ING me dijo una vez que deje de perder el tiempo con arduino.. en fin haciendo números hasta ahora pasaron aproximadamente 8.060.000 paquetes por la balanza hecha con arduino y sigue funcionando perfectamente, Diseño de PCB no hice porque lo arme en uno de esos PCB que ya vienen perforados.
Esta es la lista de materiales que use:
Arduino Nano
LCD 16X2 I2C
Sesor de proximidad Infrarojo
Hx711
Celda de Carga 5Kg
Modulo LED RGB
Fuente step-down (LM2596)
Lm317
Bc337 x 4
2.2K x 5
470
100nF
100mF
1N4007
Esquema:
Con este codigo se calibra la celda de carga:
#include "HX711.h"
// Pin de datos y de reloj
byte pinData = 5;
byte pinClk = 4;
HX711 bascula;
// Parámetro para calibrar el peso y el sensor
float factor_calibracion = 397900 // Celda Arduino 5Kg
void setup() {
Serial.begin(9600);
Serial.println("HX711 programa de calibracion");
Serial.println("Quita cualquier peso de la bascula");
Serial.println("Una vez empiece a mostrar informacion de medidas, coloca un peso conocido encima de la bascula");
Serial.println("Presiona + para incrementar el factor de calibracion");
Serial.println("Presiona - para disminuir el factor de calibracion");
// Iniciar sensor
bascula.begin(pinData, pinClk);
// Aplicar la calibración
bascula.set_scale();
// Iniciar la tara
// No tiene que haber nada sobre el peso
bascula.tare();
// Obtener una lectura de referencia
long zero_factor = bascula.read_average();
// Mostrar la primera desviación
Serial.print("Zero factor: ");
Serial.println(zero_factor);
}
void loop() {
// Aplicar calibración
bascula.set_scale(factor_calibracion);
// Mostrar la información para ajustar el factor de calibración
Serial.print("Leyendo: ");
Serial.print(bascula.get_units(3), 3);
Serial.print(" kgs");
Serial.print(" factor_calibracion: ");
Serial.print(factor_calibracion);
Serial.println();
// Obtener información desde el monitor serie
if (Serial.available())
{
char temp = Serial.read();
if (temp == '+')
factor_calibracion += 10;
else if (temp == '-')
factor_calibracion -= 10;
}
}
Y este es el programa de la balanza:
#include <Wire.h> // libreria de comunicacion por I2C
#include <LCD.h> // libreria para funciones de LCD
#include <LiquidCrystal_I2C.h> // libreria para LCD por I2C
LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7); // DIR, E, RW, RS, D4, D5, D6, D7
#include "HX711.h"
#define DEBUG_HX711
// Parámetro para calibrar el peso y el sensor
#define CALIBRACION 397900 // Celda Arduino 5Kg
// Pin de datos y de reloj
byte pinData = 5;
byte pinClk = 4;
byte pin = 2;
byte sensor = 0;
byte pinLed = 6;
byte pinLed1 = 7;
byte pinLed2 = 8;
byte cilindro = 9;
float peso = 0;
// Objeto HX711
HX711 bascula;
void setup() {
lcd.setBacklightPin(3, POSITIVE); // puerto P3 de PCF8574 como positivo
lcd.setBacklight(HIGH); // habilita iluminacion posterior de LCD
lcd.begin(16, 2);
lcd.setCursor (1 , 1);
lcd.print ("Esperando peso");
pinMode (pinLed, OUTPUT);
pinMode (pinLed1, OUTPUT);
pinMode (pinLed2, OUTPUT);
pinMode (cilindro, OUTPUT);
digitalWrite (pinLed2, HIGH);
#ifdef DEBUG_HX711
#endif
// Iniciar sensor
bascula.begin(pinData, pinClk);
// Aplicar la calibración
bascula.set_scale(CALIBRACION);
// Iniciar la tara
// No tiene que haber nada sobre la balanza
bascula.tare();
}
void loop() {
sensor = digitalRead (pin);
if (sensor == LOW)
{
#ifdef DEBUG_HX711
peso = bascula.get_units(8), 3; // cantidad de veces que pesa (), digitos que se muestran 3.
#endif
digitalWrite (pinLed2, LOW);
lcd.setCursor(4, 0);
lcd.print(peso, 3); // cantidad de caracteres que se muestran del float
lcd.setCursor(9, 0);
lcd.print (" Gr");
lcd.setCursor (0, 1);
lcd.print (" ");
if (peso > 1.031) {
digitalWrite (pinLed, HIGH);
delay (650);
digitalWrite (pinLed, 0);
digitalWrite (cilindro, HIGH);
delay (300);
digitalWrite (cilindro, LOW);
}
if (peso < 1.030 && peso > 0.990) {
digitalWrite (pinLed1, HIGH);
delay (700);
digitalWrite (pinLed1, 0);
}
if (peso < 0.989) {
digitalWrite (pinLed, HIGH);
delay (650); //1130
digitalWrite (pinLed, 0);
digitalWrite (cilindro, HIGH);
delay (300);
digitalWrite (cilindro, LOW);
}
}
}
Algunas fotos: