Pagina's

vrijdag 27 december 2019

het weerstation / windkracht

_______________________________________________________

Het windmolentje

Afbeeldingsresultaat voor anemometer
... of anemometer.
Deze heb ik kant en klaar gekocht voor een paar euro. Het staat al een poos op het dak en geeft mij inzicht in de werking ervan. De waarden kloppen goed met de actuele weersverwachting, dus is redelijk betrouwbaar.
Op een display laat ik de momentele windkracht zien. Verder de gemiddelde windkracht van afgelopen uur en afgelopen dag (etmaal). Verder geeft het de windpieken (maximale windstoot) aan van afgelopen uur en dag.
Verder doe ik niks met de data.

De verwerking van de pulsen is een ander verhaal. Omdat het van oorsprong een reed-contact is, zit daar veel dender op.
Om dit te omzeilen heb ik een erg ingewikkeld programma geschreven, dat één keer per 5 seconden een meting doet. Het bijverschijnsel hiervan is dat ik pieken in de windkracht niet altijd zie, en dat is jammer.
Maar onlangs heb ik in een ander project met een encoder ontdekt, dat die dender misschien op te vangen is door een condensator te plaatsen op de ingang van de processor. Als dit werkt, kan ik de ingang laten uitlezen via een interrupt, waardoor ik een zeer nauwkeurige meting krijg. Maar het belangrijkste hierin is, dat ik harde windstoten niet misloop. Maar dit moet ik nog uitvoeren op de windmeter.

Nu is de windsnelheid via een tabel (van internet KNMI, zie aparte post) rechtstreeks af te leiden van de tijd tussen twee pulsen van de windmolen.

Er is een moeilijke formule beschikbaar om de tijd tussen twee pulsen om te zetten in de windkracht in Beaufort. Maar hier heb ik dit in de tabel geplaatst.

In het arduino-programma ziet dat er zo uit:


int windtabel[] = {777,286,159,104,75,57,45,37,31,26,23,21};
.....
for(B=0; B<=12; B++)
    {
      if(tijd >= tabel[B])
        {
          break;
        }
    }

waarbij <tijd> de tijd is in msec tussen 2 pulsen. Na de break geeft <B> de windsnelheid in beafort.


Contactdender om zeep.

Ik vertelde al dat ik last heb van contactdender. Hierdoor is bijna niet te werken met interrupt, en dat is juist heel mooi, waardoor je zeer nauwkeurige registratie krijgt tot op de miliseconde.
De sugestie voor het plaatsen van een condensator op de ingang van de microcontroler is zo'n gekke nog niet, want het werkt! Zowel in RISING als in FALLING werkt de interrupt prima.

In het arduino-programma ziet dat er zo uit:

const byte reed = 3;
volatile unsigned long contact_tijd = 0;
unsigned long vorig_tijd = 0;

unsigned long tijd = 0;
......
void setup() 
{
     attachInterrupt(digitalPinToInterrupt(reed),contact,FALLING);
     vorig_tijd = millis();
}


void loop()
{
     tijd=contact_tijd - vorig_tijd;
     if(tijd != 0)
        {
           Serial.println(tijd);
           vorig_tijd = contact_tijd;
         }
}

void contact()
{
    contact_tijd = millis();
}

Geen opmerkingen:

Een reactie posten