Control de Nivel con Celda de Carga

¡Hola Chicos! Estoy intentando hacer un control de nivel con una celdas de carga que se llene hasta obtener un peso de 36kg y que al llegar allí encienda un relé que active una bomba que vacíe el tanque hasta que pese 5kg y vuelva a llenar repitiendo el ciclo cuando vuelva a llegar a 36kg, hice el programa y todo genial inclusive realicé el siguiente código.

#include <HX711.h>
byte pinData = 3;
byte pinClk = 2;
float peso = 0; 
const int rele = 5; 

HX711 bascula;

float factor_calibracion = 22500.0;
void setup() {
  Serial.begin(9600); 
  pinMode(rele, OUTPUT);
  bascula.begin(pinData, pinClk);
  bascula.tare();
}

void loop() {
  
  bascula.set_scale(factor_calibracion);
  peso = bascula.get_units();
  Serial.println(peso);
  
  if (peso >= 36.5)
  {
    digitalWrite(rele, HIGH);
  }
  if (peso <= 5.5)
  {
    digitalWrite(rele, LOW);
  }
}

¿Cuál es mi dilema entonces? Resulta que el HX711 en su librería tiene una especie de sentencia que es “bascula.tare();” que me hace que el peso que se ubica sobre la celda sea mi cero y mis mediciones empiezan a partir de allí. Mi dilema es que en mi país se va la electricidad y hace que mi sistema se desconfigure, por lo que no tengo un sistema confiable en este aspecto, a todas estas he pensado en las siguientes soluciones:

  1. Batería: En la empresa donde trabajo hay un sistema que desconecta la planta eléctrica con la red externa sin que nada se apague, me gustaría saber si ese sistema existe para aplicarlo en corriente continua, en caso dado, saber si existe algún circuito integrado que me permita saber que si se va la corriente por una fuente externa de 5v tome la carga de por ejemplo un conjunto de 4 baterías, de ser así nada cambiaría en mi código simplemente adaptaría el hardware a lo que necesito y ya.

  2. Almacenar la última lectura después de cada lectura: He leído que esto puedo hacerlo por la EEPROM pero también he leído que esta tiene un límite de 100000 lecturas y que inclusive cuando la envío a que me borre lo que ella tiene almacenado es como si escribiera un 0, ejemplo: Tengo 100 escrituras, deseo “resetear” mi EEPROM y le escribo 0 y tendré entonces 101 escrituras, esto significaría otro problema pues en realidad este sistema de control es relativamente rápido pues carga cada 30 seg y descarga cada 20 seg pero yo envío a realizar lecturas cada 2seg lo que implica que cada 2 seg se guardaría un valor y esto es un sistema que quedaría habilitado para trabajar todos los días 4 horas, por lo que mi memoria EEPROM se llenaría super rápido.

  3. Algún detalle que no estoy entendiendo con la librería: No sé si exista alguna manera de utilizar la función “bascula.tare();” para poder asignar yo misma mi peso tara (siento que por aquí es por donde puedo llegar a una solución pero ya me tapé :c)

Si alguien que ya haya trabajado con celdas sabe de alguna manera en la que pueda solventar mi problema le agradezco de antemano que pueda ayudarme.

En cuanto a lo de la bateria: si en la empresa donde trabajas hay un sistema de SAI (Sistema de Alimentación Ininterrumpida) que alimenta la planta aun cuando no hay red, ¿No sería lógico tener la alimentación del Arduino enchufado en él? Así funciona tanto la planta y el Arduino si se cae la red.

Puede ser que no se pueda conectar la alimentación al arduino, no sé, quizás porque sea trifásica 380V y sería bastante dificil conseguir una fuente de DC. Pero puedes buscar en google “fuente UPS 12v” (UPS=uninterruptible power supply lo mismo que SAI pero en inglés). Estas fuentes tienen unos terminales para poder conectar una bateria de 12voltios y hacen esa función. Algunas fuentes incorporan dicha bateria.

Otra opción sería fabricarla, e igualmente hay en google cientos de circuitos. Te recomiendo este artículo de INVENTABLE - Usar bateria como tampon

También puedes encontrar powerbanks con el sistema UPS incorporado, si lo que vas a alimentar solo son 5voltios.

En cuanto a la celda de carga y la librería no te puedo ayudar ya que desconozco la libreria y no he trabajado con celdas.

El tema es que no es para utilizarlo aquí es para utilizarlo en otro lugar donde no tenemos ese sistema por eso es el dilema :c.

Realmente la solución que me propones de la batería o el UPS no es muy viable debido a los costos :/

Y mas simple que pensar en una UPS o SAI no es grabar los datos de calibracion de tu HX711 en la EEPROM? Se corta la luz y al inicial lee los datos de la EEPROM y se restaura como si nada. Para eso esta ese recurso.

Para el punto 2) tienes opciones como. Aprovechar la NVRAM de un RTC. Los RTC traen una memoria NoVoltil que puedes usar. No se degrada. pero si requiere tener una pila de 3V funcional.

Tambien puedes usar EEPROM externas concebidas para trabajo mas exigente, no tienen 100k sino capacidad de millones de usos.

