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í
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
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