Väderstation baserat på Raspberry Pi (10 / 11 steg)
Steg 10: Project update 1 - vindriktning
Det har varit ett tag sedan bildandet av detta instructable och det blev någon förbättring.
Väderstationen körs och inlagda nu både vindhastighet och riktning. Jag kommer nu visa dig hur vindriktningen fungerar. Det är också läsa och uppladdning UV índex.
Det finns ett fåtal projekt runt som använder en inställning av reed växla att få rubriken vind. Jag har alltid trott att det gör en ganska enkel lösning, men numera med digitala kompasser verkar det lämpligare att använda en av dessa små enheter. Också, eftersom mitt mål var att köra alla sensorer på I2C bussen, jag var säker på att jag kunde hitta en som skulle passa i denna typ av buss. Så gjorde jag.
Jag använder en HMC5883L, som är 3 axis digital kompass, använder I2C bussen. Du kan hitta redo lödde moduler på ebay så billigt som 1 euro. Bara Sök och du hittar dem säkert.
En bit av råd med denna sensor. Jag tror att denna typ av sensorer är ganska känslig, eftersom jag lyckats döda en. Efter några dagar att få fel indikationer från det, fick jag en ny en och alla redas ut. Bara vara försiktig, tappa det inte alltför många ofta.
Den andra importante delen som jag använde kallas en slip ring. Vad är en slip ring? Det är en liten enhet som låter dig ha en roterande axel och anslutningar på samma gång. Det finns flera parametrar som definierar sådan anordning. En är antalet sätt (eller ledningar) och andra är märkströmmen accepterade genom ledningarna. Eftersom vi är endast läsning sensor, och i detta fall I2c, vi behöver 4 trådar och nuvarande är så lågt man kan komma.
Jag fick en 6 trσd, låg nuvarande som råkade ha axel diameter samma som det inre måttet på vissa plaströr som jag brukade bygga vane.
Olika bilder visar hur jag lyckades bygga sak. Det är inte snyggt men det dows jobbet.
PROGRAMVARA
Det är en ganska enkel sak att läsa från HCM. Jag tog några ser i databladet, gjort lite forskning på nätet, och jag fick till dessa kodrader att sätta det fungerar:
def write_byte (adress, adr, värde):
Bus.write_byte_data (adress, adr, värde)
-Förfarandet för att skriva data i en specifik adress av I2C bussen.
def median(lst):
lst = sorted(lst)
om len(lst) < 1:
returnera ingen
om len(lst) %2 == 1:
returnera lst [((len (lst) + 1) / 2)-1]
annat:
återgå float(sum(lst[(len(lst)/2)-1:(len(lst)/2)+1])) / 2,0
-Detta är ett förfarande för att få det genomsnittliga antalet en lista över avläsningar. Det kommer att behövas
write_byte (0x1E, 0, 0b01110000) # satt till 8 prover vid 15Hz
write_byte (0x1E, 1, 0b00100000) # 1.3 få LSb / Gauss 1090 (standard)
write_byte (0x1E, 2, 0b00000000) # kontinuerlig provtagning
skala = 0,92
x_offset = 45
y_offset =-82
-Behövs deklarationer för sensorn. De första 3 raderna Ställ in provet avläsningar och vinna. Fjärde anger skalningen. De 2 sista är värden att stämma upp den sensor behandlingen. De kan variera från sensorn till sensorn, men de flesta gånger de påverkar inte mycket läsning.
def get_heading():
x_out = (read_word_2c(0x1E,3) - x_offset) * skala
y_out = (read_word_2c(0x1E,7) - y_offset) * skala
z_out = (read_word_2c(0x1E,5)) * skala
försedda med = math.atan2 (y_out, x_out)
om (med < 0):
försedda med += 2 * math.pi
om ((math.degrees(bearing) + 90) < 360 och (math.degrees(bearing)+90) > 90):
rubrik = math.degrees (uthärda) + 90
# Skriv ut round(heading,0)
Elif math.degrees (uthärda) + 90 == 360:
rubrik = 0
# Skriv ut round(heading,0)
annat:
rubrik = math.degrees (uthärda)-270
# Skriv ut round(heading,0)
returnera rubriken
-Detta är det huvudsakliga behandlingen förfarandet. Det ger dig rubriken Vane i grader från 0 till 359
Så nu när vi har alla deklarationer och procedurer, är det enda saknas förbi infoga nästa nummer i huvudprogrammet:
dir = 0
lista = range(500)
skriva ut ("läsa 500 gånger vindriktning avgränsade med 10mS för utjämning slutliga läsning...")
för dd i intervall (0, 500):
lista [dd] = get_heading()
Time.Sleep(0.01)
riktning = median(lista)
skriva ut ("gjort!")
skriva ut ("vind dir är", riktning)
Jag hittade att göra bara en behandling skulle leda till stora variationer i riktningen, så gör vi här tar 500 mätningar avgränsad med 10mS varje och mata genomsnittet av alla värden. Alla tryckta rader kan tas bort eftersom de tjänar endast för felsökning ändamål.
Glöm inte att uppdatera ladda upp linjen till wunderground, nu har vi mer data, så du måste sätta i windir = håll, i mitt fall.
Cheers, gott folk!