En una aplicación parecida lo he hecho así: No uso la función tara de la librería. Al apretar botón tara, guardo el peso actual en el eeprom. Al iniciar el sketch, leo desde el eeprom y luego en el sketch descuento este valor de la lectura actual.

Hi, Pregunta Porque no medir el nivel del tanquer? Si mides el nivel del tanque no importa si la fuente de energia falle pues la lectura del nivel la vaz a poder leer cuando la energia se restablesca.Otra cosa que tarjeta de micro estas usando.

tauro0221: Pregunta Porque no medir el nivel del tanquer?

Porque ya tiene el hardware hecho con celdas de carga. Lo único es que la librería del hx711 no está hecho para esta aplicación, sino para un balance sencillo con botón de tara.

Hi, Aqui podrias hacer algo como conectar el voltaje de entrada a un interrupt que cuando la energia de entrada falle te de un interrupt y vayas imediatamente y salves la lectura del nivel en la memoria ya sea como te sugerieron del eprom o una memoria externa. Una cosa importante es de anadirle un condesador a los 5 voltios de la tarjeta para que tengas suficiente energia para guardar la informacion del nivel en la memoria.

surbyte:
Y mas simple que pensar en una UPS o SAI no es grabar los datos de calibracion de tu HX711 en la EEPROM?
Se corta la luz y al inicial lee los datos de la EEPROM y se restaura como si nada. Para eso esta ese recurso.

Para el punto 2) tienes opciones como. Aprovechar la NVRAM de un RTC.
Los RTC traen una memoria NoVoltil que puedes usar. No se degrada. pero si requiere tener una pila de 3V funcional.

Tambien puedes usar EEPROM externas concebidas para trabajo mas exigente, no tienen 100k sino capacidad de millones de usos.

Correcto, pero el dilema con lo de la EEPROM es que he leído que si por ejemplo deseo resetearla cuando tengo 100 escrituras y escribo:

for (int i = 0 ; i < EEPROM.length() ; i++) {
   EEPROM.write(i, 0);
 }

Tal como me lo dice este código EEPROM CLEAR me contaría también como escritura, o sea ese comando sería para este ejemplo la escritura 101… Y tengo dudas por allí.

tauro0221: Hi, Aqui podrias hacer algo como conectar el voltaje de entrada a un interrupt que cuando la energia de entrada falle te de un interrupt y vayas imediatamente y salves la lectura del nivel en la memoria ya sea como te sugerieron del eprom o una memoria externa. Una cosa importante es de anadirle un condesador a los 5 voltios de la tarjeta para que tengas suficiente energia para guardar la informacion del nivel en la memoria.

Vaya, buena idea, pero aún tengo duditas con la EEPROM por lo mismo que le dije a surbyte en su comentario

Chicos, vais por mal camino. ¿Para que quieres guardar la cantidad si falla la luz? Solo tienes que guardar en el eeprom UNA SOLA vez el peso del recipiente vacio en el eeprom. Y este valor lees en el setup, y luego lo descuentas de las lecturas. Ya esta, no tiene más secreto. Y si el peso del recipiente vacío podría variar, añades un botón para calibrarlo. Es decir, apretando el botón, lees el peso del recipiente y lo guardas en el eeprom.

Hi,
Pregunta: Como vaz a saber que se fue la energia para guardar el nivel? El problema no es guardar la infomacion es saber cuando hay que guardarla.

Yo estoy de acuerdo con ElEspanol porque si lo que se desea es loggear la información, entonces es mas facil usar una memoria SD y no guardar datos en la EEPROM. Como ya lo dije, si quieres guardar datos a otra tasa de registro diferente de la EEPROM del Arduino que esta pensada para almacenar parámetros de configuración y/o esporádicos almacenamientos entonces o usas una EEPROM NVRAM o algo nuevo en tecnología que siempre esta cambiando. Incluso una EEPROM Serial sirve Pero una SD es barata, tiene gran capacidad y puedes hacer lo que gustes con cada dato del ciclo. Si lo quieres guardar los guardas, SI quieres guardar un dato cada 10 segundos lo guardas, entonces te despreocupas si se corta o no la alimentación. De todos modos se puede detectar si se corta o no la alimentación y hacer un almacenamiento especial.

Dejemos al interesado que opine así nosotros dejamos de tirar ideas sin fundamento. Al final y al cabo es ella quien sabe que es lo que desea.

Hola, quería saber como resulto tu programación, ya que mis requerimientos son algo parecidos y agradecería si me pudieses ayudar. Te comento, necesito pesar agua extraída desde un balde con la celda de carga e ingresar la misma cantidad con una bomba.

El programa esta bastante completo. Que duda tienes? Intenta no desviar la idea del autor.

la verdad no soy muy bueno en programación arduino. No sé como hacer que la bomba se comunique con la celda de carga e ingrese la cantidad pesada

La bomba no se comunicará con la celda de carga. El único que puede hacerlo con ambos es Arduino. La celda de carga será leída via un dispositvo amplificador llamado HX711, y este dispositivo será leído por Arduino en forma digital. Mientras tanto tu bomba será puesta en marcha/detenida por un rele u otro elemento.

claro pero mi pregunta es, si con mi celda de carga yo peso 10 (g) con mi bomba puedo programar echar 10 (g) de agua