tiempo.com

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

Conectado _00_

  • Superclula
  • ******
  • 5843
  • 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 Precipitacin a 0 cuando no cae, retorna directamente,
y usa la variable precipitacin globalmente,

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

yo lo dejara as (sin tener ms informacin que el mensaje ledo)

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


(o tambin con     if(Pluviometro!=1)   depende de como trabaje el rel ?)

Desconectado Vigorro...

  • FORERO TRISTE-ALMERIA...
  • La vieja guardia de Meteored
  • Superclula Torndica
  • *****
  • 34011
  • 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
  • Superclula Torndica
  • *******
  • 21071
  • Sexo: Masculino
  • No hay n comor 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 funcin con retorno nunca puede ser void. Si precipitacin es un FLOAT, la funcin 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 precipitacin debe guardar el acumulado. Lo mejor para ello es hacerla esttica e interna a la funcin declarandola de la siguiente manera.

STATIC float Precipitacion;

3) Como apuntan otros foreros, las lneas

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 peridica a la funcin, si no hay vuelco en esa vuelta, resetears a 0 la precipitacin, perdiendo el acumulado. El acumulado slo debe ponerse a 0 en el cambio de da.

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

Espero que esto te ayude
Mstoles (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...

Conectado _00_

  • Superclula
  • ******
  • 5843
  • 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 contara yo, y despus hara la conversin,
lo que medimos es balanceo, el cubicaje ya depende de los ajustes, es el valor que creo habra 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 planteara es la puesta a cero de los contadores, y de los periodos de tiempo,
usara un proceso separado para ello, y tratar toda la recogida de datos juntos,
establecimiento de periodos de tiempo, inicializacin de variables y almacenamiento,

tambin trabajara con matrices, para tener siempre los valores reales obtenidos,
al inicializar condicionalmente se pierde el histrico, 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 precipitacin, el momento en que se ha hecho (la manera ms 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 autmatas programables  ;) )

Desconectado Jose Quinto

  • El verano muere siempre ahogado.
  • Superclula
  • ******
  • 8721
  • Sexo: Masculino
  • Ese pequeo 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 funcin 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 hara as.

float AcumulaPcp(float precipitacion, int pluviometro)
{
     if(pluviometro == 0)
         precipitacion += 0.36;
     
     return precipitacion;
}
Caminante, son tus huellas
el camino y nada ms;
Caminante, no hay camino,
se hace camino al andar.
Al andar se hace el camino,
y al volver la vista atrs
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)         //Funcin para leer la precipitacin
{
   Precipitacion=LecturaPrecipitacion();               //Almacenar el resultado de LecturaPrecipitacion en variable Precipitacion   
estado=3;      //con estado=3 paso a Funcion03
}
void Funcion03(void)   //Funcin para representar la precipitacin
{
   RepresentarPrecipitacion(Precipitacion);   //Llamada a la funcin 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

Conectado _00_

  • Superclula
  • ******
  • 5843
  • 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 funcin?
chequeos de estado dentro de la funcin?
"delays" dentro de una funcin?

lo veo mejorable (y compactable)

(prueba a hacer un diagrama de bloques en papel, y simplifcalo al mximo)  ;)

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

Conectado _00_

  • Superclula
  • ******
  • 5843
  • 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 mnemnico,
ms razn an para hacer un buen diagrama de bloques!

y veo que ya lleva el wathdog integrado

(siempre me ha encantado este tipo de programacin  ;) )

suerte con el proyecto, y ya irs 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 Hmilis
  • **
  • 471
  • Sexo: Masculino
Re: Programacion C++ Pluviometro
« Respuesta #11 en: Mircoles 03 Marzo 2010 11:47:44 am »
si inicializas precipitacin a 0.36, luego puedes incrementarlo con precipitacin++

lo mismo te interesa guardar los datos en un vector, as vas guardando la lectura instantnea 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 Mandrgora - La tormenta

Sant Boi de Llobregat - 69 m.