update
This commit is contained in:
108
windMeter/read.py
Normal file
108
windMeter/read.py
Normal file
@@ -0,0 +1,108 @@
|
||||
'''
|
||||
__ _____ _ _ ____
|
||||
\ \ / /_ _| \ | | _ \
|
||||
\ \ /\ / / | || \| | | | |
|
||||
\ 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()
|
||||
Reference in New Issue
Block a user