Projetando estação meteorológica ESP8266 usando OpenWeatherMap

Diseño de la estación meteorológica ESP8266 usando OpenWeatherMap

Monitorear las condiciones climáticas es una tarea importante en muchas actividades humanas. Hay varios campos como la agricultura, el turismo, el transporte, etc., que se ven afectados por el cambio climático. Considerando la importancia del monitoreo del clima, existen plataformas globales que monitorean las condiciones climáticas en todo el mundo. Estas plataformas son ecosistemas de IoT a los que se puede acceder en línea. Es posible diseñar dispositivos electrónicos personalizados que puedan conectarse a dichas plataformas y recuperar datos relacionados con el clima desde la plataforma en la nube.
Una de esas plataformas globales es Open Weather Map, un servicio en línea que proporciona datos meteorológicos a servicios web y aplicaciones móviles. Proporciona más de mil millones de predicciones todos los días en todo el mundo. Hay más de un millón de usuarios de esta plataforma y cada día se añaden miles de nuevos suscriptores. La plataforma proporciona más de 20 API para representar datos relacionados con el clima . En este proyecto se diseñará un dispositivo basado en ESP8266 que pueda conectarse a una de las API proporcionadas por Open Weather Map y así mostrar datos meteorológicos en una pantalla LCD.
El dispositivo IoT diseñado aquí es una estación meteorológica construida conectando una pantalla LCD con la placa ESP8266. El dispositivo busca datos meteorológicos del lugar donde está instalado y los muestra en la pantalla LCD. Cabe señalar que no se utilizan sensores en este dispositivo y el dispositivo obtiene los datos meteorológicos de una plataforma de IoT, es decir, Open Weather Map. El dispositivo obtiene información de temperatura y precipitación mediante claves API y la muestra en la pantalla LCD. El ESP8266 es un módem Wi-Fi y puede conectarse a un punto de acceso Wi-Fi o enrutador conociendo el SSID y la contraseña. Usando la clave API, el módulo ESP puede acceder a los datos del servicio IoT. El ESP8266 es un módulo compatible con Arduino. Debe cargarse con firmware que pueda recuperar datos recibidos a través de Internet y mostrarlos en la pantalla LCD. Arduino UNO se utiliza para actualizar el código de firmware en el módulo ESP8266. El módulo ESP también se puede actualizar con código utilizando un convertidor FTDI como CP2102. El firmware en sí está escrito en el IDE de Arduino.
Protótipo de estação meteorológica baseada em ESP8266 e OpenWeatherMap
Figura 1: Prototipo de estación meteorológica basado en ESP8266 y OpenWeatherMap
Componentes necesarios –
Lista de componentes necessários para fazer estação meteorológica baseada em ESP8266 e OpenWeatherMap
Fig. 2: Lista de componentes necesarios para fabricar estaciones meteorológicas basadas en ESP8266 y OpenWeatherMap
Diagrama de bloques -
Diagrama de blocos da estação meteorológica baseada em ESP8266 e OpenWeatherMap
Fig. 3: Diagrama de bloques de una estación meteorológica basada en ESP8266 y OpenWeatherMap
Conexiones de circuito –
El dispositivo IoT de monitoreo del clima diseñado en este proyecto se construye conectando una pantalla LCD de caracteres al módulo ESP8266. En este proyecto se utiliza el modelo ESP-01 que tiene solo dos pines GPIO. No es posible interconectar una pantalla LCD con solo dos pines GPIO. Por lo tanto, se utiliza un expansor de E/S de 8 bits para el bus I2C (PCF8574P) para interconectar la pantalla LCD con el módem PES . El módem ESP se puede conectar a cualquier punto de acceso Wi-Fi por sí solo. Para programar el módulo ESP, se conecta a la PC mediante un convertidor USB FTDI tipo CP2102. Una vez que el código se escribe en el módulo, este es alimentado por un circuito regulador de voltaje.
Imagem mostrando conexões de circuito do ESP8266 e estação meteorológica baseada em OpenWeatherMap
Fig. 4: Imagen que muestra las conexiones del circuito de ESP8266 y la estación meteorológica basada en OpenWeatherMap
El dispositivo tiene los siguientes componentes conectados como se menciona:
Módem Wi-Fi ESP8266: el propio módem Wi-Fi ESP8266 controla la funcionalidad del dispositivo. Debe cargarse con un código de programa que pueda acceder a la API y controlar la pantalla LCD. El código del firmware se escribe utilizando Arduino IDE. Se carga en la placa ESP8266 mediante el convertidor FTDI USB a serie. En este proyecto se utiliza una placa ESP8266 genérica. Esta placa no cuenta con resistencias de arranque, regulador de voltaje, circuito de reinicio y adaptador serial USB. El módulo ESP8266 funciona con una fuente de alimentación de 3,3 V con una corriente mayor o igual a 250 mA. Por lo tanto, el adaptador USB a serie CP2102 se utiliza para suministrar voltaje de 3,3 V con suficiente corriente para hacer funcionar el ESP8266 de manera confiable en todas las situaciones.
El módulo Wi-Fi ESP8266 es un SOC independiente con una pila de protocolo TCP/IP integrada que puede acceder a una red Wi-Fi. El ESP8266 es capaz de alojar una aplicación o descargar todas las funciones de la red Wi-Fi desde otro procesador de aplicaciones. Cada módulo ESP8266 viene preprogramado con el firmware del conjunto de comandos AT. El módulo está disponible en dos modelos: ESP-01 y ESP-12. El ESP-12 tiene 16 pines disponibles para interconexión, mientras que el ESP-01 solo tiene 8 pines disponibles para su uso. El ESP-12 tiene la siguiente configuración de pines:
Tabela de listagem de configuração de pinos do módulo ESP8266 ESP-12
Fig. 5: Tabla que enumera la configuración de pines del módulo ESP8266 ESP-12
En el proyecto se utiliza el modelo ESP-01. El modelo ESP-01 tiene la siguiente configuración de pines:
Tabela de listagem de configuração de pinos do módulo ESP8266 ESP-01
Fig. 6: Tabla que enumera la configuración de pines del módulo ESP8266 ESP-01
Los pines Chip Enable y VCC del módulo están conectados a 3,3 VCC mientras que el pin de tierra está conectado a tierra común. El pin de habilitación del chip está conectado a VCC mediante una resistencia pull-up de 10K . El pin RESET está conectado a tierra a través de un interruptor táctil donde el pin se alimenta por VCC a través de una resistencia pull-up de 10K de forma predeterminada. El pin GPIO-0 del módulo está conectado a tierra a través de un interruptor táctil donde el pin se suministra a VCC a través de una resistencia pull-up de 10K de forma predeterminada. Estas resistencias pull-up actúan como un circuito divisor de voltaje que protege la placa ESP8266 del alto voltaje.
El CP2102, que es un puente USB a UART de un solo chip, se utiliza para cargar firmware en el módem PES . También proporciona suministro de energía al módulo ESP mientras se carga el arranque . Un IC CP2102 tiene la siguiente configuración de pines:
Tabela de listagem de configuração de pinos do chip CP2101 USB para UART
Fig. 7: Tabla que enumera la configuración de pines del chip CP2101 USB a UART
Tabela de listagem de configuração de pinos do chip CP2101 USB para UART
Fig. 8: Tabla que enumera la configuración de pines del chip CP2101 USB a UART
Tabela de listagem de configuração de pinos do chip CP2101 USB para UART
Fig. 9: Tabla que enumera la configuración de pines del chip CP2101 USB a UART
La placa ESP está conectada al CP2102 para el modo de carga de arranque y para fines de uso. Para el arranque , el pin TX del ESP-01 se conecta al pin RX del CP2102 y el pin RX del ESP se conecta al TX del CP2102 para que ambos puedan enviar y recibir los datos. El ESP8266-01 necesita una fuente de alimentación de 3.3V, por lo que el VCC del ESP está conectado al 3V3 del CP2102 y los GND de ambos deben estar conectados entre sí. El pin de reinicio de ESP8266 junto con la resistencia pull-up de 10k (resistencia de arranque) está conectado al pin RTS de CP2102. GPIO0 es un pin de programación utilizado para poner el ESP-01 en modo de programación. El GPIO0 junto con la resistencia pull-up de 10K está conectado al pin DTR de CP2102. El pin CHPD del ES-01 se levanta con una resistencia de 10 mil . Las conexiones del circuito entre el módulo ESP y el CP2102 se resumen en la siguiente tabla:
Tabela de listagem de conexões de circuito entre o modem ESP8266 ESP-01 e o módulo CP2101
Fig. 10: Tabla que enumera las conexiones del circuito entre el Módem ESP8266 ESP-01 y el Módulo CP2101
Después de conectar el módulo ESP al adaptador CP2102, se debe conectar el adaptador a la PC y cargar el módulo ESP con el código de firmware.
Durante la compilación del código, se deben presionar los interruptores GPIO0 y RESET. Para cargar el programa se debe soltar la tecla RESET mientras se deja presionada la tecla de programación GPIO0, para que el ESP pueda entrar en modo programación. Después de cargar el código, también se debe liberar la clave de programación.
Entonces, escriba el código del firmware en Arduino IDE y conecte el convertidor FTDI a la PC mediante un cable USB. Abra el IDE de Arduino y vaya a Herramientas->Puerto y seleccione la placa Arduino (Arduino UNO). Podría verse como /dev/ttyABM0 (Arduino/ Genuine One). Seleccione el nombre del puerto correcto. El nombre del puerto puede ser diferente en diferentes configuraciones IDE. Luego abra el monitor serie en el IDE de Arduino navegando a Herramientas->Monitor serie y establezca la velocidad en baudios en 115.200 baudios por segundo. Pase los comandos 'AT' y 'AT+GMR' para probar la conexión entre el Arduino y el módulo ESP-01. Pruebe diferentes configuraciones para la opción 'Fin de línea' del monitor serie, como NL y CR. Pruebe diferentes combinaciones hasta que el módulo ESP comience a interactuar correctamente con el monitor serie.
Descargue Python, PIP y ESPtool. Borre el firmware precargado si el módulo ESP tiene alguno. Actualice el código de firmware para el módulo ESP-01 escribiendo comandos en el monitor serie de acuerdo con las instrucciones de ESPtool. Consulte el siguiente enlace para escribir el comando adecuado para actualizar el código de firmware usando ESPtool:
Comandos de la herramienta ESP
Para cargar el programa, se debe soltar el interruptor RESET mientras se debe dejar presionado el interruptor de programación GPIO0. Después de cargar el código, también se debe liberar la clave de programación. GPIO2 es un TX alternativo para el modo de gestor de arranque.
Retire las conexiones. Ahora el módulo ESP está listo para ser instalado en el circuito del proyecto. Tras cargar el código, el módulo ESP accederá automáticamente al punto Wi-Fi con el SSID proporcionado en el firmware. En el circuito del proyecto, el ESP8266 interactúa con la pantalla LCD de caracteres a través del expansor de E/S PCF8574P.
Expansor de E/S PCF8574: el expansor de E/S PCF8574 se utiliza para interconectar la pantalla LCD con el módem ESP. El PCF8574/74A proporciona expansión de E/S remotas de uso general a través del bus I2C bidireccional de dos cables (reloj serie (SCL), datos serie (SDA)). Los dispositivos constan de ocho puertos cuasi bidireccionales, una interfaz de bus I2C de 100 kHz, tres entradas de dirección de hardware y una salida de interrupción que opera entre 2,5 V y 6 V. El puerto cuasi bidireccional se puede asignar de forma independiente como entrada para monitorear el estado de la interrupción o teclados. , o como salida para activar dispositivos indicadores como LED. El maestro del sistema puede leer desde el puerto de entrada o escribir en el puerto de salida a través de un único registro. El PCF8574P tiene la siguiente configuración de pines:
Tabela de listagem de configuração de pinos do PCF8574P
Fig. 11: Tabla que enumera la configuración de pines del PCF8574P
La pantalla LCD está conectada al PCF8574P que conecta la pantalla al módem PES . Los pines SDA (Pin 14) y SCL (Pin 15) del IC están conectados al GPIO01 y GPIO2 del ESP8266 respectivamente. Las conexiones del circuito del módulo LCD con el PCF8574P se resumen en la siguiente tabla :
Tabela de listagem de conexões de circuito entre PCF8574P e módulo LCD
Fig. 12: Tabla que enumera las conexiones del circuito entre PCF8574P y el módulo LCD
Fuente de alimentación: una vez que el módem ESP esté cargado con el código de firmware, se conectará al circuito principal. En el circuito se alimenta mediante una batería o cualquier otra fuente de alimentación de CC. El módem requiere 3,3 V CC para funcionar. La energía de la batería se regula a 3,3 V CC mediante 1117 IC. El suministro de la batería está conectado al pin Vin del IC mientras que el voltaje regulado se extrae del pin Vout. El pin de sintonización del IC está conectado a tierra. Hay dos condensadores de 10 uF conectados a los pines de entrada y salida para suavizar cualquier ondulación.
Cómo funciona el circuito –
Una vez que el módem esté instalado en el dispositivo y encendido, comenzará a buscar el punto de acceso Wi-Fi disponible. Se conecta a un punto de acceso Wi-Fi mediante el SSID y la contraseña codificados en el código del firmware. El módulo ESP ahora está listo para recuperar datos del servicio Open Weather Map. Se conecta a OpenWeatherMap.org con una API de código abierto. La API proporcionada por Open Weather Map se puede utilizar para acceder a una variedad de datos relacionados con el clima para una ubicación. Consulte los datos disponibles de la API Open Weather Map en el siguiente enlace del sitio web:
API OpenWeatherMap
El módem ESP está programado para solicitar datos meteorológicos, es decir, temperatura y humedad actuales de una ubicación de OpenWeatherMap.org. Se envía una solicitud HTTP a través del método POST al servicio en la nube, al que responde enviando datos meteorológicos en formato JSON. El dispositivo debe estar suscrito a la API del sitio web Open Weather Map.
Captura de tela do site da API OpenWeatherMap
Fig. 13: Captura de pantalla del sitio web de la API OpenWeatherMap
Cuando hace clic en el botón de registro, el sitio web navega a los planes disponibles para el servicio. El plan gratuito se utiliza aquí con fines de demostración.
Luego, los datos recuperados del sitio web se muestran en la pantalla LCD. En este plan, se puede acceder a las actualizaciones de datos meteorológicos cada 2 horas y al pronóstico de 5 días.
Captura de tela dos planos da API OpenWeatherMap
Figura 14: Captura de pantalla de los planes de la API de OpenWeatherMap
Al hacer clic en el botón Obtener API e iniciar, el sitio web navega a un asistente donde el desarrollador debe registrarse para obtener la clave API.
Captura de tela da assinatura da API OpenWeatherMap
Fig. 15: Captura de pantalla de la suscripción a la API OpenWeatherMap
El registro se puede realizar con una identificación de correo electrónico. Después de registrarse, el desarrollador puede usar la clave API para acceder a los datos meteorológicos. La clave API proporcionada tras una suscripción exitosa se utiliza en el firmware para acceder a los datos meteorológicos.
Captura de tela da página de inscrição da API OpenWeatherMap
Fig. 16: Captura de pantalla de la página de registro de la API OpenWeatherMap
Los datos meteorológicos obtenidos del servicio en la nube se agrupan en cadenas adecuadas y se muestran en el módulo LCD. El módem ESP envía los datos al módulo LCD en un protocolo de dos cables que se convierte en datos paralelos utilizando el expansor de E/S PCF8574P.
Guía de programación –
El código ESP comienza importando las bibliotecas necesarias. Los archivos de encabezado Es son importados. La biblioteca es utilizado por el módem ESP para hacer ping al archivo JSON, mientras que la biblioteca le permite conectarse y configurar una conexión Wi-Fi.
Captura de tela do código C usado para inicialização na estação meteorológica IoT baseada em modem ESP
Figura 17: Captura de pantalla del código C utilizado para la inicialización en una estación meteorológica IoT basada en módem ESP
Las siguientes configuraciones deben administrarse en el código de firmware:
a) Inicialización de Variables para almacenar los datos recibidos.
a) Inicialización de la conexión Wi-Fi con Nombre y Contraseña de Wi-Fi utilizando las variables SSID y Contraseña.
b) Definir clave API para acceder a datos meteorológicos y configurar el idioma.
Estos ajustes se realizan en la función Configuración. Se inicia una conexión en serie utilizando Serial.begin(115200). La velocidad en baudios está configurada en 115200 para la comunicación en serie. Se debe configurar la misma velocidad en baudios en el monitor serie del IDE de Arduino para ver la salida de respuesta del ESP8266. La conexión Wi-Fi se configura con el siguiente código:
Wifi.begin ( contraseña SSID );
Mientras el ESP todavía se está conectando, todavía hay algo de retraso, por lo que algunos mensajes y umbrales se imprimen en la pantalla LCD mientras el módem se conecta a un punto de acceso o enrutador. Estos puntos se pueden ver después de iniciar sesión en el terminal serie. Es sólo una forma de ver que el pequeño ESP está intentando conectarse. Luego, la pantalla LCD se inicializa para mostrar datos meteorológicos.
Captura de tela do código C usado na função de configuração da estação meteorológica IoT baseada em modem ESP
Figura 18: Captura de pantalla del código C utilizado en la función de configuración de la estación meteorológica IoT basada en módem ESP
La función de bucle se ejecuta después de la función de configuración y se itera infinitamente. En la función de bucle, se llama a la función getWeatherData donde se conecta a api.openweathermap.org para recuperar los datos meteorológicos que están en formato JSON con respecto a la ciudad específica. Luego, los datos recopilados se almacenan en las variables globales previamente declaradas. Los valores recopilados se imprimen en la pantalla LCD para su seguimiento.
Captura de tela do código C usado na função Loop da estação meteorológica IoT baseada em modem ESP
Fig. 19: Captura de pantalla del código C utilizado en la función Loop de la estación meteorológica IoT basada en módem ESP
Consulte el código completo en la sección de códigos y pruébelo.
Se trata de una estación meteorológica sencilla que utiliza un servicio de IoT para acceder a información meteorológica. Es sencillo de diseñar y puede instalarse como un dispositivo inteligente en el hogar o la oficina.

