''' __ _____ _ _ ____ \ \ / /_ _| \ | | _ \ \ \ /\ / / | || \| | | | | \ 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.py ''' #!/usr/bin/python3 import time import sqlite3 import board import busio import numpy as np import threading import adafruit_ads1x15.ads1115 as ADS from adafruit_ads1x15.analog_in import AnalogIn from gpiozero import Button from datetime import datetime # Constants DB_PATH = "/var/www/nebuleair_pro_4g/sqlite/sensors.db" # Initialize I2C & ADS1115 i2c = busio.I2C(board.SCL, board.SDA) ads = ADS.ADS1115(i2c) channel = AnalogIn(ads, ADS.P0) # Connect to A0 on the ADS1115 # Wind speed sensor setup wind_speed_sensor = Button(21) wind_count = 0 wind_lock = threading.Lock() def spin(): global wind_count with wind_lock: wind_count += 1 def reset_wind(): global wind_count with wind_lock: wind_count = 0 wind_speed_sensor.when_activated = spin # More reliable def calc_speed(spins, interval): return spins * (2.25 / interval) * 1.60934 # Convert MPH to km/h def get_wind_direction(): voltage = channel.voltage return voltage def save_to_database(wind_speed, wind_direction, spin_count): """Save wind data to SQLite database.""" try: conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() cursor.execute("SELECT * FROM timestamp_table LIMIT 1") row = cursor.fetchone() rtc_time_str = row[1] if row else datetime.now().strftime("%Y-%m-%d %H:%M:%S") cursor.execute(''' INSERT INTO data_wind (timestamp, wind_speed, wind_direction) VALUES (?, ?, ?) ''', (rtc_time_str, round(wind_speed, 2), round(wind_direction, 2))) conn.commit() conn.close() print(f"Saved: {rtc_time_str}, {wind_speed:.2f} km/h, {wind_direction:.2f}V, Spins: {spin_count}") except Exception as e: print(f"Database error: {e}") def main(): print("Wind monitoring started...") try: while True: reset_wind() print("Measuring for 60 seconds...") time.sleep(60) wind_speed_kmh = calc_speed(wind_count, 60) wind_direction = get_wind_direction() save_to_database(wind_speed_kmh, wind_direction, wind_count) except KeyboardInterrupt: print("\nMonitoring stopped.") except Exception as e: print(f"Error: {e}") if __name__ == "__main__": main()