viernes, 3 de agosto de 2018

Estación meteorológica APRS vía Wifi por menos de 6€

Hace tiempo estuve mirando precios de una estación meteorológica, y la verdad es que están relativamente caras para las prestaciones que ofrecen. Lo único que necesitaría es que me mida temperatura, presión atmosférica, y si acaso % de humedad.

Trasteando en proyectos de domótica con los pequeños, pero potentísimos módulos ESP8266, encontré alguna información para realizar una sencilla mini estación metereológica por menos de 6€. La cual podría medir temperatura, presión atmosférica, y % de humedad ambiental.  Por si esto fuera poco, a través de nuestra wiffi, podríamos subir estas mediciones en tiempo real a internet mediante diversas plataformas: APRS aprs.fi y CWOP http://wxqa.com/  y ahora también a Weather Underground https://www.wunderground.com/ Todo esto sin la necesidad de estar conectada a un PC, ya que lleva todo el software incluido en su CPU, y envía los datos vía wifi.

También es posible enviarnos esas medidas a nuestro móvil, o realizar cualquier desarrollo que se nos pudiera ocurrir. El proyecto es 100% customizable a nuestras necesidades ya que se basa en software de código abierto creado por F4GOH, y super mejorado por IU5HKU Marco (muchas gracias Marco por tu ayuda en este proyecto). A nivel de hardware, se le puede poner panel solar y pila para alimentación autónoma, hacerle una caja de madera tipo estación meteo profesional, etc... Eso será en la versión 2.0 que publicaré más adelante.

Hardware necesario

Empezaremos por lo básico, que es la estación metereológica vía wiffi con envío de información a los servidores mencionados. Para ello solamente necesitamos el siguiente hardware:

- Módulo ESP8266 NODEMCU:

Este pequeño módulo de desarrollador consta de la placa ESP8266. Además trae un puerto de programación microUSB con chip CP2102 o CH340G, botones de reset, led de placa, y regulador de voltaje. También tiene pines fácilmente accesibles para todas las entradas y salidas. Todo ello por unos 3€ envío incluido. Existen varias versiones en el mercado, la mía es la V2.0 del fabricante AMICA. Existe la V3.0 que supongo valdrá también, pero no estoy seguro.

Existe la versión ESP8266 pelada, sin extras, que es más barata, pero necesitaríamos un programador UART para programarla, hay que soldar los pines minúsculos a mano, usar una placa protoboard, ponerle botón para flashear, etc.. No compensa por ahorrarnos 1'5€, sinceramente.

Ojo!, necesitaremos un cable Micro-USB a USB normal, para alimentarlo y programarlo. El del móvil valdría.


- Sensor de temperatura, humedad, y presión BME280:

Esta minúscula plaquita incluye sensor de temperatura, humedad, y presión. Todo en uno por 2€ puesto en casa.



Una vez realizada la compra vía eBay, o plataformas orientales de venta online, vamos a programar el NODEMCU con el correspondiente software. Pero antes, unas sencillas instrucciones de como se cablean los módulos entre sí. Hay gente que ha usado con éxito el Mini D1, que es muy similar al nodemcu, pero más pequeño aún.

Cableado entre módulos

El cableado entre el sensor y la CPU es de lo más sencillo.
Primero debemos soldar 4 pines que trae el módulo BME280, ya que viene la placa por un lado, y los pines por otro. Son las únicas soldaduras que habría que hacer si usamos cables hembra de prototipos. Sino podemos cablearlo soldando pin a pin con cables finos normales.







Una vez soldado el sensor procedemos a cablear los pines de la siguiente manera:

NODEMCU      BME280
  pin   3v3            pin VIN
  pin   gnd            pin GND
  pin   D1             pin SCL
  pin   D2             pin SDA



Con estas conexiones nuestra estación meteorológica ya estaría preparada para subirle el software correspondiente y funcionar. No necesita nada más.

Programando la placa ESP8266 NODEMCU

Para ello vamos a utilizar el IDE de Arduino, importando unas librerías especiales para la programación del módulo ESP8266. El IDE de Arduino es un software que nos permite programar, y subir nuestro propio software a los diversos chips que soporta, que son muchos aparte de Arduino.

