Tabla de contenido:

Sistema inteligente de monitoreo distribuido del clima IoT usando NodeMCU: 11 pasos
Sistema inteligente de monitoreo distribuido del clima IoT usando NodeMCU: 11 pasos

Video: Sistema inteligente de monitoreo distribuido del clima IoT usando NodeMCU: 11 pasos

Video: Sistema inteligente de monitoreo distribuido del clima IoT usando NodeMCU: 11 pasos
Video: Arduino IoT Cloud con ESP32, Relé (relay) y Sensor DHT22. Guía completa paso a paso desde cero 2024, Mes de julio
Anonim
Sistema inteligente distribuido de monitoreo del clima IoT usando NodeMCU
Sistema inteligente distribuido de monitoreo del clima IoT usando NodeMCU

Es posible que todos conozcan la estación meteorológica tradicional; pero ¿alguna vez te has preguntado cómo funciona realmente? Dado que la estación meteorológica tradicional es costosa y voluminosa, la densidad de estas estaciones por unidad de área es muy inferior, lo que contribuye a la inexactitud de los datos. Te explicaré cómo: Supongamos que una estación está ubicada en el medio de una ciudad y es la única estación que está ubicada en un radio de 'x' metros, se puede sesgar fácilmente si hay algún agente contaminante presente en las cercanías. de la estación que muestra toda el área de radio 'x' metros como contaminada, ya que esa única estación es responsable de determinar los datos meteorológicos de toda el área.

Para superar este problema, se debe aumentar la densidad de los módulos, lo cual solo es posible si los módulos son más baratos y ocupan menos espacio que el existente.

Esta es la razón por la que mi solución propuesta es la solución perfecta para este problema. Cuesta menos de $ 10 y también descansa fácilmente en mi palma.

Cómo funciona…

Hay 3 partes principales de este proyecto.

Lado del dispositivo:

El dispositivo es un módulo de IoT que se muestra en la imagen que envía los datos meteorológicos al servidor cada intervalo de tiempo 'x'. Los datos incluyen los datos meteorológicos reales, la ubicación geográfica del módulo; es decir, sus coordenadas, su dirección MAC; para identificar de forma exclusiva el dispositivo, la versión de firmware en la que se está ejecutando actualmente. El lado del dispositivo comprende N-módulos distribuidos por el área que contribuyen activamente con datos al servidor.

Lado del servidor:

Como su nombre indica, es el servidor centralizado que maneja varias operaciones como recibir los datos de los módulos y almacenarlos en la base de datos, actualizar el módulo con el último firmware si se está ejecutando en una versión anterior, enviar los datos meteorológicos a la cliente a petición.

Lado del cliente / usuario:

Es el usuario final quien solicita los datos meteorológicos del servidor. El cliente envía la ubicación actual y en función de la ubicación, el servidor calcula la distancia entre el cliente y todos los módulos y envía los datos meteorológicos del módulo más cercano al cliente que se considera exacto.

Suministros

  • NodeMCU (ESP8266-12E)
  • DHT11 (sensor de temperatura y humedad)
  • BMP180 (sensor de presión y temperatura)
  • MQ-135 (sensor de índice de calidad del aire)
  • Cable USB (para cargar el programa)
  • Fuente de alimentación de 5 voltios
  • Condensadores (Opcional: para colocar en paralelo a la línea eléctrica)
  • Arduino IDE (para depurar y cargar el programa)
  • Aplicación POSTMAN (opcional: para depurar la API)
  • Un sitio web (para alojar el servidor PHP y MySQL)

Paso 1: Suelde todos los componentes y cargue el programa en NodeMCU

Suelde todos los componentes y cargue el programa en NodeMCU
Suelde todos los componentes y cargue el programa en NodeMCU
Suelde todos los componentes y cargue el programa en NodeMCU
Suelde todos los componentes y cargue el programa en NodeMCU

