Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Estación Meteorológica IoT Portátil con Arduino Nano 33 IoT

Componentes y suministros

Componente Cantidad
Arduino Nano 33 IoT 1
Sensor BME280 (temperatura, humedad, presión) 1
Pantalla OLED 0.96" 128x64 1
Caja plástica 3.9" x 2.7" 1
Cable Micro USB 1
Cables jumper macho-hembra para protoboard 1
Cargador USB de pared 1

Herramientas necesarias

Aplicaciones y servicios online

Sobre el proyecto

Hay muchas apps para conectar smartphone a IoT. He probado varias y suelo decepcionarme. No es el caso de Blynk: flexible, interfaz bonita, compatible con muchas plataformas IoT, funciona en Android e iPhone, y gratis para aficionados. Este proyecto IoT sencillo me permitió explorar Blynk.

Hardware

Hardware simple: Arduino Nano 33 IoT (gestiona WiFi), sensor BME280 (temperatura, humedad, presión barométrica en una unidad), pantalla OLED 1". Todos funcionan a 3.3V. La pantalla es opcional (el objetivo es ver datos en el móvil), pero facilita mucho poner todo en marcha antes de lidiar con Blynk.

El esquemático muestra la interconexión. Sensor y pantalla usan I2C. En teoría un bus I2C soporta múltiples dispositivos, pero las librerías del sensor y la pantalla tenían conflictos, así que usé dos puertos I2C distintos. Sensor en I2C por defecto en pines analógicos A4 (SDA) y A5 (SCL). Pantalla en I2C secundario en pines digitales 4 (SCL) y 5 (SDA) —sí, están invertidos: SDA es pin digital 5.

Estación Meteorológica IoT Portátil con Arduino Nano 33 IoT

Todo en caja plástica pequeña con frontal transparente para ver la pantalla. Plástico para transparencia a RF (WiFi). Debe ser resistente a intemperie, pero sensor expuesto al exterior por agujero 1/2" en la base. Sensor colocado justo dentro del agujero. Fijado todo con silicona caliente; para exterior en verano, mejor epoxi.

Alimentación por cable USB: permite programar o alimentar con un solo cable saliendo de la caja. Conecta a PC para programar o a cargador USB enchufable para uso como estación meteorológica.

Software

Código en Arduino es básicamente mezcla de ejemplos de librerías del sensor, pantalla y Blynk. Librerías: Adafruit_BME280_Library (sensor), ss_oled (pantalla), Blynk (Blynk). Las tres se instalan desde el gestor de librerías de Arduino. Experimenta con cada una por separado para entenderlas.

Blynk tiene ejemplos de configuración hardware: examples.blynk.cc. No lista Nano 33 IoT como soportado, pero Blynk soporta WiFiNINA, que usa Nano 33 IoT y otros. Añadiendo estos includes se soluciona:

#include <WiFiNINA.h>
#include <BlynkSimpleWiFiNINA.h>

Otro include necesario: #include <avr/dtostrf.h> para convertir números del sensor a strings para mostrar en OLED. Un detalle: Blynk muestra datos sia como string o número. Al principio envié a Blynk el mismo string que a OLED. Funcionaba para mostrar números, pero fallaba al añadir gráficos. Para gráficos, Blynk necesita números reales.

Nota: La presión barométrica se suele reportar corregida a nivel del mar. A mayor altitud, presión baja; para corregir valores del sensor a equivalente a nivel del mar, suma ~1 pulgada Hg por cada 1000 pies de altitud. En mi código verás +1.3 para mi altitud 1300 pies. Cambia este valor según tu altitud. La regla 1" Hg / 1000 pies es aproximada; para corrección precisa, hay tablas online.

Estación meteorológica sin Blynk

Ya puedes montar hardware y usar mi código adjunto para mostrar datos en OLED. Comenta línea Blynk.begin() en setup() para que funcione sin Blynk. (Si no la comentas y no hay conexión Blynk válida, el sketch se bloquea ahí.) En siguiente sección, configuración Blynk en sketch y smartphone.