El IDE de Arduino contiene bastantes ejemplos para cada plataforma de desarrollo, y es bastante sencillo de utilizar. En este caso nos vamos a centrar en la estación meteorológica con el ESP8266, pero que sepas que se usa para programar muchos chips, y placas distintas.

Paso 1
Nos descargamos el IDE de Arduino aquí: https://www.arduino.cc/en/main/software
Teniendo en cuenta el sistema operativo que utilizamos en nuestro PC.
Lo instalamos en nuestro PC, y lo ejecutamos.

Paso 2
Nada más abrir, vamos a importar las librerías que nos hacen falta para los módulos ESP8266:
Pulsamos en "file" y luego "setings" y añadimos la siguiente url para importarnos las librerías:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
Y pulsamos OK.



Paso 3
Nos vamos al gestor de tarjetas:


Buscamos por la palabra ESP, marcamos la librería para ESPxxx y pulsamos INSTALAR. Con esto ya tenemos que tener cargadas nuestra librerías para el ESP8266.

Paso 4
Vamos al despegable de "tarjetas" y nos aparecen un montón que empiezan por ESP-xxxx.
En este punto debemos escoger la nuestra que sería la "Generic ESP8266 module", y dentro de esta escogemos la "NODEMCU 1.0 (ESP-12E Module)". Si no te aparecen tarjetas ESP8266, retrocede a los pasos anteriores antes de avanzar más.

Paso 5
Ahora tan sólo es conectar nuestra placa al ordenador con el cable USB y comprobar si funciona. Al conectarla miramos que puerto COM nos ha asignado nuestro sistema operativo. En windows en el administrador de dispositivos, y en linux ejecutando dmseg en un terminal (en la ultima línea nos dice el puerto asignado al USB insertado).
Los parámetros de configuración que debemos poner son:



Paso 6 
Para probar si realmente nuestra placa funciona y está lista para ser programada, entramos en Archivos/Ejemplos/ESP y allí hay un ejemplo muy simple de programa que se llama blink. Esta rutina hace parpadear el led de test de nuestra placa. Lo cargamos, y le damos a la flecha de arriba para que lo suba al módulo ESP. Si todo es correcto, el led azul de nuestra placa comenzará a parpadear cada segundo. Si no, no sigas, y repasa los pasos anteriores, porque alguna configuración o conexión debe estar mal. Una vez este sencillo test funcione, estamos listos para el siguiente paso.

Paso 7
Ahora cargaremos dos librerías imprescindibles para que nuestro software meteo funcione:
NTP time es una librería para que el módulo sepa la hora exacta para realizar sus mediciones.
https://github.com/SensorsIot/NTPtimeESP

BME280 es la librería de gestión de los sensores de nuestra estación meteo.
https://github.com/sparkfun/SparkFun_BME280_Arduino_Library

En estas webs pulsamos el botón verde "Clone or Download" y "Download in ZIP". Nos lo descargamos en formato comprimido .ZIP.

Paso 8
Vamos al IDE de Arduino, y en apartado administrar librerías, pulsamos "cargar librería en ZIP".
Se suben ambas al IDE, y ya tenemos todo listo para cargar el software a nuestro ESP8266.

Paso 9
Ahora solamente tenemos que cargar el archivo .ino. Nos descargamos en .ZIP todo el proyecto de:  https://github.com/IU5HKU/MiniWXStation  y veremos la última versión bme_V08c.ino . Ahora cargamos el software pero antes viendo el código debemos meter nuestros parámetros:
//**** How the station is named in your NET
const char* WiFi_hostname = "IU5HKU-13";
//**** APRS PASSWORD (use -1 if you are using a CWOP callsign)
//**** APRS COMMENT, you can set this string as you want (max 43 chars)
//**** APRS_PRJ, Telemetry Project Title (max 23 chars)
const char* AprsPassw = "YourAprsNumericalPASS";
const char* APRS_CMNT = "ESP8266+BME280 MiniWX Station";

