Como mandar 3 señales distintas a 100 gramos, a 200 gramos y a 300 gramos, consecutivamente en una celula de carga

Hola a todos los del foro de arduino
Resulta que he conseguido hacer el codigo para una celula de carga que pese los envases a un peso determinado. El codigo lo tengo comprobado en un arduino UNO y salida a rele para luego llevarlo a un Automata. Coloco el envase en la bascula, realiza el taraje , se llena el envase y a un peso deternimado da una señal a rele para el corte de liquido, o lo que sea. La primera pesada si que la hace bien, pero para la segunda pesada( a 200 gramos) no la hace y menos la tercera pesada(300 gramos). He utilizado la misma variable peso y he utilizado salidas distintas a reles distintos.
Lo que quiero es llenar un envase con tres liquidos distintos. He probado con el if ....else y se queda bloqueado en el primer pesaje de 100 gramos y con el switch case no lo consigo porque segun he visto en tutoriales, tienen que ser valores exactos.
Mi codigo es el siguiente

#include <HX711_ADC.h>
#include <LiquidCrystal_I2C.h>

//HX711 constructor (dout pin, sck pin)
HX711_ADC LoadCell(3, 2);
LiquidCrystal_I2C lcd(0x27,16,2);  //

float peso = 0; //Peso de referencia
float peso1 = 0; //Siguiente peso de referencia
//float peso2 = 0;
int rele = 9; //Señal hacia rele
int rele1=11;//Señal hacia rele1
//int rele2=12;
int tar = 5; //Señal de taraje
long t;

void setup() {
  // Inicializar el LCD
  lcd.init();
  
  //Encender la luz de fondo.
  lcd.backlight();
  
  pinMode(rele, OUTPUT); //Salida rele
  pinMode(rele1, OUTPUT);//Salida rele1
 // pinMode(rele2, OUTPUT);//Salida rele2
  pinMode(tar, OUTPUT);//Salida taraje
  Serial.begin(9600);
  Serial.println("Espere");
  lcd.print("Tarando");
  LoadCell.begin();
  long stabilisingtime = 2000; // 2 segundos para que le de tiempo a la balanza para ponerse a punto
  LoadCell.start(stabilisingtime);
  LoadCell.setCalFactor(732.00); // Utilizar un factor de calibracion
  lcd.clear();
  Serial.println("Startup + tare is complete");
  lcd.print("Listo");
   }
void loop() {
  //update() should be called at least as often as HX711 sample rate; >10Hz@10SPS, >80Hz@80SPS
  LoadCell.update();
  peso = LoadCell.getData();
  //Conseguir un valor cada segundo de la celula de carga
  if (millis() > t + 1000) {
    float i = LoadCell.getData();
    lcd.clear();
    Serial.print("peso: ");
    Serial.println(i);
    lcd.setCursor(0, 0);
  lcd.print("PESO");
    lcd.setCursor(8, 0);
    lcd.print(i);
    t = millis();
  }
  //programa para tarar
  if ( digitalRead(10)==HIGH ){
    float i;
   LoadCell.tareNoDelay();
     }
  //Comprobacion de taraje
  if (LoadCell.getTareStatus() == true) {
    digitalWrite(tar, LOW);
    Serial.println("Tare complete");
    lcd.setCursor(0, 1);
    lcd.print("Tara Completa");
    delay(1500);
    }
  else 
    digitalWrite(tar, HIGH);
  
  if (peso <= 100.00) //Señal a los 100 gramos
  digitalWrite(rele, HIGH);//Activar la salida rele
  else   
  digitalWrite(rele, LOW);

 if (peso > 100.0) //Cuando sea mayor de 100 gramos.
  { peso=peso1; //El peso se iguala a peso1
  }
  else 
 //Serial.println("No ha pasado");

  if ( peso1 >= 200.0 )//Cuando sea mayor de 200 gramos.
    digitalWrite(rele1, HIGH); //Activar la salida rele1
    else 
    digitalWrite(rele, LOW);
  }escribe o pega el código aquí

Y la foto del montaje es esta:

El segundo y tercer pesaje me gustaria que fueran al rele1 y rele2, respectivamente
Me podeis ayudar porque no se me ocurre nada
Un saludo a todos

Publicaste un código incompleto, no tiene tercer peso y rele2.
Pero, en principio, ya está claro cuál es el problema: en la segunda condición

comparas 200gramos con el peso1 - variable que nunca antes se había leído ni asignado en ningún lado.

además de esto, todavía hay muchos errores en el código.

Te faltan criterios para estructurar debidamente tu código además de varios fallos y falta de comentarios como asi también que ese código asi no compila porque peso1 vale 0 y luego la asignas sin actualizar su valor.

No has explicado cual es el criterio por el cual se pasa de 100 a 200 o 300 gramos.
Deberías entonces primero explicar eso.
Luego separar en tu código situaciones.
Ejemplo si se permite volver a tarar el sistema debe ser independiente de otras cosas.
No uses número de pines para hacer cosas porque solo tu lo entenderás como el caso del pin 10 para tarar o mejor dicho re tarar la balanza.

Espero tu respuesta respecto a la secuencia de pesos.

Esto debería mostrar mejor las respuetas para distintos pesos. Eliminé peso1 que simplemente lo usaste al revés.

  if (peso <= 100.0) {
      digitalWrite(rele, HIGH);//Activar la salida rele
      Serial.println("Peso < 100gr");
  }
  else  if (peso > 100.0 && peso < 200.0) {
            Serial.println("Peso > 100gr y < 200gr");
        }
  else  if (peso > 200.0 && peso < 300.0) {
            Serial.println("Peso > 200gr > 300gr");
            digitalWrite(rele1, HIGH); //Activar la salida rele1
        } 
  else if (peso >= 300.0)
          Serial.println("Peso > 300gr");

Falta que agregues los reles que te sirven para cada caso.

Buenas noches a todos:
He probado el codigo que has escrito Surbyte y solo se me activa el segundo pesaje(rele1). El primer pesaje(rele) no se me activa y el ultimo(rele2) tampoco.
Si, en el primer pesaje

if (peso < 100.00)

lo cambio por el signo mayor, se me activa primero, el primer pesaje(rele) y los demas (rele1) y (rele2) se quedan sin activarse. Igual no lo he entendido bien.
El codigo que he cambiado es este:

if (peso < 100.00) //Señal a los 100 gramos
  {digitalWrite(rele, HIGH);//Activar la salida rele
  Serial.println("peso < 100.0");
  }
     else if (peso > 100.0 && peso < 200.0) //Cuando sea mayor de 100 gramos y menor de 200gr.
   Serial.println("peso > 200gr y < 200gr"); 
       
      else if ( peso > 200.0 && peso < 300.0)
  {Serial.println("peso > 200gr y < 300gr");
    digitalWrite(rele1, HIGH); //Activar la salida rele1
  }
    else if (peso > 300.0); 
    {Serial.println("peso > 300gr "); 
    digitalWrite(rele2, HIGH);//Activar la salida rele2
  }

A ver que os parece.
Aqui he activado el rele2 para hacer la prueba con los tres pesajes, igual deberia hacerlo solo con dos pesajes y luego con los tres, como has comentado otras veces.
Segun me comentas, lo de explicar el criterio y separar situaciones no he llegado a entenderlo, supongo que es el codigo que has puesto en la solucion, y la forma de hacer el taraje con el pin 10, no se me ocurria de otra forma.
Si no lo entendeis os mando el codigo entero
Espero vuestros mensajes
Un saludo

No puse mucho cuidado en los reles y creo habértelo dicho, para eso estan los carteles para que completes en cada condición lo que debe accionar y lo que no debe accionar.

Como se accionan los relés 1 y 2 tu sabes para cada situacion
< 100 Acivas Rele y Rele1 desactivado.

100 y < 200 tampoco se que debes hacer aqui.
200 y < 300 Activas Rele1 y rele no lo se
300 No se que debes hacer porque a esta situación no llegaste

Voy a probar con esto que me has dicho, a ver si sé ponerlo en marcha.
Lo de los reles:rele, rele1,rele2 los quiero utilizar para mandar una señal al automata para que desconecte las valvulas que cierran los depositos de los liquidos.
Ya te cuento.