Blynk

Blynk es fácil de instalar en iPhone/Android y tiene documentación detallada: docs.blynk.cc. Pero tanta info y opciones pueden confundir al principio; aquí mi versión para empezar.

Usé Blynk con iPhone, pero experiencia similar en Android. Tras instalar app, crea cuenta. Dentro de app, crea nuevo proyecto. Te dan código de autenticación para vincular hardware con proyecto. Primer objetivo: conectar hardware vía WiFi a tu proyecto Blynk. Prueba con sketch por defecto Blynk Blink en examples.blynk.cc, que enciende/apaga LED integrado en Nano 33 IoT. Sugiero conseguir que funcione antes de intentar la estación meteorológica.

Ya hablamos de configurar software para Nano 33 IoT con Blynk. En examples.blynk.cc, por defecto usa ESP8266. Busca #include <ESP8266WiFi.h> y #include <BlynkSimpleEsp8266.h> y cámbialos por #include<WiFiNINA.h> y #include<BlynkSimpleWiFiNINA.h> para Nano 33 IoT.

Además de soporte WiFiNINA, añade credenciales WiFi y código auth de tu proyecto Blynk. Explicaremos control LED en un momento, pero primero verifiquemos conexión. Con sketch Blynk Blink bien configurado y corriendo, abre Monitor Serie de Arduino y verás conexión a servidor Blynk en la nube. Ahora deja hardware y trabaja con app Blynk en el móvil.

Reconozco que la app Blynk me resultó algo confusa. Icono sup. izq: seleccionar proyectos / cerrar sesión. Sup. der: entrar/salir modo edición. El central depende de dónde estés.

Estación Meteorológica IoT Portátil con Arduino Nano 33 IoT

Para controlar LED integrado, entra modo edición. Verás pantalla en blanco. Desliza izq para ver caja de herramientas (widgets). Selecciona botón (clic) y aparecerá en pantalla principal. Clic en él para configurar. Cambia de modo "push" a "switch". En "pin select", elige LED integrado - pin digital 13 en Nano 33 IoT. OK, y icono sup. der para salir modo edición. Tu botón ya controla el LED.

Estación meteorológica con Blynk

Listos para vincular estación meteorológica a Blynk. Abre mi código adjunto, descomenta Blynk.begin() en setup(), añade tu código auth y credenciales WiFi, sube a Arduino.

Estación Meteorológica IoT Portátil con Arduino Nano 33 IoT

Abre Blynk en móvil. Si seguiste tutorial, tu botón sigue ahí y controla LED. Modo edición, clic en botón para configurar, bórralo con "Delete" al final. Ve a caja de herramientas y selecciona Labeled Value (bajo Displays). En pantalla principal, clic en Labeled Value para configurar. Pin → Virtual pin V3. Explicaremos pines virtuales después. En etiqueta, donde dice "e.g. Temp" escribe "Temp /pin.#/ deg.F". El .# muestra un decimal. Tamaño texto grande, Refresh Interval en Push, Color texto verde. OK. Tu Labeled Value casi listo para mostrar temperatura, pero muy estrecho. Selecciónalo despacio (para no reentrar en config). Borde se ilumina. Estíralo ~3/4 ancho pantalla. Sal de edición y verás temperatura en móvil.

Antes de terminar config Blynk, explicamos un par de cosas vistas al configurar temperatura. Blynk usa idea única: pines virtuales. Widget valor podría leer pin analógico o estado digital. Pero a menudo queremos mostrar contenido de variable. Asignamos esa variable un nº de pin virtual, y Blynk la referenciará por ese nº. En mi código verás donde asigno temperatura °F a pin virtual V3.

Otro concepto: Refresh Interval en modo Push (lo dejamos así). Significa que Arduino empuja datos (actualiza temp, humedad, presión cada minuto). Blynk también soporta Pull: app fija intervalo e interroga hardware.