Wifi hostname es el nombre que le daremos a nuestro NODEMCU en nuestra red wifi. MiniWx sería un buen nombre, por ejemplo.
AprsPassw es nuestro pass id usado en APRS si usamos aprsdroid, y similar. Si no sabes cual es mándame un mail con tu indicativo, y te doy la pass relativa a tu indicativo.
APRS_CMNT es el comentario que se emitirá en aprs aparte de los datos metereológicos. No es necesario modificarlo, salvo que quisieras añadir por ejemplo tu ciudad "MiniWX Station Madrid".

Si te has dado de alta en la web de https://www.wunderground.com/ , al crear una estación meteo, el sistema de da una id y una pass, que has de poner aquí:
//**** uncomment this for weatherunderground upload
#define USE_WUNDER
//* change ID and PASSWORD with yours
char ID [] = "YourWunderID";                      
char PASSWORD [] = "YourWunderPASSW";

Sustituye YourWunderID por tu ID y YourWunderPASSW por tu password. No alteres las ", ni dejes espacios. Sin no tienes cuenta en Weather Underground, déjalo así.

Ahora que ya tenemos los parámetros de inicio configurados, solamente es dar al botón de compilar, y si compila ok, le damos subir al nodemcu.

Si todo es correcto, nos indicará el IDE abajo, en letras naranja, 100% software cargado.

Paso 10
Para ponerlo en funcionamiento y configurar nuestra estación meteo, abrimos el terminal de Arduino (un botón muy pequeño a la derecha del todo de la pantalla). Antes de nada y MUY IMPORTANTE configuramos el ajuste de línea del modo: nueva línea y comprobamos la velocidad de conexión 115200 baudios.



Escribimos la letra m enviando este comando al módulo. En seguida nos aparece el menú de configuración:

Configurando nuestra estación meteorológica

Pulsamos m desde el terminal de arduino, putty, o similar.

Config menu
0 Quit menu (Salir del menú)
1 format file system (Formatear todos los valores)
2 config wifi access point (Configurar la wifi de conexión)
3 config weather station (Configurar la estación meteorológica)
4 test ntp (Test de la hora NTP)
5 test bme 280 (Test del sensor BME280)
6 test server upload (Test de subida de datos al servidor)
7 print weather data logger (historic) (Sacar por terminal un histórico de mediciones)
8 create and erase weather data logger (Crear y borrar el log de mediciones)

Paso 1
Pulsamos 2 y enter, configurando los parámetros de la wifi a la que nos vamos a conectar. Ya sabes SSID y pasword. Ojo de no meter espacios, o querer borrar letras. Has de ponerla bien, y a la primera.

Paso 2
Pulsamos 3 y enter. Configuramos nuestra estación meteorológica con los siguientes parámetros:

Indicativo (FWxxxx para indicativos CWOP) FW1234
                 (Radioaficionados utilizar el ssid -13 para aprs.fi) EA1CDV-13
Latitud      ej:4759.75N  (Ojo con el formato y los dígitos)
Longitud   ej: 00012.21E (Ojo con el formato y los dígitos)
En el mapa aprs.fi verás arriba una ventanita con las coordenadas y el locator de donde pongas el cursor del ratón, esas coordenadas nos valdrían, teniendo en cuenta lo siguiente:

Actualización 05-09-2018:
Por Ejemplo: 3422.46S/05514.13W
La latitud y longitud son expresadas en grados, minutos y fracciones decimales de minutos, NO grados-minutos-segundos.
Este es el formato standard NMEA para lat/long utilizado por los receptores GPS, y es tambien por defecto el formato para APRS.
El ejemplo expuesto mas arriba nos indica entonces que "34 grados 22.46 minutos sur de latitud" y "055 grados 14.13 minutos oeste de longitud".


Server a donde enviaremos nuestras tramas ej: rotate.aprs.net, el que lleva por defecto cwop funciona muy bien.

Intervalo de envío (recomendable cada 5 minutos o más, es suficiente)