Código fuente del proyecto

 ###



 //Programa para

 //Bibliotecas para ESP, json y I2C LCD

 #incluir 

#incluir 

#incluir 

#incluir 


Cliente WiFiClient;

 Cliente WiFiClientSecure;

 LiquidCrystal_I2C lcd (0x20,16,2);


 //Inicializa la variable para almacenar los datos.

 Cadena climaMain = "";

 Cadena meteorologíaDescripción = "";

 Cadena ubicación meteorológica = "";

 País de cuerda;

 humedad interna;

 presión interna;

 temperatura interna;

 int tempMin, tempMax;

 nubes internas;

 int velocidad del viento;

 Cadena meteorológicaCadena;


 char tempT(5),tempMinT(5),tempMaxT(5);

 char humi(5),presione(5),nubes(5),Velocidad del viento(5);


 //Nombre y contraseña de WiFi

 const char* ssid = "********"; //SSID de la red local

 const char* contraseña = "********"; // Contraseña en la red


 // clave de API de openweathermap.org: 8b2f088e8a9c307c759ef39dcb085ae4
 
Cadena climaKey = "8b2f088e8a9c307c759ef39dcb085ae4"; // clave openweathermap.org

 String meteorLang = "&lang=es"; //inglés u otro idioma


 //Pantalla LCD de caracteres especiales

 byte arriba(8) = {

 0b00100,

 0b01110,

 0b10101,

 0b00100,

 0b00100,

 0b00100,

 0b00100,

 0b00000

 };

 byte hacia abajo (8) = {

 0b00000,

 0b00100,

 0b00100,

 0b00100,

 0b00100,

 0b10101,

 0b01110,

 0b00100

 };



 configuración vacía

 {

 Cable.begin(2, 0);

 //Velocidad en baudios para comunicación serial

 Serie.begin(115200);

 // inicializando la pantalla LCD

 lcd.init;

 //Habilitar o activar el texto

 pantalla LCD;

 // Habilitar o encender la luz de fondo

 LCD luz de fondo;

 lcd.createChar(1,arriba);
 
lcd.createChar(2,abajo);

 Serial.print("Conectándose a WiFi ");

 lcd.setCursor(0,0);

 lcd.print("Conectando a...");

 lcd.setCursor(0,1);

 lcd.print("WiFi");

 WiFi.begin(ssid, contraseña);

 mientras (WiFi.estado! = WL_CONNECTED)

 {

 retraso(500);

 Serie.print(".");

 }

 lcd.claro;

 retraso(2000);

 Serial.println("");

 Serial.print("MiIP: "); Serial.println(WiFi.localIP);

 lcd.setCursor(0,0);

 lcd.print("MI IP local: ");

 lcd.setCursor(0,1);

 lcd.println(WiFi.localIP);

 retraso(4000);

 lcd.claro;

 }


 bucle vacío

 {



 obtener datos meteorológicos;

 retraso(5000);

 }


 const char *weatherHost = "api.openweathermap.org";


 anular getWeatherData

 {

 Serial.print("conectándose a "); Serial.println(weatherHost);

 retraso(4000);

 lcd.claro;

 //conexión al sitio web anfitrión para obtener los datos meteorológicos

 si (cliente.connect(weatherHost, 80))

 {

 client.println(String("GET /data/2.5/weather?q=erode,india&") + "&units=metric&apprn" +

 "Anfitrión: " + WeatherHost + "rnUser-Agent: ArduinoWiFi/1.1rn" +
 
"Conexión: más cerca");

 }

 demás

 {

 Serial.println("falló la conexión");

 devolver;

 }

 Línea de cuerda;

 int contador de repetición = 0;

 while (!cliente.disponible && repetirContador < 10)

 {

 retraso(500);

 Serial.println("w.");

 repetirContador++;

 }

 mientras (cliente.conectado && cliente.disponible)

 {

 char c = cliente.leer;

 si (c == '(' c == ')') c=" ";

 línea += c;

 }


 cliente.parada;


 DynamicJsonBuffer jsonBuf;

 JsonObject &root = jsonBuf.parseObject(línea);

 si (!root.éxito)

 {

 Serial.println("falló el análisis del objeto");

 devolver;

 }


 descripción del tiempo = root("tiempo")("descripción").as ;

 descripción del tiempo.toLowerCase;

 temp = root("principal")("temp");

 humedad = raíz("principal")("humedad");

 presión = raíz("principal")("presión");

 tempMin = root("principal")("temp_min");

 tempMax = root("principal")("temp_max");

 velocidad del viento = root("viento")("velocidad");

 nubes = raíz("nubes")("todos");

 Serial.println(String("temp=")+temp);

 Serial.println(String("temp_min=")+tempMin);
 
Serial.println(String("temp_max=")+tempMax);

 Serial.println(String("presión=")+presión);

 Serial.println(String("humedad=")+humedad);

 Serial.println(String("wind_speed=")+windSpeed);

 Serial.println(String("nubes=")+nubes);

 lcd.setCursor(0,0);

 lcd.print("TEMP:");

 lcd.setCursor(5,0);

 lcd.print(temp);

 lcd.setCursor(7,0);

 lcd.imprimir(",");

 lcd.setCursor(8,0);

 lcd.print(tempMin);

 lcd.setCursor(10,0);

 lcd.escribir(2);

 lcd.setCursor(11,0);

 lcd.imprimir(",");

 lcd.setCursor(12,0);

 lcd.print(tempMax);

 lcd.setCursor(14,0);

 lcd.escribir(1);

 prensaHumiCloud;

 }


 prensa vacíaHumiCloud

 {

 lcd.setCursor(2,1);

 lcd.print("Presión:");

 lcd.setCursor(11,1);

 printDigits2(presión);

 retraso(1000);

 lcd.setCursor(0,1);

 lcd.imprimir(" ");

 lcd.setCursor(2,1);

 lcd.print("Humedad:");

 lcd.setCursor(11,1);

 printDigits2(humedad);

 lcd.print("%");

 retraso(1000);

 lcd.setCursor(0,1);

 lcd.imprimir(" ");

 lcd.setCursor(1,1);

 lcd.print("Velocidad del viento:");

 lcd.setCursor(11,1);
 
printDigits2(velocidad del viento);

 lcd.print("m/s");

 retraso(1000);

 lcd.setCursor(0,1);

 lcd.imprimir(" ");

 lcd.setCursor(2,1);

 lcd.print("Nubes:");

 lcd.setCursor(9,1);

 printDigits2(nubes);

 lcd.print("%");

 retraso(1000);

 }


 //esta función void es realmente útil; agrega un "0" al comienzo del número,

 //para que 5 minutos se muestren como "05", en lugar de "5"

 void printDigits2(int dígitos)

 {

 si(dígitos < 1000)

 {

 lcd.imprimir("0");

 lcd.print(dígitos);

 }

 demás

 {

 lcd.print(dígitos);

 }

 }

 ### 

Diagramas de circuito

Diagrama de circuito-ESP8266-Estación meteorológica basada en OpenWeatherMap

Vídeo del proyecto

contenido relacionado

Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.