Estación meteorológica: de la idea a la realización




Leer un montón de artículos sobre el desarrollo de su dispositivo, y quería hablar de sus experiencias. Sucedió hace unos años, en el 4º año de la universidad. Ahora me he hecho de manera muy diferente, pero en ese momento yo estaba empezando a aprender la electrónica, que es - mi primer dispositivo, por lo que no juzga en sentido estricto.

Yo siempre quería algo más que un termómetro ordinario fuera de la ventana o la estación meteorológica pantalla LCD con la temperatura en la calle y en la sala. Así que cuando me puse a pensar, "lo que se hace" con el fin de empezar a descubrir el mundo de los microcontroladores, la respuesta fue encontrado por sí mismo - una estación meteorológica. Naturalmente, mostrando grados fuera y dentro de la habitación, la humedad y la presión. Y con la luz - Siempre me gustó la implementación del pronóstico del tiempo en Yandex -. Una mirada en el fondo suficiente para entender, será caliente o frío, y cómo

El resto de la funcionalidad se ha definido un poco de lluvia de ideas. La presencia de la luz de fondo es sin duda una ventaja, pero ¿qué pasa en la noche y en la noche? Decidí instalar el sensor IR que reacciona con el enfoque. Al acercarse al instrumento en una cómoda distancia se ilumina, en otras ocasiones la pantalla por defecto está desactivada. El uso de IR empujó para poner en práctica la unidad de control también en el canal IR - a través de la consola (inicialmente tenía preocupaciones acerca de la interferencia, pero no han sido confirmadas). Es natural que una hora y tales disponibilidad dispositivo.

Como base para el sistema fue elegido Arduino, yo estaba empezando a aprender. Arduino sí considero ahora (y después) como marco - sobre todo el software que le permite construir rápidamente el sistema necesario conectar si plugins necesarios biblioteca. Sí, podemos escribir en pura C / C ++, pero las tareas más ordinarias se da sólo un ligero aumento en el rendimiento, casi invisible en el contexto de la simplicidad y la facilidad de bocetos de carga en Arduino, así como una amplia colección de bibliotecas para trabajar con diversas glándulas. (Por supuesto, existen desafíos especiales, pero ahora no se trata de ellos).
En la implementación de hardware de la misma, yo prefiero usar la placa Arduino azul sólo en la fase de creación de prototipos para "maketke", y al final del desarrollo de los dispositivos se diseñan generalmente una sola placa con un microcontrolador y todo lo demás. Así que fue en ese momento.

La selección de los componentes que se inició con la pantalla. Encontrado rápidamente una exhibición maravillosa con RGB retroiluminada www.adafruit.com/products/398 , lo que permitió obtener casi cualquier color. Está construido en el chip populares HD44780 y soporta un gran número de bibliotecas, incluyendo LiquidCrystal en Arduino.

También me pregunté por el precio de las pantallas individuales de producción. Precio mínimo de 1 copia de la pantalla LCD monocromo (como en una estación meteorológica típica) a precios de ese momento era del orden de 1 000 euros, para el proyecto no comercial en un solo ejemplar que encontré un precio poco práctico.



Como un sensor infrarrojo fue elegido de Sharp GP2Y0A02YK0F . Característica importante en mi caso es el rango de detección de instalaciones, este sensor es igual a 1,5 m, mientras que muchos otros sensores no exceda de 30 cm como se muestra en sí la explotación, para los pequeños metros y medio 16x2 pantalla -.. Realmente la distancia óptima

Como se seleccionó el sensor de presión de Bosch BMP085 , trabajando en I2C , humedad HH10D - con salida de frecuencia. Te diré que en este momento me gustaría, en cualquier caso, no he utilizado este último, y preferiría opciones-I2C sólo, como HTU21D.

Como los sensores de temperatura externos se utilizan todo su favorito DS18B20 . Su gran ventaja es la capacidad de conectar (y desconecte si es necesario) 1 bus múltiples sensores sin la necesidad de cambiar el código. Con la transmisión inalámbrica de datos de temperatura que en mi primer proyecto, no me comunico, más que tuve la oportunidad de poner los cables sin comprometer la estética.

Receptor de infrarrojos se tomó más típicos tales TSOP382. Control remoto para estación meteorológica remota era de algunos de los DVR. Zumbador (sonajero que) - zumbador piezoeléctrico más común
.