Comprendes que el programa debería discriminarte los 4 posibles pesos,
menor a 100
entre 100 y 200
entre 200 y 300
mayor a 300
Con eso decides como usar los reles, ya te lo puse en otro post (#3) pero como las cosas tardan en entenderse cuando caes en este mundo y haces tus primeros pasos, lo vuelvo a repetir porque ahora tendrás una mejor visión de la situación.

Por fin, ya he podido realizar las señales a los reles, en 100gr que dé señal a rele, en 200gr señal a rele1 y 300gr señal a rele2. El unico inconveniente es que la caida de material no puede ir muy deprisa porque no da tiempo a pasar por el intervalo que he puesto y que detecte. Y no puedo poner un intervalo grande porque cuando quito el peso, empieza a dismunuir los valores y vuelven a dar señal los valores de rele, rele1 y rele2.
Este es el codigo que he conseguido.

//Señales a reles: 100gr ===>rele; 200gr ==>rele1; 300gr ==> 300gr
  if (peso >= 100.00 && peso<105.0) //Cuando sea mayor de 100 gramos y menor de 105gr.
  {digitalWrite(rele, HIGH);//Activar la salida rele
    delay(1000);
   }
  if (peso >= 102.0 && peso<107) //Cuando sea mayor de 102 gramos y menor de 107gr.
  { digitalWrite(rele, LOW);//Desactivar la salida rele
   }
   if ( peso >= 200.0 && peso<205.0)
  { digitalWrite(rele1, HIGH); //Activar la salida rele1
  delay(1000);
  }
   if (peso >= 202.0 && peso<207) //Cuando sea mayor de 202 gramos y menor de 307gr.
  { digitalWrite(rele1, LOW);//Desactivar la salida rele1
  }
    if (peso >= 300.0 &&peso<305.0)
    {digitalWrite(rele2, HIGH);//Activar la salida rele2
    delay(1000);
  }
if (peso >= 302.0 && peso<309.0) //Cuando sea mayor de 302 gramos y menor de 309gr.
  { digitalWrite(rele2, LOW);//Desactivar la salida rele2
     }

No sé si se puede mejorar, se aceptan criticas.
Muchisimas gracias por la ayuda
Un saludo

Ahora caigo en la idea. Llenar un envase con 3 liquidos. Uno debe llegar a 100 otro a 200 y el ultimo a 300 gr.

Que pasa cuando llenas el envase con el primer liquido? porque 1 seg de pausa y no 2 o 10 o 1 min?

Si tomamos como ejemplo un peso de 103gr., el relé se activará durante 1 segundo.
Pero si tomamos 101gr., relé se quedará activado?

Nooo porque lo que yo entiendo y que no explica del todo, es que el 2do liquido empieza a ingresar, lo que no dice (y que yo interpreto asi) es que se da 1 segundo para estabilizar la lectura.

Si Surbyte, ese segundo es para que el peso se estabilice como dices, porque la balanza va un poco lenta.
Mi idea es, que nada mas dar la señal de rele se la mando al automata y el automata dará la señal a la valvula del primer liquido que se cierre y la abrirá la valvula del segundo liquido, entonces seguira este liquido hasta la señal rele1 y lo mismo con la señal rele2
Tambien como la bascula va despacio, cuando quitas el peso disminuye despacio y pasa por los intervalos, y alguno se enciende y se apaga, por lo que trato que el intervalo sea pequeño.
Antes la balanza iba mas rapido ahora va mas lento, ¿Sabeis porque puede ser?
Un saludo y muchas gracias por todas vuestras sugerencias

Te vuelvo a consultar algo que es relevante para evitar esas pausas de 1000 mseg y hacerlas mas inteligentes si se puede.
Tal vez no puedas responder esto sin una prueba pero si accionas la valvula x mseg y la apagas inmediatamente cuanto carga en gramos?
Porque una aproximación a 98 gramos (x ejemplo) debería hacer que se tome una acción a menos que una tolerancia sea justamente permitida.

Si, lo que quiero, es: cuando llega a 100gr , es dar una señal de un segundo al automata y que se apague la señal y así con todos . Lo que dices tienes razon, no puedo poner en marcha, porque el montaje del automata no lo tengo hecho. Cuando haga el montaje os mandaré los resultados a ver como ha ido. Y todas estas sugerencias me vendran bien para cuando haga el montaje.
Un saludo

Yo no he hablado del autómata porque ese es otro problema.
Porque no pruebas esto. No dejes que llegue a 100 gr, indica al sistema que corte en 99gr. Desde el momento en que lo solicitas y se corta la valvula estoy seguro que algo extra seguirá fluyendo.
Ajustar de este modo te permitirá tener valores mas precisos con un 100 o 101 final y lo mismo para los demás casos, dependiendo claramente de la viscosidad del líquido.

Bien pensado ese detalle, asi se aproximaran todos a los pesos exactos, no habia pensado en ese detalle. Lo probare y te cuento.
Un saludo y muchas gracias

La verdad, que ha sido muy acertado, porque con el ajuste anterior se ma iban por lo menos 20 gramos o mas , ahora con este ajuste solo se me van 1 ó dos gramos, como mucho. El intervalo lo he puesto entre 195 y 200 gramos y se me iba lo comentado.
Muchas gracias por la ayuda que me habeis prestado
Y un saludo

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.