Programacion C++ Pluviometro

Desconectado MeteoAlcobendas

  • Nubecilla
  • *
  • 54
  • Sexo: Masculino
  • 2013 Record de masa de hielo del Ártico
Programacion C++ Pluviometro
« 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            

Informando desde Metro Antonio Machado 600/650 msnm
Antigua sede Alcobendas (Madrid)  669 msnm

Desconectado _00_

  • Supercélula
  • ******
  • 6059
  • Sexo: Masculino
  • Motril, costa granaina
Re: Programacion C++ Pluviometro
« Respuesta #1 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é ¿?)

Desconectado Vigorro...

  • FORERO TRISTE-ALMERIA...
  • La vieja guardia de Meteored
  • Supercélula Tornádica
  • *****
  • 34565
  • Sexo: Masculino
  • Garbanzo negro del foro, vivo como una legumbre...
Re: Programacion C++ Pluviometro
« Respuesta #2 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;     
}

Desconectado Cumulonimbus

  • Fideo andalú
  • Supercélula Tornádica
  • *******
  • 21071
  • Sexo: Masculino
  • No hay ná como´r zú pa tené un wen cutih
    • El maravilloso mundo de las tormentas
Re: Programacion C++ Pluviometro
« Respuesta #3 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
Móstoles (Madrid) a 666 metros sobre el nivel del mar.

Dani: David, suenan muchas sirenas.

Fobos: Si, pues no se de qué.

Dani: Tiene que haber habido un accidente grave.

Fobos: ¿Un accidente? Si pues no se como va a haber un accidente estando todo el mundo parado. Habrá explotado un ventilador porque otra cosa...

Desconectado _00_

  • Supercélula
  • ******
  • 6059
  • Sexo: Masculino
  • Motril, costa granaina
Re: Programacion C++ Pluviometro
« Respuesta #4 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  ;) )

Desconectado Jose Quinto

  • El verano muere siempre ahogado.
  • Supercélula
  • ******
  • 8721
  • Sexo: Masculino
  • Ese pequeño y palido punto azul.
Re: Programacion C++ Pluviometro
« Respuesta #5 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;
}
Caminante, son tus huellas
el camino y nada más;
Caminante, no hay camino,
se hace camino al andar.
Al andar se hace el camino,
y al volver la vista atrás
se ve la senda que nunca
se ha de volver a pisar.
Caminante no hay camino
sino estelas en la mar.

Desconectado MeteoAlcobendas

  • Nubecilla
  • *
  • 54
  • Sexo: Masculino
  • 2013 Record de masa de hielo del Ártico
Re: Programacion C++ Pluviometro
« Respuesta #6 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 :)
Informando desde Metro Antonio Machado 600/650 msnm
Antigua sede Alcobendas (Madrid)  669 msnm

Desconectado _00_

  • Supercélula
  • ******
  • 6059
  • Sexo: Masculino
  • Motril, costa granaina
Re: Programacion C++ Pluviometro
« Respuesta #7 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)  ;)

Desconectado MeteoAlcobendas

  • Nubecilla
  • *
  • 54
  • Sexo: Masculino
  • 2013 Record de masa de hielo del Ártico
Re: Programacion C++ Pluviometro
« Respuesta #8 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 :)
Informando desde Metro Antonio Machado 600/650 msnm
Antigua sede Alcobendas (Madrid)  669 msnm

Desconectado _00_

  • Supercélula
  • ******
  • 6059
  • Sexo: Masculino
  • Motril, costa granaina
Re: Programacion C++ Pluviometro
« Respuesta #9 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.

Desconectado MeteoAlcobendas

  • Nubecilla
  • *
  • 54
  • Sexo: Masculino
  • 2013 Record de masa de hielo del Ártico
Re: Programacion C++ Pluviometro
« Respuesta #10 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
Informando desde Metro Antonio Machado 600/650 msnm
Antigua sede Alcobendas (Madrid)  669 msnm

Desconectado Felix

  • Cumulus Húmilis
  • **
  • 471
  • Sexo: Masculino
Re: Programacion C++ Pluviometro
« Respuesta #11 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.
"...que ahora el buen tiempo me da asco
cuando el cielo esta azul no lo puedo ni ver
que se nuble ya el sol, que se ponga a llover,
que caiga pronto otro chubasco."

La Mandrágora - La tormenta

Sant Boi de Llobregat - 69 m.