Como un reloj de tiempo real, elegí DS1307 , también está trabajando en I2C, por otra parte, tenía un pequeño chip memoria flash 24AA256 64 KB con I2C-interfaz. He añadido al proyecto por pura curiosidad - tratar de trabajar con la memoria externa, escribiendo datos en él acerca de las condiciones meteorológicas. La energía para el proyecto - la externa, a partir de la fuente de alimentación. En la entrada se encuentra convertidor / tensión LM7805 , nodo de alimentación en sí es muy similar a la utilizada en el Arduino (aunque no es un clon).

Yo iterar desarrollo, mucho más fácil de depurar y conocer nuevo campo. En la primera etapa, con el termómetro DS18B20 leer los datos y visualiza en la pantalla LCD. Las siguiente - valores de temperatura se convierten en RGB-código para la iluminación
.
Aquí me pongo a la espera de la función del color. Pantalla de administración del color se lleva a cabo usando la modulación de ancho de pulso para cada una de las tres luces LED (usando la librería estándar) con 256 pasos - aparentemente muy normal de color de 24 bits. Por desgracia, las longitudes de onda de los colores R, G y B del monitor y las luces LED son muy diferentes, y debido a esto, el color habitual, como # FFFF00, contra el fondo de mi pantalla LCD se ven completamente diferente ("dejar de lado"). Así que tuve que escribir un programa en C # con tres deslizadores y picker'om color de difusión de los tres componentes de color en un Arduino serie. Entonces tuvo que recordar los conceptos básicos de las matemáticas y crear una función que convierte la temperatura en grados Celsius en la escala RGB color. Naturalmente, estoy ya no se limita a la de color amarillo-azul escala de Yandex, y utilicé otros colores - sobre la base de sus asociaciones
.
El siguiente paso fue conectar sensores telémetro, temperatura y humedad IR. Y si los dos primeros no tuvieron ninguna dificultad (excepto soldadura BMP085 en LCC8 caso), entonces el sensor de humedad traerá una gran cantidad de problemas.

La cosa es que el valor total de la humedad relativa se calcula utilizando la fórmula, uno de los argumentos, que es la frecuencia del sensor de salida de onda cuadrada. Medición de frecuencia se realiza utilizando el microcontrolador temporizador de hardware. En 328, por desgracia, estos temporizadores son sólo tres, y la mayoría de ellos ya están involucrados en Chimay para iluminar la pantalla. (Ahora no recuerdo todos los detalles, tal vez perdió algo).

A partir de esta situación hubo varias salidas. Si he desarrollado un dispositivo de hoy, sin duda han utilizado sólo I2C-sensores. Otra opción era utilizar un motor más potente microcontrolador. Entonces yo elegí una tercera opción - para instalar un microcontrolador independiente para trabajar con sonido (altavoz de agudos) y una pantalla retroiluminada (recuerde, esto fue sobre todo un proyecto educativo, y yo tenía curiosidad por tratar de organizar la cooperación entre los dos MC). También aprobó la función de conversión de temperatura de color, haciendo que sea más fácil para unos pocos kilobytes de firmware principal MK (Atmega328 en el tamaño de la memoria del programa está sólo 32Kb, mi firmware finalmente se acerca a este límite). La interacción entre el MC todavía se organizó en el I2C.

A partir de entonces se añadieron control, reloj, memoria flash. El siguiente paso fue escribir un menú fácil de usar, la adición de características de software (como el bloqueo de la luz de fondo en el estado actual, el régimen de los grandes números - como en el reloj de la calle, el desplazamiento de todos los parámetros), soporte para múltiples sensores de temperatura con su adición / eliminación en línea (sí, lo sé que es mejor no hacer). Es una cosa bastante habitual para el PC - e inusual en un principio que ha recopilado para el dispositivo cuando no hay esquema cambia varias veces aumenta la funcionalidad del proyecto ...

Utilizar un poco de distancia de su protocolo propietario. Yo no participo en la ingeniería inversa, yo era bastante suficiente representación hexadecimal de cada botón, que recibí de la irRemote biblioteca. Para la memoria flash elijo para grabar los datos del tiempo cada 10 minutos, a una longitud de 16 bytes en el registro de esto es suficiente para 4 meses.

