84 lines
2.6 KiB
Python
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") |