Windsnelheidsmeter  (WH-SP-WS01)

Ik vond op Marktplaats een anemometer of windsnelheidsmeter voor een bedrag van 5 euro. Ik had de indruk dat de verkoper niet wist wat 'ie ermee moest. Dus direct de vraagprijs geboden en hup, twee dagen later had ik het pakket op de stoep. Eigenlijk wist ik niet goed wat ik gekocht had... 

Het eerste dat ik deed na het ontvangen van de windmeter is het internet op gaan om te kijken wat ik gekocht had. Er blijken nogal verschillende modellen en types te zijn. De prijs van een redelijk goede anemometer begint rond de 40-50 euro. Ik blijk de aller goedkoopste te hebben, van kunststof en het signaal komt van een reedcontact dat gesloten wordt als het magneet, dat aan de draai-as bevestigd is, er langs komt. Eigenlijk is het dus een ‘domme’ schakelaar die in één omwenteling twee keer schakelt.

De uitdaging

Het probleem was een goed python script te bouwen waarmee je binnen een vastgestelde tijd het aantal pulsen telt en dit omrekent naar windsnelheid (m/sec). Op een forum vond ik een basisscript. Deze heb ik verbouwd tot wat het nu is.

Daar gaan we!

Aansluitschema

De anemometer aansluiten is eenvoudig. Je sluit ‘m aan als een drukknop. Een van beide draden wordt op de 3,3V aangesloten, de andere draad loopt naar GPIO21 (= pin 40). Tussen pin 40 en een willekeurige ground (GND) wordt een pull-down weerstand (10kOhm) geplaatst.

Anemometer op de Pi aangesloten met pull-down weerstand

Doet ‘ie het wel?

Omdat de windmeter zo goedkoop was twijfelde ik of de windmeter het wel zou doen. Om ‘m te testen heb ik een pulsteller gebouwd. Als je zeker wil zijn dat je windmeter het doet, open je nano en plak onderstaand script er in.

nano windmeter_test.py

Het script doet niets anders dan op GPIO21 luisteren of er pulsen binnen komen. Je moet de windmeter wel even in beweging zetten om resultaat te hebben.

#!/usr/bin/python

import RPi.GPIO as GPIO
import subprocess as sp
import time

# GPIO21 = pin 40
wind=21

GPIO.setmode(GPIO.BCM)
GPIO.setup(wind, GPIO.IN, pull_up_down=GPIO.PUD_UP)

# Wis scherm
tmp = sp.call('clear',shell=True)

print ("\033[1;32m")
print ("Windsnelheidsmeter test")
print ("=======================")
print ("\nDraai de windmeter\n")
print ("Stop dit programma met CTRL-c\n\033[1;m")
while True:
    input_state = GPIO.input(wind)
    if input_state == False:
        print('De windmeter draait!')
        time.sleep(0.2)

Je start het script met:

python windmeter_test.py

Nu we weten dat de windmeter het doet, kunnen we verder.

Kern van de code

Het belangrijkste doel van de software is dat binnen een vastgestelde tijd het aantal pulsen gemeten wordt dat de anemometer afgeeft. Ik hanteer in deze tutorial een tijdsduur van 10 seconden. Later wordt dit naar 10 minuten omgezet omdat de gemiddelde windsnelheid per 10 minuten wordt bepaald door alle pulsen over tien minuten te tellen en die snelheid te berekenen.

Omrekenen naar moderne waarden

Uiteindelijk wil ik dat het script de afgegeven pulsen omrekent naar km/uur, Beaufort, knopen, enz. Daarna zou je er een grafiek van kunnen maken.

Buienrader geeft voor de windsnelheid een mooie grafiek af

Windsnelheid berekenen

De anemometer produceert 2 pulsen per omwenteling, dus je kunt het aantal volledige rotaties van de sensor tellen door het aantal gedetecteerde inputs (pulsen) te delen door 2. Dit getal kan vervolgens worden gebruikt om de windsnelheid te berekenen:

snelheid = afstand / tijd

Om snelheid te berekenen, moet je de afgelegde afstand in een bepaalde tijd weten. Het meten van tijd is vrij eenvoudig en je kunt het aantal signalen tellen gedurende een vaste tijdsperiode, bijvoorbeeld tien seconden.

De afstand die een van de bekers (= die halve pingpongbal op de windmeter) aflegt, is gelijk aan het aantal rotaties vermenigvuldigd met de afstand rond de rand van de cirkel (omtrek):

snelheid = (rotaties * omtrek) / tijd

De omtrek kan worden berekend als je de straal of de diameter van de cirkel kent.

De straal wordt ook wel de radius genoemd

Je kunt de straal van de cirkel die de anemometer maakt, ontdekken door de afstand van het as-midden tot de rand van een van de cups te meten. Zodra je de straal weet, kan je de omtrek vinden met de formule 2 x pi x straal . Vergeet niet dat een hele rotatie twee signalen genereert, dus u moet het aantal gedetecteerde signalen halveren:

snelheid = ( (pulsen/2) * (2 * pi * straal) ) / tijd

De straal voor de anemometer die in dit project gebruikt wordt is 9,0 cm en dat is de waarde die in de volgende rekencode wordt gebruikt. Vergeet niet deze waarde te wijzigen als jouw anemometer andere afmetingen heeft!

Op basis van deze waarden kun je een script (windsnelheid.py) maken om de windsnelheid te berekenen.

import math      # Om pi (π) te gebruiken in de berekening

diameter_cm = 9.0
interval    = 5
pulsen      = 17

print ("De straal van de anemometer is",diameter_cm,"cm")
print ("Aantal gemeten pulsen",pulsen)
print ("Meettijd",interval,"seconden")

omtrek_cm = (2 * math.pi) * diameter_cm
rotaties = pulsen / 2.0
afstand_cm = omtrek_cm * rotaties
speed = afstand_cm / interval

print ("De windsnelheid is",round(speed,2),"cm/sec")

Het resultaat

Op basis van de ingevoerde waarden heeft het script berekend dat de windsnelheid 96,13 cm/sec is.

Omrekenen naar eenheden

Voor degene die het uiteindelijke script wil voorzien van de standaard waarden die in de meteorologie gebruikt worden, heb ik hieronder de berekeningen voor de variabelen geplaatst. Ik merk dat ik er nog een keer naar moet kijken, want ze lijken niet helemaal nauwkeurig te zijn.

  • Pulsen per seconde = Totaal gemeten pulsen / meettijd (sec)
  • Omwenteling per seconde = pulsen per sec / 2  
  • Meters per seconde = (2 * 3.142) * (0.09 * pulsen per seconde)
  • kmh = meters per seconde * 3.6
  • mph = kmh / 1.609344
  • beaufort = (mph + 6) / 6
  • knopen (knots) = mph * 0.86897624190816

In de definitieve code hieronder heb ik de betreffende eenheden verwerkt.

De code (N24FR_v1.py)

'''
De gemiddelde windsnelheid per 10 minuten wordt bepaald door alle pulsen over tien minuten te tellen en die snelheid te rapporteren.

Windmeter, type N24FR
---------------------
Windmeter heeft een straal van 9 cm
De omtrek is dan: 9cm x PI = 28,27 cm
'''
import RPi.GPIO as GPIO
import datetime
import time

WindCount = 0
Wind_PIN  = 21 # GPIO21 = pin40

GPIO.setmode(GPIO.BCM)
GPIO.setup(Wind_PIN, GPIO.IN)

##################################################################################

def main():
    global WindCount
    interval = 600  # meettijd in seconden

try:
        GPIO.add_event_detect(Wind_PIN, GPIO.RISING, callback=MOTION, bouncetime=1)
        time.sleep(interval)
        print ("\033c")
        print ("\033[1;37;40m") # helderwitte kleur
        print ("Windsnelheidsmeting")
        print ("===================")
        print ("\033[1;373;33m") # helderwitte kleur

        # omrekenen naar eenheden
        pulsen = WindCount/interval
        omwentelingenperseconde = pulsen/2
        metersperseconde = (2 * 3.142) * (0.09 * pulsen)
        kmh = metersperseconde * 3.6
        mph = kmh / 1.609344
        beaufort = (mph + 6) / 6
        knots = mph * 0.86897624190816

        print ("Aantal pulsen in",interval,"seconden : ",WindCount)
        print ("Pulsen per seconde           : ",round(pulsen,2))
        print ("Omwentelingen per seconde    : ",round(omwentelingenperseconde,2))
        print ("Meter per seconde            : ",round(metersperseconde,2))
        print ("Kilometer per uur            : ",round(kmh,2))
        print ("Miles per uur                : ",round(mph,2))
        print ("Beaufort                     : ",round(beaufort,2))
        print ("Knopen (knots)               : ",round(knots,2))
        print ("\n")
    
        GPIO.cleanup()

    except KeyboardInterrupt:
        print("Gestopt!")
        GPIO.cleanup()

##################################################################################

def MOTION(Rain_PIN):
    global WindCount
    WindCount = WindCount + 1

if __name__ == "__main__":
   main()

Het resultaat

Het resultaat is een strakke weergave van de berekeningen van de pulsen die de anemometer heeft afgegeven. In de praktijd wordt er over een periode van zo’n 10 minuten gemeten om de gemiddelde windsnelheid te verkrijgen. Mocht je een andere meetperiode willen instellen, de interval is in het script eenvoudig aan te passen.

Mocht je nog vragen hebben, laat dan een reactie hieronder achter. Veel plezier ermee!

Have A Nice Day!

Geef als eerste een reactie

Laat een reactie achter

Het e-mailadres wordt niet gepubliceerd.


*