El código responsable de trabajar con memoria flash LOGGER.h
 & lt; code class = & quot; cpp & quot; & gt; #ifndef LOGGER_h #define LOGGER_h #include & lt; WProgram.h & gt; clase LOGGER {public: REGISTRADOR (int); anular storeRecord16 (byte * buffer); getRecord16 void (dirección unsigned int, byte * búfer); int getAddress (); setAddress vacío (int); privado: int _FlashI2CAddress; _getAddress vacío (); _setAddress vacío (); int _addr sin firmar; }; #endif & lt; / código de & gt;  pre> LOGGER.cpp 
 & lt; code class = & quot; cpp & quot; & gt; #include & lt; WProgram.h & gt; # include & lt; Wire.h & gt; #include & quot; LOGGER.h & quot; / * MAPA DE MEMORIA: 0000 - MSB de última dirección escrita 0001 - LSB de última dirección escrita ... 0040 - 7FFF - almacenamiento, * / REGISTRADOR :: LOGGER (int a) {_FlashI2CAddress = a; } LOGGER Vacío :: storeRecord16 (byte * buffer) {byte c; // Obtener dirección LOGGER :: _ getAddress (); // Aumentar addr de retardo (5); _addr + = 16; si (_addr & gt; 0x7FF0) _addr = 64; Wire.beginTransmission // búfer tienda (_FlashI2CAddress); Wire.send ((byte) (_addr & gt; & gt; 8) & amp; 0xFF); // MSB Wire.send ((byte) (amp _addr y; 0xFF)); // LSB para (c = 0; c & lt; 16; c ++) Wire.send (tampón [c]); Wire.endTransmission (); retardo (20); // Guardar nuevo LOGGER dir :: _ setAddress (); } LOGGER Vacío :: getRecord16 (unsigned int dirección, byte * buffer) {byte c; // Wire.beginTransmission dirección Set (_FlashI2CAddress); Wire.send ((byte) (dirección & gt; & gt; 8) & amp; 0xFF); // MSB Wire.send ((byte) (amplificador de dirección y; 0xFF)); // LSB Wire.endTransmission (); Wire.requestFrom (_FlashI2CAddress, 16); para (c = 0; c & lt; 16; c ++) si (Wire.available ()) buffer [c] = Wire.receive (); } LOGGER Vacío :: _ getAddress () {byte c; Wire.beginTransmission (_FlashI2CAddress); Wire.send (0); Wire.send (0); Wire.endTransmission (); Wire.requestFrom (_FlashI2CAddress, 2); para (c = 0; c & lt; 2; c ++) si (Wire.available ()) = _addr _addr * 256 + Wire.receive (); } LOGGER Vacío :: _ setAddress () {Wire.beginTransmission (_FlashI2CAddress); Wire.send (0); // Puntero Wire.send (0); // Puntero Wire.send ((byte) (_addr & gt; & gt; 8) & amp; 0xFF); // MSB Wire.send ((byte) (amp _addr y; 0xFF)); // LSB Wire.endTransmission (); } Void LOGGER :: setAddress (int dir) {_addr = addr; REGISTRADOR :: _ setAddress (); } Int LOGGER :: getAddress () {LOGGER :: _ getAddress (); volver _addr; } & Lt; / código de & gt;  pre> 

Sube los datos producidos por un equipo de la estación meteorológica de menú (un poco como el viejo menú de Nokia o Samsung, pero sin gráficos) al puerto serie.

