Foro de Tiempo.com

Foro general de Meteorología => Técnica e instrumentos meteorológicos => Software => Mensaje iniciado por: MeteoAlcobendas en Lunes 01 Marzo 2010 02:24:50 am

Título: Programacion C++ Pluviometro
Publicado por: MeteoAlcobendas en Lunes 01 Marzo 2010 02:24:50 am
Hola a todos,

como ya comente alguna vez estaba haciendo una estacion meteorologica como proyecto para la FP que estoy haciendo y me queda por programar el pluviometro...pero aunque parerzca una tonteria no soy capaz de definir bien las sentencias para que me sume los datos por cada vuelco del balancin.

he escrito algo asi de momento en su correspondiente funcion de lectura en C++:

void Funcion02(void)                              
{
   float Precipitacion;               Pluvio=1;                   
   if(Pluvio==1 && Pluviometro==1)      //El Relé esta abierto en este caso
   {   
   Precipitacion=0.00;      //es que no cae agua
   }
   else if(Pluvio==1 && Pluviometro==0)                {
   Precipitacion=0.36;   //El pluviómetro se balancea y cuenta 0.36 mm    
   }                                 
   return Precipitacion;      //Precipitacion ya tiene un valor y lo devuelvo
}      



                        
El problema es que asi cuando el iman pasa por delante del relé REED solo cuenta un balanceo de cada 2 y no suma el total de agua recibida.

En fin, siuento venir con esta pregunta, pero en esta semana tengo que entregarlo y a ver si le puedo entregar todo.

Muchas gracias            

Título: Re: Programacion C++ Pluviometro
Publicado por: _00_ en Lunes 01 Marzo 2010 02:57:40 am

prueba con Precipitation=Precipitation+0,36

 no inicialices la Precipitación a 0 cuando no cae, retorna directamente,
y usa la variable precipitación globalmente,

en el else if le sobra el "&& Pluviometro==0" es una redundancia (y quizás el valor de reposo sea otro, -1 por ejemplo)

yo lo dejaría así (sin tener más información que el mensaje leído)

float Precipitacion;     
int Funcion02(void)                             
{
   Pluvio=1;                   
   if(Pluvio==1)
   {
    if(Pluviometro==0)
              {
              Precipitacion=Precipitation+0.36;
              } 
   }                                 
return Precipitacion;     
}


(o también con     if(Pluviometro!=1)   depende de como trabaje el relé ¿?)
Título: Re: Programacion C++ Pluviometro
Publicado por: Vigorro... en Lunes 01 Marzo 2010 03:37:13 am
No tiene sentido que pregunteis ¿es Pluvio=1? ya que cada vez que llamais a la funcion definis Pluvio=1, asi que la respuesta a la pregunta es siempre si...

Y no entiendo porque dos variables (aparte de Precipitacion)... ???

Yo escribiria:

float Precipitacion=0;     

int Funcion02(void)                             
{
     if(Pluviometro==0)
     {
          Precipitacion=Precipitation+0.36;
     }                               
return Precipitacion;     
}
Título: Re: Programacion C++ Pluviometro
Publicado por: Cumulonimbus en Lunes 01 Marzo 2010 09:21:33 am
Yo veo dos problemillas en esa funcion:

1) Una función con retorno nunca puede ser void. Si precipitación es un FLOAT, la función debe definirse como FLOAT para que retorne un FLOAT. Si la definimos como INT tampoco vale porque truncará el retorno y siempre devolverá valores enteros). De manera que tenemos que poner esto:

 float Funcion02(void)
 {
     ...

2) La variable precipitación debe guardar el acumulado. Lo mejor para ello es hacerla estática e interna a la función declarandola de la siguiente manera.

STATIC float Precipitacion;

3) Como apuntan otros foreros, las líneas

if(Pluvio==1 && Pluviometro==1)      //El Relé esta abierto en este caso
{  
   Precipitacion=0.00;      //es que no cae agua
}

sobran porque en la llamada periódica a la función, si no hay vuelco en esa vuelta, resetearás a 0 la precipitación, perdiendo el acumulado. El acumulado sólo debe ponerse a 0 en el cambio de día.

