Tabla de contenido:

Pantalla de tiempo y clima Arduino 3 en 1: 11 pasos
Pantalla de tiempo y clima Arduino 3 en 1: 11 pasos

Video: Pantalla de tiempo y clima Arduino 3 en 1: 11 pasos

Video: Pantalla de tiempo y clima Arduino 3 en 1: 11 pasos
Video: Sensor DHT11 - Medir Temperatura y humedad relativa - Arduino 2024, Noviembre
Anonim

Por Boomer48 Siga más por el autor:

Usando el ATtiny85
Usando el ATtiny85
Usando el ATtiny85
Usando el ATtiny85
Herramienta Pi Powered Pie Partitioning y Poda de polígonos
Herramienta Pi Powered Pie Partitioning y Poda de polígonos
Herramienta Pi Powered Pie Partitioning y Poda de polígonos
Herramienta Pi Powered Pie Partitioning y Poda de polígonos
Controles digitales para un amplificador de audio manual
Controles digitales para un amplificador de audio manual
Controles digitales para un amplificador de audio manual
Controles digitales para un amplificador de audio manual

Me gustan los microcontroladores PIC y me gusta programar en lenguaje ensamblador. De hecho, en los últimos años, publiqué alrededor de 40 proyectos en mi sitio web basados en esa combinación. Recientemente, estaba ordenando algunas piezas a uno de mis proveedores estadounidenses favoritos y vi un Arduino Nano, con un cable de programación, por solo $ 1.20 más que un chip de procesador ATMEGA328 desnudo. Así que compré un par de ellos. Luego descargué el IDE de Arduino y desempolví mi memoria de programación en "C ++".

Este proyecto es una combinación de un reloj que utiliza GPS para cronometrar y un receptor de RF que decodifica los mensajes meteorológicos de un sensor AcuRite común. El resultado es una pantalla de temperatura y tiempo a pequeña escala. El reloj GPS y las rutinas meteorológicas se configuran como archivos de inclusión separados, por lo que es fácil pasar a la rutina principal y configurarla para que haga solo la función de reloj o solo la función de clima. Simplemente descomente el “#define” apropiado en la parte superior de la rutina principal si solo desea una de las funciones.

Si se utilizan ambas funciones, la línea superior de la pantalla LCD muestra la hora local y la línea inferior de la pantalla LCD muestra la humedad y la temperatura en grados Celsius y Fahrenheit. Si solo se utiliza la función de reloj, la línea superior muestra la hora local y la línea inferior muestra UTC. Si solo se utiliza la función meteorológica, la línea superior muestra el primer sensor recibido y la línea inferior muestra cualquier otro sensor recibido. Agregué esa capacidad porque tengo dos sensores meteorológicos.

Paso 1: Sensor meteorológico

Sensor meteorológico
Sensor meteorológico
Sensor meteorológico
Sensor meteorológico
Sensor meteorológico
Sensor meteorológico

El sensor meteorológico AcuRite utilizado aquí envía información de temperatura y humedad cada 16 segundos. En la parte posterior muestra el número de modelo 000592TXR, pero normalmente se anuncia como modelo 06002M. Este sensor es utilizado por muchos modelos diferentes de estaciones meteorológicas, por lo que es fácil de encontrar y pude conseguirlos en eBay por menos de $ 20. AcuRite vende sensores de apariencia similar para algunas de sus estaciones meteorológicas, pero pueden o no adherirse al mismo protocolo de comunicación. Hay alguna indicación en la web de que el sensor de solo temperatura 00606 usa el mismo formato de mensaje pero con un byte de humedad no válido.

Como se ve en la primera forma de onda que se muestra arriba, los mensajes meteorológicos se envían en ráfagas con un intervalo de 2 ms entre mensajes sucesivos. La segunda forma de onda que se muestra arriba expande parte de un mensaje para ver las duraciones y patrones de bits. Hay cuatro bits de sincronización que tienen aproximadamente 600us de altura seguidos de 600us de baja. Los bits de datos están representados por 400us alto seguido de 200us bajo (1) o 200us alto seguido de 400us bajo (0).

El formato del mensaje consta de 7 bytes de datos. Los primeros dos bytes son el ID del sensor y estos no cambian (es decir, no usa un código variable). El último byte es una suma de comprobación aditiva simple de los primeros seis bytes. El tercer byte es un indicador de nivel de batería y siempre debe ser 44 hexadecimales si la batería es buena. El cuarto byte es la humedad y es un valor sin escala entre 0 y 99. Es importante tener en cuenta que el bit más significativo de los bytes 4, 5 y 6 es un bit de paridad y no forma parte de la medición. valores. Los bytes 5 y 6 son la temperatura escalada (Celsius) con los 4 bits inferiores del byte 5 concatenados con los 7 bits inferiores del byte 6 para formar un valor de 11 bits. La temperatura siempre se representa como un número positivo y solo se vuelve negativa cuando se aplica la escala. La escala es (C / 10) - 100. La división por 10 es necesaria porque la resolución de la temperatura está en décimas de grado. La resta es necesaria porque el sensor suma 100 para mantener positivo el valor transmitido.

Paso 2: receptor de RF

Receptor de RF
Receptor de RF
Receptor de RF
Receptor de RF

El módulo de RF que utilizo para este proyecto es el RXB6. Es un receptor superheterodino a diferencia de los receptores superregenerativos menos deseables. Si observa los módulos de RF baratos que existen, encontrará que las placas de transmisor y receptor a menudo se agrupan juntas. La mayoría de los receptores agrupados son tipos súper regenerativos, por lo que tienden a tener características de rendimiento mucho más bajas (incluido el rango) que los receptores súper heterodinos. Solo necesitamos el módulo receptor para este proyecto porque recibiremos señales de un transmisor de sensor meteorológico.

Paso 3: Antenas de RF

Antenas RF
Antenas RF

El RXB6 no viene con antena. Puede comprar algunas helicoidales a un precio bastante económico, pero también es fácil hacer su propia antena. De hecho, un cable de puente de placa de pruebas se puede deslizar en el pin de la antena del módulo si no quiere ser demasiado elegante. Idealmente, una antena de cable recto tendría 1/4 de longitud de onda, lo que equivale aproximadamente a 6,8 pulgadas. Inicialmente hice lo del cable de puente y no tuve problemas para levantar mi sensor exterior a pesar de que mi taller de electrónica está en mi sótano.

Otra posibilidad es hacer tu propia antena helicoidal. Hay una variedad de planes para eso en la web, pero el que se muestra en la imagen de arriba es lo que hice. Utilicé un cable de núcleo sólido de un trozo de cable Ethernet y lo enrolle alrededor del vástago liso de una broca de 5/32 pulgadas. Deje el aislamiento puesto a excepción de la punta que se suelda a la placa de RF. Necesitarás 20 turnos. También puede usar una broca de 7/32 pulgadas y enrollar 17 vueltas en su lugar. Cualquiera de estos probablemente funcionará bien para los rangos que probablemente tenga para sus sensores. La verdadera clave es tener un buen receptor de RF para empezar. Los sensores AcuRite también tienen transmisores bastante potentes.

Paso 4: Protocolo de comunicación RF

Existen algunas técnicas de modulación diferentes para transmitir datos, pero estos sensores utilizan la más simple, que es OOK (codificación de encendido y apagado) o ASK (modulación por desplazamiento de amplitud). Dado que estamos tratando con bits de datos 0/1 en este ejemplo, la amplitud está completamente activada o desactivada. Entonces, para nuestros propósitos, OOK y ASK son lo mismo porque OOK significa que la portadora de RF está completamente encendida o completamente apagada. El formato del mensaje generalmente lo define el fabricante del dispositivo de transmisión y pueden usar prácticamente cualquier velocidad de transmisión, cualquier estilo de formato de bits y cualquier longitud de mensaje. La banda de 433 MHz está repleta de transmisiones para cosas como medidores inteligentes, etc., por lo que el software debe sintonizarse para filtrar solo el formato de mensaje que queremos usar.

Paso 5: Datos de tiempo

Datos de tiempo
Datos de tiempo

Utilizo una unidad GPS barata para obtener datos de tiempo precisos que se reiniciarán automáticamente después de un corte de energía. Tengo varias unidades GPS (sin pantallas) que emiten las sentencias NMEA estándar, pero la más pequeña y barata de las unidades que tengo es la NEO-6M. El módulo NEO-6M es fácil de conectar con Arduino porque utiliza un puerto serie de nivel TTL. La única diferencia real es que el estándar NMEA especifica una velocidad en baudios en serie de 4800, pero el NEO-6M por defecto es de 9600 baudios. Puede ejecutar el programa gratuito "u-center" para cambiar la velocidad en baudios, pero lo dejé con los valores predeterminados de fábrica. También hay un programa de utilidad gratuito llamado GPSInfo (publicado por Globalsat) que es muy útil para ver la información del GPS en la PC. Puede conectar la unidad GPS a un cable USB a TTL estándar para comprobarlo o configurarlo con una PC. Tenga en cuenta que el chip GPS en el módulo en realidad funciona a 3.3 voltios (a través de un regulador de voltaje integrado), por lo que si desea conectarse a su puerto RXD, debe bajar el nivel de 5 voltios. El puerto TXD se puede conectar directamente al Arduino o al PC.

Paso 6: zonas horarias

Mostrar la hora del GPS es algo fácil de hacer siempre que solo desee mostrar UTC (hora universal coordinada). Las sentencias NMEA se componen de caracteres ASCII que se pueden enviar directamente a la pantalla LCD. La porción de tiempo tiene el formato HHMMSS. FF (horas, minutos, segundos y fracciones de segundo). Para nuestro reloj, la parte fraccionaria no es útil, por lo que todo lo que tenemos que tratar son seis caracteres. El problema es que luego debe convertir a su hora local y a un formato de 12 horas AM / PM si lo desea. Pero a veces los problemas son los que hacen la vida interesante, de modo que de eso se trata realmente esa parte del software.

En cuanto a las zonas horarias, podría pensar que simplemente habría 24 de ellas, 12 de ellas al este de la ubicación UTC (zonas +) y 12 de ellas al oeste de la ubicación UTC (zonas -). De hecho, hay algunos bichos raros que son horas fraccionarias y un par que excede el "límite" de 12 horas. Si vive en una de esas áreas, me disculpo porque mi software solo tiene en cuenta las zonas de 24 horas completas. También hay algunos de nosotros que utilizamos el horario de verano parte del año, pero eso no se contabiliza automáticamente en el software. Eso requeriría una tabla de búsqueda de fechas futuras, complejidad adicional en el software y la necesidad de actualizar el software si cambiaran las semanas del año para el cambio. En cambio, el hardware utiliza un interruptor de contacto momentáneo para permitir una configuración sencilla de la zona horaria (compensación UTC).

Paso 7: esquema

Esquemático
Esquemático

El esquema se muestra arriba e incluye las conexiones para una interfaz LCD 1602 de 4 bits. Los datos en serie del receptor de RF están en niveles lógicos digitales, por lo que están conectados directamente a uno de los pines de entrada de datos de Arduino. El pin está configurado en el software para realizar una función de interrupción al cambiar de modo que podamos medir los anchos de pulso. La salida GPS TXD está conectada directamente a la entrada Arduino RX.

Se utilizan dos interruptores. Como se mencionó anteriormente, un interruptor de contacto momentáneo permite configurar la compensación UTC. El interruptor se puede presionar en cualquier momento para ingresar al modo de configuración. Inicialmente, la pantalla mostrará un desfase de UTC no válido de “+77”. Consulte la sección “Software del reloj” para obtener instrucciones sobre la configuración de la compensación UTC.

El segundo interruptor es un simple interruptor de encendido / apagado. En la posición "apagado", la hora se mostrará en formato de 12 horas (AM / PM) y en la posición "encendido", la hora se mostrará en formato de 24 horas. Este interruptor se puede cambiar en cualquier momento para alternar entre formatos.

Si solo se desea la función de reloj, entonces no es necesario conectar el módulo receptor de RF. Si solo desea la función meteorológica, entonces no es necesario conectar el GPS y los dos interruptores.

Paso 8: Software LCD

Tiendo a utilizar uno de los dos tipos de interfaces LCD. Una es la interfaz estándar de 4 bits y la otra es una interfaz de 3 cables que utiliza un registro de desplazamiento. Diseñé esa interfaz cuando trabajaba con pequeños microcontroladores PIC que tenían un número limitado de pines de E / S. Usé la interfaz de 4 bits para este proyecto, pero tengo mi propio archivo de inclusión de LCD en lugar de usar la biblioteca genérica de LCD de Arduino. Eso reduce el consumo de memoria y la complejidad del código y también me permite modificar el código para proyectos específicos como este.

Paso 9: software de reloj

La unidad GPS emite sentencias NMEA-0183 estándar que son cadenas ASCII que contienen una variedad de información. Para esta aplicación, elegí la oración GGA para obtener la información de tiempo porque esa es la oración que usé para un proyecto GPS anterior. Los campos de información en las oraciones NMEA están separados por comas, por lo que, después de que se detecta el encabezado de la oración GGA, el software normalmente contará las comas y llamará a la rutina apropiada para cada campo deseado de información GPS. Aquí solo se necesita la información de tiempo y está en el campo después de la primera coma, por lo que no es necesario contar.

Los seis dígitos de tiempo (HHMMSS) se almacenan en búfer y luego se procesan después de recibirlos todos. El GPS puede generar algunos mensajes incompletos al principio, por lo que la rutina de almacenamiento en búfer verifica que cada carácter sea un valor numérico ASCII. Si se recibe un carácter incorrecto, el mensaje se descarta. Esto también puede ocurrir en raras ocasiones durante el funcionamiento normal, especialmente si la comunicación del puerto serie cae un poco. Solo he visto esto una vez y todo lo que sucedió es que el tiempo se detuvo por un segundo y luego saltó dos segundos en lugar de uno.

Si el software está configurado para mostrar solo la hora, la primera línea de la pantalla LCD mostrará la hora local y la segunda línea mostrará UTC. Para UTC, el software simplemente envía los caracteres ASCII directamente a la rutina de visualización, con dos puntos (:) insertados correctamente.

Para convertir la UTC a la hora local, se debe aplicar la compensación UTC (zona horaria). Debido a que la hora UTC del GPS está en formato ASCII, el software convierte los caracteres de hora ASCII a decimales y luego agrega la compensación UTC. El desplazamiento UTC se almacena como un valor BCD positivo con un bit de signo, por lo que primero se convierte en un valor entero y luego se niega si se establece el bit de signo. Una vez que se calcula el valor de la hora local, se usa una tabla de búsqueda para convertirlo a BCD, y luego el BCD se vuelve a convertir a ASCII para su visualización. La tabla de búsqueda debe manejar el formato UTC de 24 horas, así como +/- 12 zonas horarias. Para hacer esto, las horas UTC de 0000 a 2300 ocupan las 24 entradas del medio en la tabla con 12 entradas antes y 12 entradas después para dar cuenta de las zonas horarias. Una tabla está en formato de 12 horas, por lo que también agregué una tabla de búsqueda para la parte AM / PM de la pantalla. La otra tabla está en formato de 24 horas. Como se mencionó anteriormente, un interruptor de encendido / apagado permite la selección del formato de 12 horas o de 24 horas.

La zona horaria se recupera de EEPROM durante la inicialización y se muestra brevemente. Si no se ha configurado al menos una vez, se llama a la rutina de configuración. La rutina de configuración también se puede llamar en cualquier momento presionando el interruptor de contacto momentáneo. La rutina de configuración inicializará la pantalla a “UTC OFFSET +77”. Una pulsación corta del interruptor cambiará el valor a "-00". Si se requiere una zona horaria positiva, otra pulsación breve cambiará el valor a "+00". Una pulsación larga (> 1 segundo) moverá el modo de configuración al siguiente paso. En este punto, cada pulsación breve aumentará el valor de tiempo hasta un máximo de 12. Después de alcanzar la zona horaria deseada, mantenga pulsado el interruptor durante más de 1 segundo y luego suéltelo. El software guardará el valor UTC en EEPROM y mostrará brevemente "OFFSET SAVED". Si comete un error durante la entrada, simplemente salga y luego presione el interruptor nuevamente para restablecerlo.

El NEO-6M no requiere una buena posición fija para emitir la hora, por lo que debería emitir mensajes tan pronto como reciba un satélite. Hasta entonces, la pantalla mostrará "NO DATA".

Paso 10: Software meteorológico

El microcontrolador PIC tiene la capacidad de activar / desactivar un temporizador mediante un pulso externo. Ese mismo pulso de entrada también se puede utilizar como una interrupción externa para señalar una lectura de la duración del pulso. El Arduino no tiene esa capacidad exacta, así que utilicé la función de interrupción al cambiar. En un borde del pulso de mensaje de RF, el manejador de interrupciones ahorra el tiempo actual de microsegundos. En el borde opuesto se calcula el tiempo transcurrido para determinar el ancho del pulso.

El software tiene una definición de “DEBUG” que permite mostrar el formato de datos sin procesar de los mensajes recibidos. También hay una definición para especificar el pin de entrada de Arduino para la transmisión en serie del receptor de RF. El software está configurado para calcular la configuración apropiada del registro de interrupción por cambio en base a esta definición. El cálculo solo funciona para los pines digitales Arduino. En su lugar, se podría usar un pin analógico, pero eso requeriría una codificación rígida de los valores de registro.

El manejador de interrupciones determina si el recuento capturado es lo suficientemente largo como para ser un pulso de inicio. Como se mencionó anteriormente, la brecha entre varios mensajes es de 2 ms, por lo que eso es lo que busca el software. Debido a todo el tráfico de 433 MHz, la pantalla inicial en el software asegura que el tiempo medido sea de al menos 1,8 ms pero no superior a 2,4 ms. Una vez detectado el inicio, el software busca los bits de sincronización (600us) y cuenta para asegurarse de que se reciben cuatro de ellos. Una vez que se pasan estas pruebas, el software busca los tiempos de bit adecuados de 200us y 400us.

Los bits recibidos se forman en bytes y cada byte se guarda. Después de recibir siete bytes, se verifica la suma de comprobación del mensaje antes de permitir el procesamiento adicional. Si se van a generar bytes sin procesar (modo de depuración), los bytes se convierten a caracteres ASCII y se envían a la pantalla LCD. Si se desean salidas de humedad y temperatura, se realizan las conversiones apropiadas.

Los dos bytes de datos centígrados en el mensaje de RF se combinan para formar un valor de 11 bits. La parte inferior se desplaza un bit a la izquierda para eliminar el bit de paridad y alinearlo con los bits de la parte superior. Los dos bytes se forman en una variable de palabra de 16 bits y luego todo se desplaza a la derecha un bit para obtener la alineación final de bits. La palabra variable se convierte luego en una variable de coma flotante para los cálculos matemáticos.

Una gran ventaja de usar C ++ en Arduino frente al lenguaje ensamblador en el PIC es que simplifica los cálculos matemáticos. Como se mencionó anteriormente, la conversión en grados centígrados es (C / 10) -100. El resultado se convierte en una cadena y se envía a la pantalla LCD para su visualización. El cálculo de Fahrenheit es (C * 1.8) + 32. El resultado se convierte nuevamente en una cadena y se envía a la pantalla LCD para su visualización. En ambos casos, la conversión de cadena incluye el signo negativo (si corresponde) y el punto decimal. Se comprueba el punto decimal para garantizar que solo se envíe a la pantalla un carácter después del decimal. Esa verificación es necesaria porque la cadena puede tener entre 3 y 5 caracteres de longitud.

Tengo dos sensores AcuRite, así que agregué una verificación en el software para asegurarme de que los datos de uno no sobrescriban los datos del otro si el software está configurado para realizar solo la función meteorológica. El primer sensor recibido después del encendido se muestra en la línea 1 y el otro se muestra en la línea 2. Al usar el modo de depuración, puedo ver cuál es el ID de cada sensor para poder hacer una simple verificación en el código si solo quería procesar datos de uno de ellos.

El software monitorea el estado de la batería (byte3) y muestra un mensaje si indica batería baja. Este mensaje sobrescribe todos los demás datos de ese sensor.

Paso 11: Pantallas

Muestra
Muestra
Muestra
Muestra
Muestra
Muestra

A continuación, se muestran algunos ejemplos de pantallas para las distintas funciones. Tengo algunos otros Instructables, pero la mayoría de mis proyectos de microcontroladores PIC se pueden encontrar en mi sitio web en: www.boomerrules.wordpress.com

Recomendado: