Paso 10: Actualización del proyecto 1 - dirección del viento
Ha sido un tiempo desde la creación de este instructable y cosas consiguieron algunas mejoras.
La estación meteorológica funciona y carga ahora tanto viento velocidad y dirección. Ahora mostraré cómo está trabajando la dirección del viento. También es lectura y carga de índice UV.
Hay algunos proyectos que utilizan una configuración de finales de la caña para obtener el título de viento. Siempre he pensado que lo hace una solución bastante simple, pero en la actualidad con brújulas digitales parece más adecuado utilizar uno de estos pequeños dispositivos. También, puesto que mi objetivo era correr todos los sensores I2C bus, yo estaba seguro de que he podido encontrar uno que encajaría en este tipo de bus. Así lo hice.
Estoy usando un HMC5883L, que es una brújula de 3 ejes, usando I2C bus. Usted puede encontrar módulos soldados listos en ebay tan barato como 1 euro. Sólo búsqueda y usted los encontrará de seguro.
Un pequeño Consejo con este sensor. Creo que este tipo de sensores son muy sensibles, ya que he conseguido matar a uno. Después de unos días de obtener indicaciones mal de él, conseguí un nuevo que uno y todo solucionado. Sólo ten cuidado, no cae demasiado a menudo muchos.
La otra parte importante que se llama un anillo de deslizamiento. ¿Qué es un anillo de deslizamiento? Es un pequeño dispositivo que le permite tener un eje giratorio y conexiones al mismo tiempo. Existen varios parámetros que definen dicho dispositivo. Uno es el número de maneras (o alambres) y otra es la corriente a través de los cables. Desde entonces somos sólo sensor de lectura y en este caso I2c, necesitaremos 4 cables y la corriente es tan baja como usted puede conseguir.
Tengo un cable de 6, bajo actual que pasó a tener el diámetro del eje igual a la medida interior de un tubo plástico que usé para crear la paleta.
Los diversos cuadros muestran cómo logré construir lo. No es bonito pero dows el trabajo.
SOFTWARE
Es una cosa bastante sencilla para leer del HCM. Tomé unos mira en el datasheet, hizo algunas investigaciones en la web, y llegué a estas líneas de código para ponerlo a trabajar:
DEF write_byte (dirección, adr, valor):
Bus.write_byte_data (dirección, adr, valor)
-Procedimiento para escribir datos en una dirección específica del bus I2C.
DEF median(lst):
LST = sorted(lst)
Si len(lst) < 1:
volver a ninguno
Si len(lst) %2 == 1:
volver lst [((len (lst) + 1) / 2)-1]
otra cosa:
float(sum(lst[(len(lst)/2)-1:(len(lst)/2)+1]) de retorno) / 2.0
-Este es un procedimiento para obtener el promedio de una lista de lecturas. Será necesario
write_byte (0x1E, 0, 0b01110000) # Set de 8 muestras a 15Hz
write_byte (0x1E, 1, 0b00100000) # 1.3 ganancia LSb / Gauss 1090 (por defecto)
write_byte (0x1E, 2, 0b00000000) muestreo continuo #
escala = 0,92
X_OFFSET = 45
y_offset =-82
-Declaraciones necesarias para el sensor. Las 3 primeras líneas establecer lecturas de muestra y ganan. El cuarto establece la escala. Los últimos 2 son valores para ajustar la lectura del sensor. Pueden variar desde el sensor a, pero la mayoría de las veces no afectan mucho la lectura.
DEF get_heading():
x_out = (read_word_2c(0x1E,3) - x_offset) * escala
y_out = (read_word_2c(0x1E,7) - y_offset) * escala
z_out = (read_word_2c(0x1E,5)) * escala
teniendo = math.atan2 (y_out, x_out)
Si (teniendo < 0):
teniendo += 2 * math.pi
Si ((math.degrees(bearing) + 90) < 360 y (math.degrees(bearing)+90) > 90):
título = math.degrees (rodamiento) + 90
# impresión round(heading,0)
Elif math.degrees (rodamiento) + 90 == 360:
partida = 0
# impresión round(heading,0)
otra cosa:
título = math.degrees (rodamiento) -270
# impresión round(heading,0)
volver en dirección
-Este es el procedimiento de lectura principal. Le da el título de la paleta en grados de 0 a 359
Así que ahora que tenemos todas las declaraciones y procedimientos, único que faltaba más allá es insertar el siguiente código en el programa principal:
DIR = 0
lista = range(500)
Imprimir ('leer 500 veces vientos separaron por 10mS para el alisado final de la lectura...')
para dd en el rango (0, 500):
lista [dd] = get_heading()
Time.Sleep(0.01)
Dirección = median(lista)
Imprimir ('hecho!')
Imprimir ('viento dir', dirección)
He encontrado que haciendo una lectura daría lugar a enormes variaciones en la dirección, por lo que estamos haciendo es tomar 500 medidas separados por 10 ms cada uno y la salida de la media de todos los valores. Todas las líneas de impresión se pueden borrar ya que sólo sirven para propósitos de depuración.
No te olvides de actualizar la línea de carga de wunderground, ahora tenemos más datos, por lo que tienes que poner en windir = dirección, en mi caso.
Saludos, amigos!