Una verdadera Estación Meteorológica

jvasquez05: 1. Te agradezco haberme mostrado que en el void setup puedo hacer que se imprima algo como especie de encabezado en las salidas, pues me había estado preguntando como hacer para colocarle por ejemplo las coordenadas geográficas a la estación, ya veo que puedo hacerlo en el void setup. Sin embargo, esto NO resuelve lo que expliqué en el punto 2.1 de mi post anterior, pues me parece que ese fue el objetivo de esa modificación, pero el problema persiste, aunque ya sale una precipitación igual a cero, es la única que sale, sino doy ningún clic al pluviometro no vuelve a aparecer nada después de ella.

Ok. Por eso puse en una función la rutina que imprime para que vieras que puedes ponerla donde gustes. Agrega dicha linea cuando se cumple el ciclo. Justo antes de hacer que la suma se ponga a cero. Bueno, a ver si ahora te interpreto... por dios que duro que estoy!!!

const byte pinPluviometro= 2;       // Definición del pin donde conectarás el Pluviómetro
bool Pluviometro;           // Estado actual del switch del pluviometro
bool PluviometroAnt  = LOW;        // Estado anterior del switch del pluviometro
unsigned int cuentaPrecipitacion= 0;    // Contador de precipitaciones
unsigned int cuentaPrecipitacionAnt=0;  // Valor anterior del contador de precipitaciones 
                    // solo para presentar cuando haya cambios
float Precipitacion = 0.0;          // variable que lleva los mm de agua caídos
unsigned long TREINTAMIN = 30*60*1000;
unsigned long t_LoggeoDatos;

void setup() {

  Serial.begin(9600);
  pinMode(pinPluviometro, INPUT);
  
  Serial.println("Estacion Meteorologica v0.1");
  muestroLluviaCaida(0);
  t_LoggeoDatos= millis();             // Esta es la iniciacion en tiempo para los 30 min. Presicion 1 mseg.  
}

void loop() {
    
    Pluviometro = digitalRead(pinPluviometro);    // Leo el estado del pluviometro

    if (Pluviometro == HIGH && PluviometroAnt == LOW){ // solo voy a considera un cambio 0->1 en el Pluviometro.
      cuentaPrecipitacion += 1;
    }      
    PluviometroAnt = Pluviometro;         // esto actualiza el estado anterior de Pluviometro
     
    if (cuentaPrecipitacion != cuentaPrecipitacionAnt) {
                 
         muestroLluviaCaida(cuentaPrecipitacion);
        cuentaPrecipitacionAnt = cuentaPrecipitacion;
    }
    if (millis()-t_LoggeoDatos > TREINTAMIN){   //Cada vez que millis() - t_LoggeoDatos sea mayor en 1 mseg a TREINTAMIN, se ejecuta la parte de código que calcula la precipitación caída en esos 30 min. 
        t_LoggeoDatos = millis();     //y vuelve a setear t_LoggeoDatos con el valor de millis() para los siguientes 30 min. Y asi por siempre.
        Serial.println("Ciclo 30 min"); // no importa que no sean 30 min
        muestroLluviaCaida(cuentaPrecipitacion);
    }
}

void muestroLluviaCaida(unsigned int cuentamm) {
  
  float mm = cuentamm * 0.4257;// solo para dejar válido el if.

  Serial.print("Lluvia caida = "); //lo presenta en el monitor serial.
    Serial.print(mm);
    Serial.println(" mm");
}
  1. Ahora después de darle un clic al pluviometro comienzan a repetirse los datos en el monitor serial cada milisegundo, es decir, no se hacen los ciclos... /quote] Eso fue porque no copie esta linea
cuentaPrecipitacionAnt = cuentaPrecipitacion;

Como copio y pego tus códigos y los míos, se me entrecruzan cosas que resuelvo en un momento y olvido a la siguiente respuesta.
La solución a esto, ya te la había dado, bastaba con que lo vieras por tu cuenta y sumaras al código.

Agrega cuentaPrecipitacion = 0; luego de cumplido el ciclo

Intenta entender como funciona para poder colaborar un poco mas mutuamente.

PUede ser que este rebotando. Pero el switch cuenta flancos 0 a 1, asi que se tiene que estar dando toda una situación. Prueba con un gotero a ver si en lugar de indicar lo que debe lo hace mal. Si es asi agregaremos un debounce.