Suelde todos los componentes al NodeMCU como se muestra en el diagrama de circuito en una placa perf. Además, suelde un condensador en paralelo a las líneas eléctricas, ya que la energía aumenta durante la transmisión y recepción de datos de forma activa.

Una vez realizado el trabajo de soldadura, cargue el código provisto en el archivo "code.c".

Nota: No olvide reemplazar las credenciales con sus propias credenciales. También coloque el archivo llamado "html_file.h" dentro de la carpeta de bocetos de arduino. Todos los archivos de encabezado utilizados en este proyecto se pueden encontrar aquí

Características del código:

Punto de acceso: Dado que es difícil programar cada módulo con las credenciales en producción en masa, el módulo aloja una página web en su primer arranque para aceptar las credenciales del WiFi al que los módulos deben conectarse y almacena en la EEPROM para su uso posterior.

Una vez que se configuran las credenciales, NodeMCU verifica la EEPROM en busca de credenciales y se conecta a las credenciales WiFi presentes en la EEPROM.

Después de conectarse con éxito al WiFi, NodeMCU comienza a cargar los datos en el servidor cada intervalo de tiempo 'x', los datos incluyen datos meteorológicos, dirección MAC del módulo, versión del firmware y ubicación geográfica del dispositivo.

Actualización OTA: el módulo también comprueba si hay nuevas actualizaciones de firmware todos los días a una hora específica especificada en el código. Esta característica es útil ya que ningún fabricante puede continuar y cambiar el programa de un módulo individual en caso de que haya algún cambio que realizar.

Temporizador de vigilancia: Atlast debe haber una forma de recuperarse sin intervención humana si se atasca o se bloquea. Esto se puede lograr utilizando el temporizador Watchdog. La forma en que esto funciona es: Hay una subrutina de interrupción que se ejecuta cada segundo. El ISR incrementa el contador cada vez que se ejecuta y comprueba si el contador ha alcanzado el recuento máximo. Una vez que el contador alcanza el valor máximo, el módulo se reinicia asumiendo que se ha bloqueado. En funcionamiento normal, el contador siempre se pone a cero antes de que alcance el recuento máximo.

Paso 2: configurar el servidor SQL

Configurar el servidor SQL
Configurar el servidor SQL

La configuración de SQL Server también es realmente simple. Simplemente cree una base de datos en el servidor SQL e importe la configuración importando el archivo llamado "database_structure.txt". Puede encontrar el archivo en este paso. Como el instructable no permite cargar archivos ".sql", he cambiado el nombre del archivo a ".txt".

Nota: cambie el nombre del archivo de ".txt" a ".sql".

Paso 3: configurar el servidor de archivos

Configurar el servidor es realmente fácil si posee un sitio web y está alojado en línea. No pasaré por todo el procedimiento para configurar un sitio web y alojarlo, ya que está más allá del alcance de este tutorial. Pero puede alojarlo en su propia PC como localhost para probar el funcionamiento de los archivos.

Dado que Instructable no permite cargar archivos PHP, cambié el nombre de los archivos a ".txt".

Nota: Cambie el nombre de la extensión de los archivos a ".php". Tampoco olvide cambiar las credenciales del archivo "config.php".

Simplemente cargue los archivos en el servidor y estará listo.

Le daré una breve información sobre los archivos PHP.

db_config.php:

En este archivo, se almacenan todas las credenciales necesarias para conectarse al servidor SQL.

db_connect:

En este archivo está presente la clase necesaria para la conexión a la base de datos.

insert.php:

NodeMCU llama a este archivo PHP para cargar los datos en el servidor usando el método GET. Este archivo también es responsable de almacenar los mismos datos en el servidor SQL.

retrieve.php:

El Usuario / Cliente llama a este PHP usando el método GET. El servidor calcula la distancia entre el usuario y todos los módulos. Luego, los datos del módulo más cercano se envían como respuesta al cliente en formato JSON / XML según lo prefiera el cliente.

update.php:

El módulo llama a este archivo PHP todos los días a una hora específica para comprobar si el módulo está ejecutando la última versión del firmware. Simplemente coloque el archivo ".bin" más reciente en el servidor de archivos y especifique el directorio del archivo en la variable del archivo.

Si estos muchos archivos parecen desalentadores al principio, he incluido la documentación del usuario en el siguiente paso.

Paso 4: documentación del usuario

Documentación del usuario
Documentación del usuario
Documentación del usuario
Documentación del usuario

Introducción:

La API meteorológica proporciona una interfaz sencilla para solicitar los datos meteorológicos de ubicaciones en la superficie de la tierra. Solicita la información meteorológica para un par de latitud / longitud específico con el formato de salida especificado. La API devuelve la temperatura, la humedad, la presión y el índice de calidad del aire que registró por última vez el módulo más cercano desde la ubicación solicitada.

Antes de que empieces:

Este documento está destinado a desarrolladores de sitios web y dispositivos móviles que deseen incluir información meteorológica en una aplicación que se está desarrollando. Introduce el uso utilizando la API y material de referencia sobre los parámetros disponibles.

Solicitudes de datos meteorológicos:

Las solicitudes de la API meteorológica se construyen como una cadena de URL. La API devuelve datos meteorológicos de un punto de la tierra, especificados por un par de latitud / longitud. Tenga en cuenta que la precisión de los datos meteorológicos es directamente proporcional a la densidad de los módulos colocados en un área.

Una solicitud de API meteorológica tiene la siguiente forma:

example.com/retrieve.php?lat=25.96446&lon=53.9443&format=json

Donde el formato de salida (formato) puede ser cualquiera de los siguientes valores:

  • JSON (recomendado), indica la salida en notación de objetos JavaScript (JSON); o
  • XML, indica salida en XML, envuelto dentro del nodo.

Parámetros de solicitud:

Como es estándar en todas las URL, los parámetros se separan mediante el carácter comercial (&). La lista de parámetros y sus posibles valores se indican a continuación.

Parámetros requeridos:

  • lat: representa la latitud de una ubicación para buscar. (por ejemplo, lat = 19,56875)
  • lon: Representa la longitud de una ubicación para buscar. (por ejemplo, lon = 72,97568)

Parámetros opcionales:

formato: especifica el formato de salida de respuesta de los datos meteorológicos. Puede ser JSON o XML. El predeterminado es JSON. (por ejemplo, formato = json o formato = xml)

Respuestas meteorológicas:

Para cada solicitud válida, el servicio de zona horaria devolverá una respuesta en el formato indicado en la URL de la solicitud. Cada respuesta contendrá los siguientes elementos:

  • éxito: un valor que indica el estado de la respuesta.

    • 0: negativo; indica que la solicitud tenía un formato incorrecto.
    • 1: afirmativo; indica que la solicitud se realizó correctamente.
  • mensaje: una cadena que indica el motivo de la malformidad de la solicitud. Solo disponible cuando el estado es negativo.
  • datos: una matriz con múltiples parámetros meteorológicos.

    • temp: los datos de temperatura.
    • zumbido: los datos de presencia de humedad.
    • pres: los datos de presión absoluta.
    • aqi: índice actual de calidad del aire.

Los ejemplos de respuesta de ambos formatos se pueden ver en las imágenes.

Paso 5: Configuración del módulo

Configuración del módulo
Configuración del módulo
Configuración del módulo
Configuración del módulo

Se crea un punto de acceso y se aloja una página web en una dirección IP (predeterminado: 192.168.4.1) para recibir las credenciales del administrador / usuario del dispositivo en el primer arranque o si el módulo no encuentra las credenciales ya almacenadas en el EEPROM.

El usuario debe ingresar el SSID y la contraseña a la que desea que se conecte el módulo. La latitud y la longitud se completan automáticamente si permite que el navegador acceda a la ubicación.

