Files
nebuleair_pro_4g/windMeter/read_wind_direction.py
Your Name 14044a8856 update
2025-03-12 17:55:30 +01:00

84 lines
2.6 KiB
Python

'''
__ _____ _ _ ____
\ \ / /_ _| \ | | _ \
\ \ /\ / / | || \| | | | |
\ V V / | || |\ | |_| |
\_/\_/ |___|_| \_|____/
Script to read wind speed from a Davis Anémomètre-girouette Vantage Pro (6410)
https://www.shapemaker.io/blog/wind-speed-measurements-with-anemometer-and-a-raspberry-pi
Connexion:
black (wind speed ) -> gpio21
green (wind direction) -> ADS1115 (module I2C)
Yellow -> 5v
RED -> GND
Attention: The Raspberry Pi doesn't have analog inputs, so we need an analog-to-digital converter (ADC) to read the wind direction.
sudo /usr/bin/python3 /var/www/nebuleair_pro_4g/windMeter/read_wind_direction.py
'''
import time
import board
import busio
import adafruit_ads1x15.ads1115 as ADS
from adafruit_ads1x15.analog_in import AnalogIn
# Create the I2C bus and ADC object
i2c = busio.I2C(board.SCL, board.SDA)
ads = ADS.ADS1115(i2c)
# Connect to the channel with your Davis wind vane
wind_dir_sensor = AnalogIn(ads, ADS.P0)
# Check the current voltage range
min_voltage = 9999
max_voltage = -9999
def get_wind_direction():
"""Get wind direction angle from Davis Vantage Pro2 wind vane"""
global min_voltage, max_voltage
# Read voltage from ADS1115
voltage = wind_dir_sensor.voltage
# Update min/max for calibration
if voltage < min_voltage:
min_voltage = voltage
if voltage > max_voltage:
max_voltage = voltage
# We'll use a safer mapping approach
# Assuming the Davis sensor is linear from 0° to 360°
estimated_max = 3.859 # Initial estimate, will refine
# Calculate angle with bounds checking
angle = (voltage / estimated_max) * 360.0
# Ensure angle is in 0-360 range
angle = angle % 360
return voltage, angle
# Main loop
try:
print("Reading wind direction. Press Ctrl+C to exit.")
print("Voltage, Angle, Min Voltage, Max Voltage")
while True:
voltage, angle = get_wind_direction()
print(f"{voltage:.3f}V, {angle:.1f}°, {min_voltage:.3f}V, {max_voltage:.3f}V")
time.sleep(1)
except KeyboardInterrupt:
print("\nProgram stopped")
print(f"Observed voltage range: {min_voltage:.3f}V to {max_voltage:.3f}V")
# Suggest calibration if we have enough data
if max_voltage > min_voltage:
print("\nSuggested calibration for your setup:")
print(f"max_voltage = {max_voltage:.3f}")
print(f"def get_wind_direction():")
print(f" voltage = wind_dir_sensor.voltage")
print(f" angle = (voltage / {max_voltage:.3f}) * 360.0")
print(f" return angle % 360")