Terminemos mostrando estación en Blynk. Necesitas dos Labeled Value más: Humedad % (pin virtual V4) y Presión en "in. HG" (pulgadas mercurio, pin virtual V5). Para que parezca la mía: humedad dorado, presión rojo. Humedad 1 decimal; presión 2 decimales.

Si ya tienes tres Labeled Value con temp, humedad, presión, añade gráfico de los tres con widget SuperChart. Estíralo hacia abajo para llenar pantalla. Clic para configurar. Activa "Show x axis values" y elige resoluciones: live, 1h, 6h, 1d, 1sem, 1mes, 3mes. Necesitas 3 flujos de datos (uno por variable). Para configurar cada flujo, clic icono derecha. Selecciona pin virtual correspondiente. Escalado eje Y: "height". Temp: height 67-100. Humedad: 34-66. Presión: 0-33. Colores igual que Labeled Value. Activa "Show Y axis". Sal de edición y tu móvil debería verse como el mío. Gráfico tarda en empezar; para resultados rápidos, ve live o 1h.

Una función más de Blynk: compartir proyecto Blynk terminado con otros smartphones, para que varios móviles vean la estación. Para compartir, modo edición, clic icono central sup. "Project Settings". Activa "Sharing", genera enlace. Te dará código QR para email/compartir. Nuevo usuario necesita app Blynk pero no cuenta. App de usuario no registrado tiene enlace para cargar QR de proyecto ajeno. Listo.

Introducción limitada a Blynk, pero buen punto de partida. Dije que Blynk es gratis… casi. Widgets y compartir consumen puntos ("energy"). Creo que dan 2500 gratis al empezar. Suficiente para este proyecto gratis. Pero compartir o añadir más puede agotar energía. Gasté $6 por 5000 puntos extra. Puede que necesites invertir unos dólares en "combustible" Blynk si te enganchas a más proyectos.

Código

Tiny Internet Weather Station Arduino

Con WiFi y Blynk a Smartphone

/* Sketch para Arduino Nano 33 IoT
 * Usa sensor BME280
 * Usa pantalla OLED 0.96" 128x64
 * Conecta vía WiFi a servidor Blynk en nube para mostrar datos meteorológicos en smartphone
 */
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BME280.h> // librería BME280
#include <avr/dtostrf.h> // convertir números clima a strings para OLED
#include <ss_oled.h> // librería OLED
// Dos includes necesarios para Nano 33 IoT con Blynk
#include <WiFiNINA.h>
#include <BlynkSimpleWiFiNINA.h>

char auth[] = "TuCodigoProyectoBlynk";
char ssid[] = "TuWiFiID";
char pass[] = "TuPasswordWiFi";

Adafruit_BME280 bme; // interfaz I2C
Adafruit_Sensor *bme_temp = bme.getTemperatureSensor();
Adafruit_Sensor *bme_pressure = bme.getPressureSensor();
Adafruit_Sensor *bme_humidity = bme.getHumiditySensor();

#define SDA_PIN 5
#define SCL_PIN 4
#define RESET_PIN -1
#define OLED_ADDR -1
#define FLIP180 0
#define INVERT 0
#define USE_HW_I2C 0
#define MY_OLED OLED_128x64
#define OLED_WIDTH 128
#define OLED_HEIGHT 64

SSOLED ssoled; // instancia OLED
BlynkTimer timer; // instancia timer Blynk

void setup() {
  if (!bme.begin(0x76)) {
    while (1) delay(10); // espera hasta detectar sensor
  }
  bme_temp->printSensorDetails();
  bme_pressure->printSensorDetails();
  bme_humidity->printSensorDetails();
  oledInit(&ssoled, MY_OLED, OLED_ADDR, FLIP180, INVERT, USE_HW_I2C, SDA_PIN, SCL_PIN, RESET_PIN, 400000L);
  oledFill(&ssoled, 0x0, 1);
  Blynk.begin(auth, ssid, pass); // comenta esta línea para operar sin Blynk
  timer.setInterval(60000L, myupdate); // ejecuta myupdate cada minuto
  myupdate(); // actualización inicial porque loop principal espera 1 min
}