Una vez que se ingresan todos los detalles, haga clic en el botón "ENVIAR", y luego todas las credenciales se escriben en la EEPROM del módulo.

Este paso es muy crucial ya que mientras se producen los módulos en masa, no es factible programar todos los módulos con sus datos de ubicación exactos y credenciales WiFi. Además, no es recomendable codificar las credenciales en el programa, ya que si necesitamos reubicar el módulo en otra ubicación o queremos cambiar las credenciales de WiFi, tendremos que reprogramar el módulo. Para evitar esta molestia, se implementa la función de configuración inicial.

Paso 6: Ahora es el momento de contribuir con datos a la nube

Ahora es el momento de aportar datos a la nube
Ahora es el momento de aportar datos a la nube
Ahora es el momento de aportar datos a la nube
Ahora es el momento de aportar datos a la nube

Después de completar todos los pasos anteriores, ahora es el momento de dejar que el módulo cargue los datos en el servidor. Comienza a cargarse automáticamente una vez que haya guardado las credenciales.

Llama al "insert.php" como una llamada a la API con el paso de todos los parámetros para enviar en el método GET.

El siguiente fragmento de código muestra cómo se procesan los parámetros.

if (isset ($ _ GET ['temp']) && isset ($ _ GET ['hum']) && isset ($ _ GET ['pres']) && isset ($ _ GET ['aqi']) && isset ($ _ GET ['mac']) && isset ($ _ GET ['lat']) && isset ($ _ GET ['lon'])) 2. {3. // programa principal 4.}

Así, todos los módulos comienzan a cargar los datos.

Nota: Disminuya la frecuencia de carga en el código si cree que el servidor se está sobrecargando.

Paso 7: Actualización por aire (OTA)

Actualización por aire (OTA)
Actualización por aire (OTA)

Una vez que el módulo está todo configurado y comienza a cargar los datos, verifica si hay actualizaciones de firmware todos los días a una hora específica mencionada en el programa. Si encuentra alguno, descarga y muestra el archivo binario en él. Y si no es así, se continúa con la operación normal de carga de datos.

Para verificar si hay una nueva actualización, el módulo llama al "update.php" enviando la dirección MAC en su encabezado de solicitud. Luego, el servidor verifica si esa dirección MAC específica tiene alguna actualización nueva, en caso afirmativo, envía el archivo binario del último firmware en respuesta.

También comprueba todos los encabezados necesarios para la autenticación básica del módulo.

Paso 8: Cómo el usuario / cliente puede acceder a los datos …

Cómo el usuario / cliente puede acceder a los datos …
Cómo el usuario / cliente puede acceder a los datos …
Cómo el usuario / cliente puede acceder a los datos …
Cómo el usuario / cliente puede acceder a los datos …
Cómo el usuario / cliente puede acceder a los datos …
Cómo el usuario / cliente puede acceder a los datos …

Es bastante sencillo acceder a los datos del servidor. Con solo llamar a "retrieve.php", obtendremos los datos meteorológicos en respuesta en formato JSON. Después de eso, solo es cuestión de analizar los datos JSON para acceder a los elementos individuales. Similar es con la respuesta XML. El usuario siempre puede especificar el formato de respuesta preferido en el que se sienta cómodo para trabajar. Si el usuario no especifica el formato, el formato predeterminado es JSON.

Se realiza una solicitud de muestra utilizando la herramienta POSTMAN para verificar el funcionamiento de la API.

En el fragmento de código a continuación se muestra un ejemplo de cómo analizar la respuesta JSON en javascript.

var url = "https://example.com/retrieve.php?lat=19.044848&lon=72.8464373";function httpGet (theUrl) {var xmlHttp = new XMLHttpRequest (); xmlHttp.open ("OBTENER", theUrl, falso); // falso para solicitud síncrona xmlHttp.send (nulo); return xmlHttp.responseText; } var myVar = httpGet (url); var obj = JSON.parse (myVar); document.getElementById ("aqi"). innerHTML = obj.data [0].aqi; document.getElementById ("temperatura"). innerHTML = Math.round (obj.data [0].temp) + "° C"; document.getElementById ("temp"). innerHTML = Math.round (obj.data [0].temp) + "° C"; document.getElementById ("humedad"). innerHTML = Math.round (obj.data [0].hum) + "%"; document.getElementById ("presión"). innerHTML = Math.round (obj.data [0].pres) + "mb";

El código fuente de la página HTML de ejemplo que analiza la respuesta JSON está disponible al final de este paso.

Nota: cambie la extensión del archivo a ".html".

Paso 9: Limitaciones de este proyecto

  • El proyecto utiliza GET para enviar los datos; a pesar de que no se trata de datos sensibles, los datos se pueden manipular fácilmente ya que no tiene ningún mecanismo para verificar la autenticidad de la fuente aparte de verificar los encabezados, que pueden modificarse fácilmente e incluso un dispositivo normal puede falsificarse para parecer un módulo meteorológico.
  • Dado que el módulo solo depende y depende de otro punto de acceso (WIFI) para enviar los datos que en la mayoría de los casos serían de otras organizaciones. Si el punto de acceso no está en servicio por alguna razón, el módulo no podrá enviar datos.
  • A pesar de que el proyecto está construido para aumentar la precisión del sistema existente, el sensor disponible en el mercado es menos preciso de lo esperado, lo que en consecuencia conduce a fallar en su propósito principal.
  • Mientras planificaba el proyecto, planeé incluir un modo en el que el servidor promedia el valor de los datos según la ubicación para la corrección de errores. Pero al implementar esta función, me di cuenta de que necesitaba algunas API de terceros para traducir las coordenadas a regiones geográficas.

Paso 10: Mejoras adicionales que se pueden realizar en este proyecto

  • La precisión del módulo se puede mejorar aún más adaptando especialmente los sensores para el propósito específico en lugar de utilizar el módulo genérico que está disponible en el mercado.
  • El módulo se puede modificar para que funcione de forma aún más independiente mediante el uso de un chip especial que se comunica de forma inalámbrica con las torres de telefonía móvil para enviar los datos, mejorando así la tolerancia a fallos.
  • El panel solar y el sistema de batería se pueden usar junto con el modo de suspensión profunda de ESP, mejorando así la eficiencia energética y haciéndolo más independiente de una fuente de alimentación externa.
  • POST se puede utilizar para enviar datos con algún mecanismo de autenticación, como el uso de códigos cíclicos para cada transmisión de datos.
  • En lugar de NodeMCU, que es una placa de creación de prototipos, podemos usar un microcontrolador personalizado en la producción en masa que no solo reduce el costo sino que también hace el mejor uso de los recursos del sistema.
  • Junto con la API de geolocalización de Google y conectándose a cualquier WIFI abierto disponible, el módulo puede funcionar sin siquiera configurarlo; listo para transmitir datos de fábrica sin necesidad de configuración alguna.

Paso 11: Algunas palabras para la audiencia

Algunas palabras para la audiencia
Algunas palabras para la audiencia

Hola chicos, me doy cuenta de que este no es un tutorial para principiantes en absoluto, ya que no he mencionado todos los detalles que deben cubrirse. Y también este proyecto es realmente vasto para ser cubierto en un Instructable. Aún así, hice todo lo posible para cubrir todos los aspectos importantes del proyecto. También sé que un video que muestre el funcionamiento del proyecto hubiera sido realmente genial, pero como este es mi primer instructable y, para ser honesto, esta es mi primera publicación de algo similar a esto, estaba bastante nervioso de estar frente a un cámara.

Si necesitan ayuda para hacer este proyecto o algo similar, comuníquense conmigo en [email protected] o pueden dejar un comentario como siempre. Intentaré ayudarlos lo mejor que pueda.

¡¡Gracias!!

Recomendado: