From 99326ded7d19b59574fb0027711a668392cf3e6d Mon Sep 17 00:00:00 2001 From: MrDrem <4300216+MrDrem@users.noreply.github.com> Date: Wed, 24 Apr 2024 12:02:08 +0100 Subject: [PATCH] Update weather.py to show 16 wind directions This also resolves the issue with having to tare readings more than once. --- enviro/boards/weather.py | 37 ++++++++++++++----------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/enviro/boards/weather.py b/enviro/boards/weather.py index 9b44e13..3125c1e 100644 --- a/enviro/boards/weather.py +++ b/enviro/boards/weather.py @@ -127,36 +127,27 @@ def wind_speed(sample_time_ms=1000): def wind_direction(): # adc reading voltage to cardinal direction taken from our python - # library - each array index represents a 45 degree step around - # the compass (index 0 == 0, 1 == 45, 2 == 90, etc.) + # library - each array index represents a 22.5 degree step around + # the compass (index 0 == 0, 1 == 22.5, 2 == 45, etc.) # we find the closest matching value in the array and use the index # to determine the heading - ADC_TO_DEGREES = (0.9, 2.0, 3.0, 2.8, 2.5, 1.5, 0.3, 0.6) + ADC_TO_DEGREES = (2.533, 1.308, 1.487, 0.270, 0.300, 0.212, 0.595, 0.408, + 0.926, 0.789, 2.031, 1.932, 3.046, 2.667, 2.859, 2.265) closest_index = -1 - last_index = None + closest_value = float('inf') - # ensure we have two readings that match in a row as otherwise if - # you read during transition between two values it can glitch - # fixes https://github.com/pimoroni/enviro/issues/20 - while True: - value = wind_direction_pin.read_voltage() + value = wind_direction_pin.read_voltage() - closest_index = -1 - closest_value = float('inf') + for i in range(16): + distance = abs(ADC_TO_DEGREES[i] - value) + if distance < closest_value: + closest_value = distance + closest_index = i - for i in range(8): - distance = abs(ADC_TO_DEGREES[i] - value) - if distance < closest_value: - closest_value = distance - closest_index = i - - if last_index == closest_index: - break - - last_index = closest_index - - return closest_index * 45 + voltage = value + resistance = (voltage * 10000) / (3.3 - voltage) + return closest_index * 22.5 def rainfall(seconds_since_last): amount = 0