Paso 5: Programación de Arduino
1. LCD Driver
En primer lugar, busqué una simple y pequeña biblioteca para el LCD, Nokia 5110. Había unas pocas bibliotecas diferentes para este LCD: Adafruit, Sparkfuny Karlsen Henning' s. Entre estas bibliotecas, elegí Henning Karlsen porque necesitaba sólo la visualización de texto simple con un par de tamaños de fuente diferente. Karlsen Henning tiene separado biblioteca de gráficos . Me gustaría agradecer a Henning por su compartir su buen trabajo en la biblioteca. Biblioteca de Henning con 3 tamaños de fuente diferente: SmallFont (texto y número, 6 × 8), MediumNumber (número, 12 × 16) y BigNumber (número solamente, 14 x 24). El único inconveniente de esta biblioteca es que las fuentes medianas y grandes no admiten textos pero solamente números. Sin embargo necesitaría sólo números para mostrar con fuentes más grandes, esta limitación fue no hay problema conmigo.
2. cálculo distancia entre dos puntos
Hay cantidad de sitios web que muestra cómo calcular la distancia entre dos lugares de latitudes y longitudes. Scripts de Movable Type muestra diferentes cálculos de distancia, rodamiento y otras conversiones útiles usando fórmula de Haversine y BlueMM publican la fórmula de Excel para calcular la distancia que es básicamente la misma forma que Haversine.
El cálculo es bastante sencillo pero he encontrado que había un problema: Arduino (Atmega328p) no puede manejar más de 6-7 dígitos decimales que es muy importante en el cálculo trigonométrico para corta distancia.
Página de referencia de Arduino dice "flotadores tienen sólo 6-7 dígitos decimales de precisión. Eso significa que el número total de dígitos, no el número a la derecha del punto decimal. A diferencia de otras plataformas, donde se obtiene mayor precisión utilizando un doble (por ejemplo hasta 15 dígitos), en el Arduino, doble es el mismo tamaño que flotan".
Déjeme darle un ejemplo. Supongamos que partimos de una posición (lat: 40.00, largo: 80) a la posición B (lat: 40.01, largo: 80.00). Es decir, nos trasladamos a 0,01 grados de latitud solamente. Si calculas la distancia utilizando la fórmula de Haversine en su PC, obtendrá unos 1.111,9 m. Sin embargo, el Arduino lo calcula como m 3.110,8. Gran error! Lo más interesante es que incluso si reduce la diferencia de latitud a 0.001 o 0,0001 grados, obtendrá los mismos resultados, m 3.110,8. Así que investigar más exactamente lo que causa este error. Por supuesto sé que el culpable es la limitación de la precisión del flotador como dicho anteriormente. Pero quería saber que parte del cálculo por Arduino provocar este error grande. En la fórmula del Haversine, hay COS, utilizar funciones de pecado y ACOS. Había probado unos diferentes cálculos usando estas funciones y el cálculo de COS y funciones pecado afectan mínimo pero el problema era el ACOS. Si se calcula la fórmula en su PC sólo dentro del soporte ACOS, obtendrá 0.9999999848. ¿Ven mi punto? Decimales por debajo de 6 º en función ACOS es realmente importante para el cálculo de la diferencia angular de pequeña distancia, pero desafortunadamente el Arduino no puede manejar esto. No sólo para distancia pequeña pero aún relativamente larga distancia (digamos más de 1 grado por ejemplo) hay error entre los resultados en el PC y Arduino.
Bien, así que comencé a pensar en cómo evitar el cálculo de la función trigonométrica cuando sobre 6 decimales son importantes. Y encontré una solución! En lugar de calcular la diferencia angular entre dos posiciones y luego calcular la distancia multiplicando el radio de la tierra media, cálculo de una relación de ángulo entre dos posiciones (latitud y longitud por separado) más de 360 grados y divide la circunferencia de la tierra por esta relación. En otras palabras, mantener los números grandes al cálculo. Tipo de flotador de Arduino tiene una limitación en los pequeños lugares decimales, pero puede manejar números relativamente grandes.
Aquí está mi fórmula:
La circunferencia media de la tierra es 2 x 6.371.000 m x π = m 40,030,170
ΔD (lat) = 40,030,170 x ΔΘ (lat) / 360 (suponiendo que ΔΘ es pequeño)
ΔD(Long) = 40,030,170 x ΔΘ(long) x cosΘm / 360 (Θm: significa latitud entre dos posiciones)
Ahora, la distancia es √ [Δd (lat) ^ 2 Δd (largo) ^ 2]
He probado este método por medición de distancia de la casa a mi trabajo y funcionó bien. En primer lugar, tengo las coordenadas de mi casa y mi trabajo y luego calcula la distancia por método de Haversine y mi fórmula que se muestra arriba. Hay alguna diferencia en los resultados pero descartable.
Sketch de Arduino está conectado. La biblioteca LCD puede ser descargada aquí.
Gracias por leer mi Instructable. Espero que este alguien útil.