if(CambioDia==1)      //Empieza un nuevo dia
{  
   Precipitacion=0.00;
}

Espero que esto te ayude
Título: Re: Programacion C++ Pluviometro
Publicado por: _00_ en Lunes 01 Marzo 2010 10:27:55 am
cierto lo del tipo, estaba pensando en el balanceo, que es lo que contaría yo, y después haría la conversión,
lo que medimos es balanceo, el cubicaje ya depende de los ajustes, es el valor que creo habría que guardar, el realmente fiable,

lo de Pluvio=1,
yo imagino que es el indicador de que el pluvio está activo, supongo que la pone a 1 temporalmente para probar.... por lo que no la he tocado

otro tema que me plantearía es la puesta a cero de los contadores, y de los periodos de tiempo,
usaría un proceso separado para ello, y tratar toda la recogida de datos juntos,
establecimiento de periodos de tiempo, inicialización de variables y almacenamiento,

también trabajaría con matrices, para tener siempre los valores reales obtenidos,
al inicializar condicionalmente se pierde el histórico, cualquier fallo imprevisto puede "descolocar" los datos,

otro detalle que me parece interesante es ponerle un marcador de tiempo en las funciones de recogida de datos, que recoja a la vez que el dato de la precipitación, el momento en que se ha hecho (la manera más exacta es hacerlo en el mismo momento, y asociarlos en matriz)

pero bueno, estos son detalles  ;)

(otro apunte: lo mejor para programar este tipo de aparatos es hacer una estructura repetitiva con "watch-dog", como se hace con los autómatas programables  ;) )
Título: Re: Programacion C++ Pluviometro
Publicado por: Jose Quinto en Lunes 01 Marzo 2010 10:47:14 am
Yo no acabo de entender el funcionamiento, pero si se trata de una función que se lanza cuando se detecta actividad en el pluvio sobran cosas, sino si se lanza cada x tiempo entonces necesitamos la variable de pluviometro.

Yo lo haría así.

float AcumulaPcp(float precipitacion, int pluviometro)
{
     if(pluviometro == 0)
         precipitacion += 0.36;
     
     return precipitacion;
}
Título: Re: Programacion C++ Pluviometro
Publicado por: MeteoAlcobendas en Lunes 01 Marzo 2010 14:40:52 pm
Muchas gracias por todas vuestras respuestas,

en primer lugar deciros a todos que lo de :

void Funcion02(void)

se debe a que no he querido poner aqui todo el chorizo que supone el programa y para resumir cuentas he dejado el inicio de la Funcion02 que esta dentro de la maquina de estados...y dentro de esta es donde declaro una variable Precipitacion de tipo float que a su vez se iguala a una Funcion de tipo float:

Pero mejor os voy a pegar un fragmento delprograma un poco mas grande para que lo entendais mejor, aunque ya me habeis dado algunas ideas validas. :)


void Funcion01(void)                              //Presento pantalla
{
//No os digo el contenido porque no es influyente y os lio      
}
   estado=2;         //estado=2 paso a Funcion02
}
void Funcion02(void)         //Función para leer la precipitación
{
   Precipitacion=LecturaPrecipitacion();               //Almacenar el resultado de LecturaPrecipitacion en variable Precipitacion   
estado=3;      //con estado=3 paso a Funcion03
}
void Funcion03(void)   //Función para representar la precipitación
{
   RepresentarPrecipitacion(Precipitacion);   //Llamada a la función RepresentarPrecipitacion
   __delay_ms(100);                        
   __delay_ms(100);      //Esperamos 0.2seg para una nueva lectura
   estado=2   //con estado=2 paso a Funcion02 y vuelvo a leer de la variable
}
float LecturaPrecipitacion(void)                     // definimos el contenido de la funcion LecturaPrecipitacion
{   

   Pluvio=1;                   
   //if(Pluvio==1 && Pluviometro==1)         //Pluviometro=Relé --> Pluvio= bit estatico*********El Relé permanece abierto en este caso
   {   
   Precipitacion=0.36;   //es que no cae agua
   }                                 
   return Precipitacion;            //Precipitacion lo devuelvo a la Funcion02
}
void RepresentarPrecipitacion(float Precipitacion)                  //Represento el valor de Precipitacion, aqui no os digo porque esta bien  y os liaria mas
{
}