Paso 3
Pulsamos 4 para ver que progresivamente aparece la hora y aumenta cada segundo.
Paso 4
Pulsamos 5 para ver las mediciones de nuestro sensor y que son más menos correctas
Paso 5
Pulsamos 6 y vemos si se realiza el envío de la trama al servidor configurado. Si el server acepta la trama no sucederá nada, pero si la rechaza, nos aparecerá el motivo de dicho rechazo para poder tracear el problema si lo hubiera.
No hay que olvidarse de pulsar el 0 para grabar los datos en la memoria del ESP. Y finalmente salir de todos los menús, con 0 también.




Ahora solamente nos queda entrar en la web aprs.fi y verificar que aparecemos en el mapa y que los valores mostrados son correctos.

Podemos desconectar la estación del PC, y conectarla a cualquier cargador de móvil o USB que tenga energía, y nuestra estación meteo funcionará por si sola. Por cierto, el software también tiene un webserver. Si introduces la IP en un navegador, puedes ver los valores de la estación meteorológica vía web.

Espero que os haya gustado este sencillo proyecto. A disfrutarlo! Cualquier mejora que se os ocurra no dudéis en comentarla y documentarla. Todo es mejorable, entre todos!.

          ------- Actualización 27/8/2018 --------

Después de múltiples pruebas, el amigo IU5HKU Marco, se ha currado un software libre de fallos, y con más prestaciones. Desde aquí felicitar a Marco por su gran trabajo y evolución de este proyecto. Gracias!!!

Lo más destacado es que nuestra estación meteo es capaz de subir los datos a https://www.wunderground.com/ .Tan sólo has de abrirte una cuenta gratuita en su web, e introducir tu user y password en el nuevo código del fichero .ino, y comienza a subir los datos a la web de inmediato.

Para poner tus datos de Wunderword busca esto en el código:

//**** uncomment this for weatherunderground upload
#define USE_WUNDER
//* change ID and PASSWORD with yours
char ID [] = "YourWunderID";                      
char PASSWORD [] = "YourWunderPASSW";

Luego los podrás visualizar en su web, incluir un banner en tu web, o incluso con su app, tenerlos en tu móvil. Todo en tiempo real, y por supuesto, a la vez que los sube a APRS o a CWOP.
Un ejemplo de la inserción de tu estación meteo en web. Pulsando, te lleva directo a tus datos de weather untherground:

Weather Underground PWS ILEGANS16

Otra mejora muy buena es el poder usar una ip fija en tu red, en vez de esperar que el router te asigne una por DHCP. Tan solo tienes que modificar esto:
//**** use static ip instead of dns one
//#define USE_STATIC_IP
//* change to reflect your net configuration
#ifdef USE_STATIC_IP
String stat_ip="192.168.0.200";        // STATIC IP
String stat_gateway="192.168.0.1";     // GATEWAY
String stat_subnet="255.255.225.0";    // SUBNET MASK
String stat_dns1="8.8.8.8";            // DNS1
String stat_dns2="4.4.2.2";            // DNS2
IPAddress ip,gateway,subnet,dns1,dns2;
#endif
También en la patilla analógica  A0 del NODEMCU mediante una resistencia de 100k, podrás medir la tensión del ESP, o de lo que quieras, y saldrán tus datos en la telemetría del aprs, junto con la señal wiffi RSSI que ya se muestra ahora. Por defecto, este software, mide la tensión de la CPU si no conectas nada a la patilla A0. Otra mejora que se le agregó fué la funcionalidad de que parpadee un led azul cada segundo, y que cuando envíe los datos a los servers de aprs y wundergrund comience a parpadear otro led con más velocidad. Si no deseas esta funcionalidad solo has de comentar estas líneas:
#define BLINK_RED_LED
#define BLINK_BLUE_LED
El código está mucho más depurado, y comentado para que sea más fácil poder hacer nuestras propias mejoras o modificaciones. Por ejemplo, quitar los indicadores led cuando usemos baterías o paneles solares, y así ahorrar energía. Todas estas mejoras están publicadas por Marco IU5HKU en https://github.com/IU5HKU/MiniWXStation al igual que el fichero .ino última versión. A priori no se esperan más mejoras y actualizaciones, ya que la siguiente parte del proyecto quiero que sea la mecanización en caja adecuada para exterior, añadiendo un panel solar, y una batería auxiliar. Ya veremos como.           ------- FIN de Actualización 27/8/2018 --------