Respondo: 1: primero debes saber que millis() es una función que devuelve un valor entero 32bitgs sin signo (unsigned long) que empieza cuando el arduino es alimentado y no para hasta que desborda la cuenta.. pero eso es despues de muchos milisegundos o tantos como 2^32 = 4294967296 que traducido en dias es 49.71 dias o sea bastante. No para de incrementarse de a 1 msg, entonces si en algun momento tu le dices a una variable del mismo tipo que millis() que se cargue con ese valor en ese instante, tendras por ejemplo t_LoggeoDatos = millis() y si millis() vale 23000 mseg entonces t_LoggeoDatos = 23000

ahora para el instante t = 230000 millis()-t_LoggeoDatos = 0 mseg por lo tanto if (millis()-t_LoggeoDatos > 10000) => 0 > 10000 = FALSO

ahora tomemos otro momento t = 240000 en ese momento millis()-t_LoggeoDatos = 240000- 230000 = 10000 > 10000 FALSO

Pero al instante siguente o sea solo 1 mSeg la diferencia será 10001 > 10000 VERDADERO y se repite el ciclo

Esto me hace ver que deberíamos ponerle un >=

Hola, Como están, Porahi mi comentario es super desubicado, Pero quizás les sirva, Yo trabajo, de alguna manera, con estaciones meteorológicas, hace relativamente poco tiempo. Y las estaciones tienen un pluviómetro. El mismo funciona con un cangilómetro, el cual al cargar determinada cantidad de agua cede, y al hacer contacto emite un pulso que es representativo de una determinada cantidad de agua en mm. Así sucesivamente va integrando la cantidad de lluvia recibida, la medición es acumulativa, y solo se reinicia al finalizar el día es decir a las 00:00 horas. Si bien mis conocimientos sobre el sensor y el sistema llegan hasta ahí, podría investigar un poco mas al respecto si le es de utilidad para el proyecto. Nuevamente pido disculpas si mi comentario es menos que poco útil. Cordialmente, Pablo.

Lee de nuevo mi post#45. Millis() es un contador de milisegundos que se incrementa en 1 misegd desde que se arranca el arduino.

Nunca es igual el valor de ese contador al milisegundo anterior.

Que parte de esto no se entiende?

arranca el arduino => millis() = 0 10 mseg despues => millis() = 10 1000 mseg despues => millis() = 1000 mseg 30min despues => millis() = 30*60*1000 mseg = 1800000 mseg 30min 1mseg despues => millis() = 1800001 mseg 10 horas despues => millis() = 10 * 60 60*1000 mseg = 36000000 mseg 10 dias despues => millis() = 10 24 * 60 *60*1000 mseg = 864000000 mseg

nunca es igual. Si asignas una variabla al valor de millis() no será igual 1000 mseg despues Ahora se entiende?

t_loggeoDatos es igual a millis cuando los igualas.

t_LoggeoDatos=millis();

al siguiente mseg ya no son mas iguales.

Para eso te describí al menos 4 instantes.

millis() siempre cambia, se incrementa con cada 1mseg

Crees que le hace falta?