Bien...como veis os he quitado contenido para no liaros mas, aun asi falta la declaracion de cada variable y definicion de patillajes y de funciones...pero es un chorizo innecesario y que os liaria como bien os digo. Aqui solo he dejado lo que creo que puede influir un poco mas para que os hagais una idea de como esta montado el programa principal. La representacion igual, esta requetebien hecha  ;D

El problema es como hacer que permanezca e incremente el resultado durante al menos un tiempo, luego aunque sea a los 10 mins hare un clr  y vuelta a empezar o loo que sea...porque la EEPROM que presento es la del micro y es de 8Kb.

Me habeis dado alguna idea, pero a ver si podeis verlo mejor asi.

Gracias :)
Título: Re: Programacion C++ Pluviometro
Publicado por: _00_ en Lunes 01 Marzo 2010 17:00:38 pm
 :-\

a mi no me gusta nada como lo tienes planteado,

¿cambios de estado dentro de la misma función?
¿chequeos de estado dentro de la función?
¿"delays" dentro de una función?

lo veo mejorable (y compactable)

(prueba a hacer un diagrama de bloques en papel, y simplifícalo al máximo)  ;)
Título: Re: Programacion C++ Pluviometro
Publicado por: MeteoAlcobendas en Lunes 01 Marzo 2010 22:45:08 pm
No es el programa definitivo, de aqui hare un a libreria ya que el display no sera el mismo y esto foprmara parte de una estacion meteorologica con mas sensores y dispositivos...las funciones van dentro de un bucle switch...de momento con el resto de programas que he hecho no me ha dado mayores problemas, lo unico que tengo que tener cuidado con el numero maximo de anidamientos admitidos por el micro PIC16F877 que es de 8 anidamientos en el mismo programa.

No me permite subir el archivo.C...asi que a ver si asi lo entendeis asi mas o menos bien...

De todos modos muchas gracias :)
Título: Re: Programacion C++ Pluviometro
Publicado por: _00_ en Martes 02 Marzo 2010 00:44:19 am
vale  ;D
lo programas en mnemónico,
¡más razón aún para hacer un buen diagrama de bloques!

y veo que ya lleva el wathdog integrado

(siempre me ha encantado este tipo de programación  ;) )

suerte con el proyecto, y ya irás contando.
Título: Re: Programacion C++ Pluviometro
Publicado por: MeteoAlcobendas en Martes 02 Marzo 2010 22:58:35 pm
Gracias, me quedo con vuestras ideas y a ver que puedo hacer, aunque si a alguno se le ocurre algo nuevo bienvenido sea. Al final me han ampliado el plazo de presentacion del proyecto hasta el Martes...mas estress durante mas dias, pero mas tiempo para hacer las cosas bien.

En cuanto al resto del proyecto ya dejare algun reportaje en algun sitio para quien le interese verlo...esta vez llevare la estacion con entre 5 y 7 sensores...la proxima vez seran los 7 sensores mas algunas sorpresitas mas ;D

Saludos
Título: Re: Programacion C++ Pluviometro
Publicado por: Felix en Miércoles 03 Marzo 2010 11:47:44 am
si inicializas precipitación a 0.36, luego puedes incrementarlo con precipitación++

lo mismo te interesa guardar los datos en un vector, así vas guardando la lectura instantánea y puedes sacar una suma de todo.
Título: Re: Programacion C++ Pluviometro
Publicado por: Cumulonimbus en Miércoles 03 Marzo 2010 15:59:01 pm
si inicializas precipitación a 0.36, luego puedes incrementarlo con precipitación++

La instrucción ++ incrementa en una unidad.
Título: Re: Programacion C++ Pluviometro
Publicado por: Felix en Miércoles 03 Marzo 2010 17:57:40 pm
ah vaya! crei que se incrementaba en la misma cantidad que estaba inicializada la variable.