Compañeros tengo un problema, lo que pasa es que tengo una balanza electronica conectada a un arduino uno que se encarga de recibir los pesos, lo ue estoy intentando hacer es que una vez que el peso este entre 5.000g y 5.200g la balanza debe imprimir un primer peso, y luego de 2 segundos, si el peso sigue dentro del rango imprimir el segundo peso de lo contrario si pasado los 2 segundos y el peso no esta dentro del rango no imprime el segundo peso, hasta que el peso este nuevamente dentro del rango. ( es como si esperara que estabilizara para confirmar el peso, ya que solo me intereza el segundo peso, que vendria hacer el que ya esta estable)
Una vez que se an imprimido los 2 pesos ya no puede imprimir mas hasta que la balanza regrese a cero.
Estoy haciendo un codigo y funciona bien pero solo con el primer peso, ya que al segundo peso siempre lo imprime igual al primer peso, es deecir estos pesos siempre son iguales aunque la balanza este dando otros valores despues de haber impreso el primer peso.
Adjunto mi codigo para ver si me hechan una mano ya que se me acabaron las ideas
char inChar;
String inString="";
float Peso;
boolean inicio;
boolean verificar;
int conta =0;
void setup()
{
// Abrimos la comunicación serial
Serial.begin(9600);
}
void loop()
{
convertirPeso();
compararPeso();
}
void convertirPeso(){
if(Serial.available()) {
inChar = Serial.read();
if (isDigit(inChar) || inChar == '.' || inChar == '-') {
inString += inChar;
}
if (inChar == '\n') {
Peso = inString.toFloat();
inString = ""; // borramos el String para un nueva entrada
}
}
}
void compararPeso(){
if(Peso <= 0.000){ // Si el peso es 0.000 inicio es verdadero y el contador es Cero nuevamente
inicio = true;
conta = 0;
}
else{
inicio = false;
}
if(inicio == false){ // Si el peso es mayor a cero
if( (Peso >= 5.000) && (Peso <= 5.200)){ //Si el peso esta dentro del rango y el contador es cero
if(conta < 1 ){
verificar = true; //para poder verificar y poder imprimir el segundo peso
Serial.print("Peso1"); //imprimo el primer peso
Serial.println(Peso);
}
else{
verificar = false;
}
}
}
if(verificar==true){
delay(2000); //espero que se estabilize para imprimir el segundo peso
convertirPeso(); //consulto nuevamente el peso
if( (Peso >= 5.000) && (Peso <= 5.200)){ //Si el peso sigue dentro del rango imprime el peso
Serial.print("Peso2 : ");
Serial.println(Peso);
conta++; //Aumento un contador para ya no imprimir nuevamente
inicio=true; //cambia a true para no imprimir nuevamente, hasta que el peso sea 0.000 nuevamente
}
else{
Serial.print(" Este peso esta fuera del rango: "); //Si el peso ya no se encuentra dentro del rango envia un mensaje de aviso
Serial.println(Peso);
}
}
}
He modificado la lógica de tu programa usando una simple máquina de estados y sin usar delay.
El sistema siempre esta leyendo el puerto serie por lo que a cada momento toma valores provenientes del mismo.
Basado en tu rutina de lectura de puerto serie la que supongo funciona bien entonces dime que tal va esta variante.
char inChar;
String inString="";
float Peso;
unsigned long start;
boolean inicio;
boolean verificar;
int conta = 0;
byte estado = 0;
void setup() {
// Abrimos la comunicación serial
Serial.begin(9600);
}
void loop() {
LeerBalanza();
switch (estado) {
case 0: if (Peso > 0) // Si peso es positivo sigo
estado = 1;
break;
case 1:
if (Peso >= 5.0 && Peso <= 5.2) { // Hay lectura de pesada
Serial.print("Peso 1 = "); //imprimo el primer peso
Serial.println(Peso);
estado = 2; // Primer paso okay
start = millis()+2000UL; // para luego comparar los 2000 mseg
}
break;
case 2: if (millis() > start) { // pasaron 2 seg verificar valor
if (Peso >= 5.0 && Peso <= 5.2) { // Hay lectura de pesada
Serial.print("Peso 2 = "); //imprimo el primer peso
Serial.println(Peso);
estado = 3;
}
else {
Serial.print("Este peso esta fuera del rango: "); //Si el peso ya no se encuentra dentro del rango envia un mensaje de aviso
Serial.println(Peso);
}
}
break;
case 3: estado = 0;
break;
}
}
void LeerBalanza(){
if (Serial.available()) {
inChar = Serial.read();
if (isDigit(inChar) || inChar == '.' || inChar == '-') {
inString += inChar;
}
if (inChar == '\n') {
Peso = inString.toFloat();
inString = ""; // borramos el String para un nueva entrada
}
}
}
Mucas gracias por la ayuda compañero pude solucionarlo, aunque solo le aumente una condicion para que despues que imprima el segundo peso no haga nada hasta que el peso no sea cero nuevamente cero.
char inChar;
String inString="";
float Peso;
unsigned long start;
boolean inicio;
boolean verificar = true;
int conta = 0;
byte estado = 0;
void setup() {
// Abrimos la comunicación serial
Serial.begin(9600);
delay(100);
}
void loop() {
LeerBalanza();
switch (estado) {
case 0:
if (Peso > 0 ) // Si peso es positivo sigo
estado = 1;
else{
estado = 0;
verificar = true; //hasta que el peso no sea cero nuevamente, no sigo
}
break;
case 1:
if (Peso >= 5.0 && Peso <= 5.2 && verificar == true) { // Hay lectura de pesada
Serial.print("Peso 1 = "); //imprimo el primer peso
Serial.println(Peso);
estado = 2; // Primer paso okay
start = millis()+2000UL; // para luego comparar los 2000 mseg
}
else{
estado = 0;
}
break;
case 2:
if (millis() > start) { // pasaron 2 seg verificar valor
if (Peso >= 5.0 && Peso <= 5.2) { // Hay lectura de pesada
Serial.print("Peso 2 = "); //imprimo el primer peso
Serial.println(Peso);
estado = 3;
}
else {
Serial.print("Este peso esta fuera del rango: "); //Si el peso ya no se encuentra dentro del rango envia un mensaje de aviso
Serial.println(Peso);
estado = 0;
}
}
break;
case 3:
estado = 0;
verificar = false; //hasta que el peso no sea cero nuevamente, no sigo
break;
}
}
void LeerBalanza(){
if (Serial.available()) {
inChar = Serial.read();
if (isDigit(inChar) || inChar == '.' || inChar == '-') {
inString += inChar;
}
if (inChar == '\n') {
Peso = inString.toFloat();
inString = ""; // borramos el String para un nueva entrada
}
}
}