ok. ya lo agrego

  const byte pinPluviometro    =2;                         // Defino donde estará el pin que sensa cada clic del contador de precipitaciones.
  bool Pluviometro;                                        // Se define el pin del pluviometro como booleano para solo considerar los eventos que presentará de HIGH.                                                                                                                     ;
  bool PluviometroAnt      = LOW;                      // Se define el estado anterior del pluviometro como LOW, para siempre que tenga un evento de HIGH regrese a LOW.
  unsigned int cuentaClics;                            // Se define la variable que contará los clic del pluviometro que se multiplicarán por la constante.
  unsigned int cuentaClicsAnt;                             // Valor anterior de cuentaclics.
  float mm;                                            // Se define la presiptación en unidades de mm como un valor float ya que la constante a multiplicar no es un número entero.
  unsigned long tpaRegistro= 10*1000;                  // Esta variable es el tiempo para el registro, significa o se busca que cada este tiempo se produzca un registro en el monitor serial de acuerdo a la setencia a ejecutar en el if de abajo.
  unsigned long contadorTiempo;                        // Defino la variable que cuenta el tiempo.
  long lastDebounceTime = 0;                              // la última vez que el pin cambió 
  long debounceDelay   = 50;                         // tiempo de rebotes. Incrementarlo si la salida sigue rebotando


  void setup() {
      Serial.begin (9600);
      pinMode(pinPluviometro, INPUT);                  // Se define el pin del pluviometro como de entrada.
      Serial.println ("Estacion Meteorologica v0.1");  // Título general para la salida de datos.
      muestroLluviaCaida(0);                           // Con esto inicio la primer dato de los ciclos.
      contadorTiempo = millis();                       // Se define que el contador de tiempo inicie igual a millis.
  }

  void loop() {
      Pluviometro = digitalRead (pinPluviometro);          // Se inicia leyendo el estado del pin del Pluviometro.

        // If the switch changed, due to noise or pressing:
      if (Pluviometro != PluviometroAnt) {
        
        lastDebounceTime = millis();                      // resetea el timer de rebotes
      }

      if ((millis() - lastDebounceTime) > debounceDelay) {  // No importa que se haya leido, seguramente ha pasado el tiempo necesario (debounceDelay) para no considerarlo un rebote
                                                          // entonces es un cambio de estado válido

        if (Pluviometro == HIGH) { // Si el botón esta en HIGH entonces incremento contador
           cuentaClics += 1;
        }
      }
          
      PluviometroAnt = Pluviometro; 
             
      if (millis() - contadorTiempo > tpaRegistro) {   // Es el corazón del código, se supone que si millis es mayor al tiEmpo definido para cada registro en un milisegundo, se ejecuta la cuantificación de precipitación en mm.
        contadorTiempo = millis();                     // y vuelve a setear contadorTiempo con el valor de millis para los siguientes 30 minutos.
         Serial.print ("Ciclo 30 min");                   // imprime el valor en el monitor serial cuanto se cumple el tiempo del ciclo.
         muestroLluviaCaida(cuentaClics);                 // Muestra la lluvia caída de acuerdo a los conteos de clics.
      }

  }
   
   
   
   void muestroLluviaCaida (unsigned int cuentamm){ // Variable que centraliza todos los cálculos de cuantaclics.
     float mm= cuentamm*0.4257; // Un clic del pluviometro representa 0,4257 mm de precipitación.
       
      Serial.print (" Lluvia caida= ");
      Serial.print (mm); // aquí se registran los mm de precipitacion en el monitor serial.
      Serial.println (" mm");
      cuentaClics = 0;
  }

El debounce es de

long debounceDelay  = 50; // 50 milisegundos

ponle 100 a ver si resuelve el problema?

Me sorprende esto. Si esta conectado con resistencia a tierra como en el esquema todo tendria que funcionar bien. Es mas, saca el pluviómetro y conecta un pulsador y pruebalo manualmente y mira el comportamiento.

No.. detente. No puede ser que si presionas largo el programa te cuente doble? Algo esta mal ahi.

Con que programa, el que tiene debounce o el que usabamos antes?

BUeno en este punto vuelvo a pedirte que hagamos el contacto remoto. Te habia mandando un programa para hacerlo. Te lo vuelvo a enviar por Privado. Luego me pasas Id y pass y yo veo lo que tu ves en tu monitor serie y tratamos de arreglarlo.

ahora das asistencia remota surbyte? interesante...

Es que cuando un tema se alarga y no podemos resolverlo prefiero dedicarle 1 hora asi que estar mas tiempo intentando encontrar una solución que tal vez yo no vea. Finalmente lo resolvimos, pero costó.. y hasta que no visualicé porque aparentemente rebotaba la medición del pluviómetro no medía bien. Quedó un programa que debe postear John. solo una pequeña variante (delay(20)) luego de detectar la transición 0 a 1, hizo que las lecturas fueran correctas. Jvasquez quedó satisfecho y yo también.

Creo que es la 3ra o 4ta vez que lo hago.

Podrías poner el enlace donde sigue el siguiente post del piranometro? es que estóy a full con tu proyecto ya que lo veo super interesante y no encuentro donde sigue! Gracias Fenomeno!

sigue acá, pero aún no lo encara.

Gran Post!!, Me lo apunto porque lo tengo que leer con mas calma :)

Salu2

Yo no dejé de colaborar pero jajaja tengo otras cosas por hacer y tu has abierto muchos hilos y te dije que no era conveniente pero bueno cada cual es dueño de hacerlo como quiera. Los otros hilos no los he seguido casi.