Go Down

Topic: [SOLUCIONADO] Problema con EZO TM class universal flow meter totalizer (Read 298 times) previous topic - next topic

Danicap

Hola a todos,

Estoy trabajando con un EZO TM class universal flow meter totalizer de Atlas Scientific, este

A este juguetito le tengo conectado un sensor de caudal que funciona por pulsos, el de 1/4" de Atlas Scientific.

Lo tenía montado con un PIC18F46k22 y funcionaba perfectamente, periódicamente cada segundo me mandaba los valores de caudal acumulado y caudal instantáneo sin problema por el puerto serie.

El caso es que retomé el proyecto hace un par de días, cuando me llegaron las PCBs ya fabricadas, y he descubierto con horror que no funciona.

Técnicamente se supone que tiene un led arriba a la izquierda que se enciende en verde para el correcto funcionamiento y hace un blink cada vez que envía datos, bien, este led no se enciende (lo que sería un síntoma según el fabricante de que esta en modo sleep). Asumí que en mis ultimas pruebas lo había puesto en modo sleep y no lo desperté (se me hace raro, pero bueno). Según fabricante para despertarlo simplemente hay que mandarle cualquier carácter por serie, lo he intentado pero nada, no "despierta". Así que decidí medir el consumo a ver que estaba pasando, y para mi sorpresa está consumiendo 22mA, lo que indica fabricante para funcionamiento standard.

En la parte de abajo a la derecha cuenta con 5 leds en forma de pentágono, el de arriba se enciende fijo por lo que indica que el sensor de caudal está configurado, si no parpadearía.

Al reiniciar el dispositivo hace la secuencia de encendido perfectamente, el led de arriba a la izquierda hace una serie de blinks (Rojo verde Azul) y se apaga y los leds en forma de pentágono dan una vuelta en sentido horario y otra en anti-horario y se queda fijo el led de arriba.

Ahora lo tengo conectado a un arduíno porque me resulta más facil para hacer las pruebas y ver qué esta pasando. tengo cargado el siguiente código, el de ejemplo de la web vaya con unos pequeñísimos añadidos.
Code: [Select]


//This code has intentionally has been written to be overly lengthy and includes unnecessary steps.
//Many parts of this code can be truncated. This code was written to be easy to understand.
//Code efficiency was not considered. Modify this code as you see fit.    
//This code will output data to the Arduino serial monitor. Type commands into the Arduino serial monitor to control the Flow Meter Totalizer.



#include <SoftwareSerial.h>      //we have to include the SoftwareSerial library, or else we can't use it.  
#define rx 2                     //define what pin rx is going to be.
#define tx 3                     //define what pin tx is going to be.

SoftwareSerial myserial(rx, tx); //define how the soft serial port is going to work.



char flow_data[48];                //we make a 48 byte character array to hold incoming data from the Flow Meter Totalizer.
char computerdata[20];             //we make a 20 byte character array to hold incoming data from a pc/mac/other.
byte received_from_computer=0;     //we need to know how many characters have been received.                                
byte received_from_sensor=0;       //we need to know how many characters have been received.
byte string_received=0;            //used to identify when we have received a string from the Flow Meter Totalizer.


float total_flow=0;                //used to hold a floating point number that is the total volume flow.
float flow_per_time;               //used to hold a floating point number that is the flow rate per X time [hour, min, sec]


char *total;                       //char pointer used in string parsing
char *FPT;                         //char pointer used in string parsing [FPT= flow per time]


void setup(){
     Serial.begin(9600);          //enable the hardware serial port
     myserial.begin(4800);        //enable the software serial port
      }
  
 
 
 void serialEvent(){               //this interrupt will trigger when the data coming from the serial monitor(pc/mac/other) is received.    
           received_from_computer=Serial.readBytesUntil(13,computerdata,20); //we read the data sent from the serial monitor(pc/mac/other) until we see a <CR>. We also count how many characters have been received.      
           computerdata[received_from_computer]=0; //we add a 0 to the spot in the array just after the last character we received. This will stop us from transmitting incorrect data that may have been left in the buffer.
           myserial.print(computerdata);           //we transmit the data received from the serial monitor(pc/mac/other) through the soft serial port to the Flow Meter Totalizer.
           myserial.print('\r');                   //all data sent to the Flow Meter Totalizer must end with a <CR>.  
           Serial.println(computerdata);
          }    
        
 
 
  

void loop(){
    
  if(myserial.available() > 0){        //if we see that the Flow Meter Totalizer has sent a character.
     received_from_sensor=myserial.readBytesUntil(13,flow_data,48); //we read the data sent from Flow Meter Totalizer until we see a <CR>. We also count how many character have been received.  
     flow_data[received_from_sensor]=0;  //we add a 0 to the spot in the array just after the last character we received. This will stop us from transmitting incorrect data that may have been left in the buffer.
    
     if((flow_data[0] >= 48) && (flow_data[0] <=57)){   //if flow_data[0] is a digit and not a letter
        pars_data();
        }
     else
       Serial.println(flow_data);            //if the data from the Flow Meter Totalizer does not start with a number transmit that data to the serial monitor.
       //Serial.println("Estoy aqui");
       }    
  }      
 
  void pars_data(){

        total=strtok(flow_data, ",");           //let's pars the string at each comma.
        FPT=strtok(NULL, ",");                  //let's pars the string at each comma.
        

        Serial.print("total_flow=");           //We now print each value we parsed separately.
        Serial.println(total);                 //this is the total_flow.
    
        Serial.print("FPT=");                  //We now print each value we parsed separately.
        Serial.println(FPT);                   //this is the the flow rate per X time.
    
        Serial.println();                      //this just makes the output easier to read.
        }



//here are some functions you might find useful
//these functions are not enabled

/*

void flowFactoryDefault(){              //factory defaults the Flow Meter Totalizer
  myserial.print("factory\r");}         //send the "factory" command to factory reset the device


void read_info(){                      //get device info
   myserial.print("I\r");}             //send the "I" command to query the information
    

void sleep(){
  myserial.print("sleep\r");}         //send the "sleep" command to put theFlow Meter Totalizer in a low power state  


void flowSetLEDs(byte enabled)       //turn the LEDs on or off
{
  if(enabled)                        //if enabled is > 0
     myserial.print("L,1\r");        //the LED's will turn ON
  else                               //if enabled is 0        
    myserial.print("L,0\r");         //the LED's will turn OFF
}
*/


Técnicamente el baudrate del EZO flow es 9600 pero al cambiarlo a 4800 me llega algo legible:

total_flow=1⸮
FPT=

Me llega una sola vez al reiniciar el sistema y no vuelve a mandar nada mas.

Cuando por consola le mando algún comando no responde...

No sé si alguno habéis trabajado con este dispositivo y sabéis qué puede estar pasando o si es qué se ha dañado y ya no comunica.....

Estoy en contacto con la casa pero la verdad que llevo desde el jueves pasado mandándome mensajes con ellos pero no hemos solucionado nada.

Un saludo y gracias!

Danicap

Al final he podido solucionar el problema. He hecho un barrido en los valores del Baudrate y, sin saber el por qué, el baud rate se había cambiado a 38400 (Estoy seguro de que yo no lo he cambiado a 38400 porque es un valor que jamás he utilizado) y tampoco funcionaba ninguno de los comandos que da el fabricante (todos devolvían *ER) excepto el factory, así que lo he restaurado de fábrica, lo he vuelto a configurar para mi flow meter y ya está de nuevo operativo con el arduíno leyendo y enviando perfectamente los valores.

Ahora la prueba de fuego, vamos a meterlo en la PCB con el PIC :o

Un saludo!

Go Up