void loop() {
  Blynk.run(); // Blynk prefiere correr solo en loop principal
  timer.run(); // resto gestionado por timer Blynk
}

// Rutina llamada por timer Blynk para actualizar OLED y enviar datos a Blynk
void myupdate(){
  sensors_event_t temp_event, pressure_event, humidity_event;
  bme_temp->getEvent(&temp_event);
  bme_pressure->getEvent(&pressure_event);
  bme_humidity->getEvent(&humidity_event);
  float ctemp = temp_event.temperature; // temp en centígrados
  float ftemp = 32 + (9*ctemp)/5; // convertir a Fahrenheit
  float hum = humidity_event.relative_humidity; // humedad relativa
  float ppress = pressure_event.pressure; // presión en mm
  float mpress = 1.3 + ppress/33.8939; // convertir a pulg Hg y añadir 1.3 para coincidir con presión barométrica local reportada.
  // Quita el 1.3 y/o añade tu propio ajuste.
  char mytemp[8]; dtostrf(ftemp, 6, 2, mytemp); // temp a string
  char myhum[8]; dtostrf(hum, 6, 2, myhum); // humedad a string
  char mypress[8]; dtostrf(mpress, 6, 2, mypress); // presión a string
  // Actualizar OLED
  oledWriteString(&ssoled, 0,2,1,(char *)"Weather Station", FONT_NORMAL, 0, 1);
  oledWriteString(&ssoled, 0,2,3,(char *)"Temp = ", FONT_NORMAL, 0, 1);
  oledWriteString(&ssoled, 0,50,3,(char *)mytemp, FONT_NORMAL, 0, 1);
  oledWriteString(&ssoled, 0,105,3,(char *)"F", FONT_NORMAL, 0, 1);
  oledWriteString(&ssoled, 0,2,5,(char *)"Humid=", FONT_NORMAL, 0, 1);
  oledWriteString(&ssoled, 0,50,5,(char *)myhum, FONT_NORMAL, 0, 1);
  oledWriteString(&ssoled, 0,105,5,(char *)"%%", FONT_NORMAL, 0, 1);
  oledWriteString(&ssoled, 0,2,7,(char *)"Press=", FONT_NORMAL, 0, 1);
  oledWriteString(&ssoled, 0,50,7,(char *)mypress, FONT_NORMAL, 0, 1);
  oledWriteString(&ssoled, 0,105,7,(char *)"in", FONT_NORMAL, 0, 1);
  // Enviar nuevos datos clima a Blynk
  Blynk.virtualWrite(V3, ftemp);
  Blynk.virtualWrite(V4, hum);
  Blynk.virtualWrite(V5, mpress);
}

Esquemáticos

Estación Meteorológica IoT Portátil con Arduino Nano 33 IoT

Proceso de manufactura

  1. Circuitos integrados (CI): chips compactos y potentes que impulsan la electrónica moderna
  2. Estación meteorológica solar DIY con Raspberry Pi
  3. Construcción de una estación meteorológica exterior con Raspberry Pi 2 y ADS‑WS1
  4. Construya una estación meteorológica con Raspberry Pi que envíe datos diarios por email
  5. Integre su estación meteorológica con CWOP: Guía práctica
  6. Estación Meteorológica Avanzada v2.0: Monitorización en Tiempo Real de Temperatura, Presión, Humedad y Altitud
  7. Central DCC Digital para Ferrocarril Modelo con Arduino y App Android Gratuita
  8. Estación de Mezcla de Cócteles "6-Shooter" con Arduino: Construye tu Propio Barman Automático
  9. MotionSense: Detección inteligente de intrusos con Arduino y ESP8266
  10. Registrador de Datos de Alto Rendimiento para Globo Meteorológico con Arduino
  11. ArduFarmBot Parte 2: Estación de Control IoT Remota para Cultivos