Después de eso, estación meteorológica funcionalmente completa había sido en forma de placas de desarrollo Arduino y en algún lugar por una semana. Durante este tiempo, las pruebas detectan posible colgar (debido a la falla del sello sensor de temperatura exterior). Rehice el diseño del sensor (hoy me gustaría tener sólo una fábrica, por ejemplo, tales ), sino también la posibilidad de bloqueos quiero excluir, en principio, . Además, supuse que después de 49 días de operación continua de una función de desbordamiento millis () , que, debido al algoritmo específico, el firmware también colgar. La cosa debe ser confiable! Por lo tanto, el toque final fue la activación del temporizador de vigilancia del sistema con el tiempo colgar cualquier garantizado no dure más de 2 segundos + 5 segundos para reiniciar (sí, en esta era digital, incluso la estación meteorológica toma tiempo para cargar.

Así, la estación está listo y trabajando correctamente. Creo que su estancia en este mal momento. El dispositivo debe ser cómodo y tener un aspecto acabado, para que puedan disfrutar de la comodidad y mostrar a todos, no sólo los compañeros de los frikis.

Comencé con un viaje a la tienda más cercana de radio y de elección de vivienda. 20-30 diversas realizaciones que le gustaba que figura al principio del artículo - para la alteración mínima deseada, debido a la posibilidad conveniente para fijar la carcasa telémetro fuera, de modo que no se mucho sobresalía de la buena ventilación (y por lo tanto lecturas más precisas de la temperatura en la habitación). Hoy en día, creo que me habría ordenado la impresión en 3D-impresora e hizo algo aquí en este estilo:





(Es difícil encontrar un cuadro similar, pero no lo hacen los profesionales 3D -modelirovanii. La pantalla se encuentra en la cima de todo lo demás en el stand). Y, por supuesto, sin cables - 433 MHz para sensores y Wi-Fi para conectarse a un PC
.
Después de la deliberación y el equipamiento que mejor posicionado todo llegó el turno de la placa de desarrollo. En su primer proyecto, he usado un sistema de Águila. Dibuja el contorno de la junta, publicado en sus elementos y conexiones (sí, este proyecto que estaba haciendo el camino "equivocado" -. Sin concepto más preciso, sin el esquema en Eagle), el trazador con facilidad todo divorció. Atribuido a la producción ...

Habré muy encariñado con el tema de la fabricación de placas de circuitos impresos, por lo que aquí voy a hacer un retiro. Botín estoy familiarizado, pero no tengo ningún deseo / capacidad de hacer juntas, incluyendo el contacto con la química (cloruro férrico que todavía una cosa). Pero si la universidad tiene una pequeña producción piloto, donde a precios muy razonables (~ $ 3 por sq.dm. en el momento) pueden producir casi cualquier PP bilateral. Tecnología - aberturas fotorresistentes - de 0,6 mm, la anchura mínima de la pista - al igual que 0,2 mm (sin duda no más grande, ahora no me acuerdo). Por desgracia, no la máscara de soldadura, la metalización de vías para el precio no debe esperar, pero todo está resuelto. Al final, para la creación de prototipos (y vestir listo para un día o dos) y la producción en pequeña escala se puede hacer sin máscaras (en mi humilde opinión, Soldadura y significa manualmente grande) blockquote>
.  Sin embargo, cuando hice el pedido, a continuación, sobre la metalización de vías no he pensado. Águila utilizar de forma segura las células madre como tal, y el costo sólo las conexiones 2-3 data entre capas. Hombre en extradición se dio cuenta y se ofreció amablemente el alambre más delgado para crear transiciones en los agujeros para los elementos (es decir, en primer lugar a través del agujero en la plataforma de desplazamiento superior e inferior soldado, después de lo cual se ha insertado en sí derivan de células). Traté de actuar así, pero los resultados y la cantidad de trabajo extra no es alentador. Tenía el vestido peretrassirovat creado por la zona de exclusión para la ubicación cerca de todo a través de PTH-elementos. Aquí trazador automático de llevar el trabajo al final se negó, y tuve que subir el resto de la cadena con la mano (el deseo y el tiempo para cambiar el diseño del sistema no estaba allí). Vías sami finalmente hacen exactamente la misma tecnología, pero su número, me minimizado. Soldadura volvió a ordenar el vestido era mucho más fácil.

Siguiente - trabajo con un taladro, un cuchillo y un archivo, la vivienda comprada por pantalla de la ventana de montaje por una tarifa. Noches de par - y el cuerpo del aparato funciona correctamente. Y, sin embargo, algo falta ...

Y no hay suficientes pegatinas en el panel frontal (especialmente después de cortar a través de una ventana en ella). Autoadhesivas de papel - una gran cosa para tales tareas. ¿Qué ha pasado - una foto en la portada, no juzgar estrictamente :) Después de esta aparición del dispositivo ha cambiado radicalmente ...

Así es como (brevemente) me miró la manera de desarrollar mi primer dispositivo. Detrás de la escena dejó una gran cantidad de código, muchas diferentes pequeñas decisiones que surjan en los objetivos del curso. Lo principal que compré para mi mismo - es la experiencia de desarrollo, lleno de "baches", la comprensión de los principios de funcionamiento, más una prima era la estación meteorológica propia. Único y uno de un tipo.


PD Sé que muchas de las decisiones no son óptimas, pero es gracias a ellos (incluido), ahora me doy cuenta de que la mejor y lo que no :). Colocación de un diagrama funcional de un bono en Inglés y un par de fotos, y hacer que el tablero.

Esquema de funcionamiento:





Render, tabla real sin máscara de soldadura. No se muestra en el soporte de la batería de litio, zumbador piezoeléctrico, DIN-conector (el poder, la comunicación con el PC, sensores) y diferentes cosas pequeñas. Por otra parte, en un dispositivo real microcontroladores se encuentran en órbitas.

Modo "grandes números", para facilitar la lectura a distancia:







Fuente: habrahabr.ru/post/223829/