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

Mini Estación Meteorológica Arduino UNO – Sensor Hub DIY con ESP8266 IoT

Componentes y suministros

Arduino UNO 1
Espressif ESP8266 ESP-01 1
Arduino Proto Shield (o protoboard ordinaria) 1
Sensor temperatura DHT22 1
Seeed Grove - Sensor de luz 1
Seeed Grove - Sensor UV 1
Seeed Grove - Sensor barómetro 1
Seeed Grove - Sensor polvo 1
Resistencia 1k Ω 2
Resistencia 10k Ω 1
Resistencia 4,75k Ω 1
Cables jumper (genéricos) 1 set

Aplicaciones y servicios online

Sobre este proyecto

Mini Estación Meteorológica Arduino UNO – Sensor Hub DIY con ESP8266 IoT

Esta es la primera generación de mi mini-estación meteorológica basada en Arduino con conexión WiFi, capaz de publicar datos públicamente online usando la plataforma ThingSpeak.

La estación recopila los siguientes datos meteorológicos y ambientales usando diferentes sensores:

El objetivo: una estación meteorológica pequeña y simple, usando hardware abierto. ¡Empecemos y divirtámonos!

Componentes electrónicos

Mini Estación Meteorológica Arduino UNO – Sensor Hub DIY con ESP8266 IoT
Mini Estación Meteorológica Arduino UNO – Sensor Hub DIY con ESP8266 IoT
Mini Estación Meteorológica Arduino UNO – Sensor Hub DIY con ESP8266 IoT
Mini Estación Meteorológica Arduino UNO – Sensor Hub DIY con ESP8266 IoT
Mini Estación Meteorológica Arduino UNO – Sensor Hub DIY con ESP8266 IoT
Mini Estación Meteorológica Arduino UNO – Sensor Hub DIY con ESP8266 IoT
Mini Estación Meteorológica Arduino UNO – Sensor Hub DIY con ESP8266 IoT

No necesitas herramientas específicas para el montaje. Todos los componentes se encuentran online en tu tienda favorita.

El circuito se alimenta por USB (PC o cargador de móvil), pero puedes añadir alimentación externa DC o batería al jack de Arduino.

Una carcasa para la estación está fuera del alcance de este proyecto.

Conectando las piezas

Mini Estación Meteorológica Arduino UNO – Sensor Hub DIY con ESP8266 IoT
Mini Estación Meteorológica Arduino UNO – Sensor Hub DIY con ESP8266 IoT

Conecta todos los componentes según el esquemático. Necesitarás cables jumper para cada sensor a la protoboard. Puedes usar protoboard, proto shield ordinario, o diseñar tu propio shield Arduino.

Conecta el USB al Arduino Uno y pasa al siguiente paso.

Código

Mini Estación Meteorológica Arduino UNO – Sensor Hub DIY con ESP8266 IoT

Suponiendo que tienes el último Arduino IDE instalado, descarga e instala estas librerías:

Para instrucciones de cómo añadir librerías al IDE, consulta la guía oficial de Arduino.

Descarga el código Arduino (weatherBox.ino) en la sección Código. Reemplaza XXXXX por SSID de tu router WiFi, YYYYY por contraseña, y ZZZZZ por tu clave API de escritura de canal ThingSpeak (ver siguiente paso).

Conecta Arduino al USB del PC y sube el código.

Configuración ThingSpeak

Mini Estación Meteorológica Arduino UNO – Sensor Hub DIY con ESP8266 IoT
Mini Estación Meteorológica Arduino UNO – Sensor Hub DIY con ESP8266 IoT
Mini Estación Meteorológica Arduino UNO – Sensor Hub DIY con ESP8266 IoT
Mini Estación Meteorológica Arduino UNO – Sensor Hub DIY con ESP8266 IoT
  1. Crea cuenta en ThingSpeak
  2. Crea un nuevo Canal
  3. Especifica nombre y descripción. Asigna estos campos y guarda:
    • Campo 1 = luz
    • Campo 2 = humedad
    • Campo 3 = temperatura (DHT22)
    • Campo 4 = índice UV
    • Campo 5 = concentración polvo
    • Campo 6 = presión
    • Campo 7 = temperatura (BMP085)
  4. Copia la clave API de escritura. Se usa en el código Arduino. Al encender, los valores se suben periódicamente. Puedes configurar visualizaciones públicas/privadas.

Ejemplo canal público: https://thingspeak.com/channels/35540

Usando App Android

¡Diviértete!

Código

weatherBox.ino (Arduino)

#include <stdlib.h>
#include <SoftwareSerial.h>
#include <DHT.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085_U.h>

#define SSID "XXXXX" // reemplaza por SSID router
#define PASS "YYYYY" // reemplaza por contraseña router
#define IP "184.106.153.149" // IP thingspeak.com
#define DHT22_PIN 2

String GET = "GET /update?key=ZZZZZ&field1="; // reemplaza ZZZZZ por tu write API key
SoftwareSerial monitor(10, 11); // Comunicación serie con ESP8266 (RX, TX)

dht DHT;
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);

// Variables
int luminancePin = A0;
int uvPin = A1;
int dustPin = 8;
unsigned long duration;
unsigned long starttime;
unsigned long sampletime_ms = 30000;
unsigned long delay_time = 60000;
unsigned long lowpulseoccupancy = 0;
float ratio = 0;
float concentration = 0;

void setup() {
  Serial.begin(9600);
  monitor.begin(9600);
  Serial.println("Inicializando...");
  pinMode(dustPin, INPUT);
  Serial.println("Detectando sensor presión BMP085...");
  if (!bmp.begin()) {
    Serial.println("BMP085 no detectado. Verifica conexiones o dirección I2C!");
    while (1);
  }
  Serial.println("BMP085 detectado!");
  monitor.flush();
  monitor.println("AT");
  delay(2000);
  if (monitor.find("OK")) {
    Serial.println("Comunicación con módulo ESP8266: OK");
  } else {
    Serial.println("ERROR módulo ESP8266");
  }
  connectWiFi();
  Serial.print("Muestreo (");
  Serial.print(sampletime_ms / 1000);
  Serial.println("s)...");
  starttime = millis();
}

void loop() {
  duration = pulseIn(dustPin, LOW);
  lowpulseoccupancy += duration;

  if ((millis() - starttime) >= sampletime_ms) {
    ratio = lowpulseoccupancy / (sampletime_ms * 10.0);
    concentration = 1.1 * pow(ratio, 3) - 3.8 * pow(ratio, 2) + 520 * ratio + 0.62;
    lowpulseoccupancy = 0;

    char buffer[10];
    float luminance = analogRead(luminancePin);
    float uv = analogRead(uvPin);
    uv = uv * 0.0049; // a voltios
    uv = uv * 307;    // a mW/m²
    uv = uv / 200;    // índice UV

    int chk = DHT.read22(DHT22_PIN);
    float humidity = DHT.humidity;
    float temperature = DHT.temperature;

    sensors_event_t event;
    bmp.getEvent(&event);
    float pressure = 0;
    float temperature1 = 0;
    if (event.pressure) {
      pressure = event.pressure;
      bmp.getTemperature(&temperature1);
    }

    String luminanceStr = dtostrf(luminance, 4, 1, buffer); luminanceStr.replace(" ", "");
    String uvStr = dtostrf(uv, 4, 1, buffer); uvStr.replace(" ", "");
    String humidityStr = dtostrf(humidity, 4, 1, buffer); humidityStr.replace(" ", "");
    String temperatureStr = dtostrf(temperature, 4, 1, buffer); temperatureStr.replace(" ", "");
    String dustStr = dtostrf(concentration, 4, 1, buffer); dustStr.replace(" ", "");
    String pressureStr = dtostrf(pressure, 4, 1, buffer); pressureStr.replace(" ", "");
    String temperature1Str = dtostrf(temperature1, 4, 1, buffer); temperature1Str.replace(" ", "");

    updateSensors(luminanceStr, humidityStr, temperatureStr, uvStr, dustStr, pressureStr, temperature1Str);

    Serial.print("Espera ");
    Serial.print(delay_time / 1000);
    Serial.println("s para siguiente muestreo");
    Serial.println();
    delay(delay_time);
    Serial.println();
    Serial.print("Muestreo (");
    Serial.print(sampletime_ms / 1000);
    Serial.println("s)...");
    starttime = millis();
  }
}

void updateSensors(String luminanceStr, String humidityStr, String temperatureStr,
                   String uvStr, String dustStr, String pressureStr, String temperature1Str) {
  String cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += IP;
  cmd += "\",80";
  monitor.println(cmd);
  delay(2000);
  cmd = GET;
  cmd += luminanceStr;
  cmd += "&field2=";
  cmd += humidityStr;
  cmd += "&field3=";
  cmd += temperatureStr;
  cmd += "&field4=";
  cmd += uvStr;
  cmd += "&field5=";
  cmd += dustStr;
  cmd += "&field6=";
  cmd += pressureStr;
  cmd += "&field7=";
  cmd += temperature1Str;
  cmd += "\r\n";
  delay(1000);
  int strsize = cmd.length();
  monitor.println("AT+CIPSEND=" + String(strsize));
  delay(2000);
  monitor.print(cmd);
  if (monitor.find("OK")) {
    Serial.println("Transmisión completada con éxito");
  } else {
    Serial.println("¡Transmisión fallida!");
  }
}

void sendDebug(String cmd) {
  Serial.print("SEND: ");
  Serial.println(cmd);
  monitor.println(cmd);
}

boolean connectWiFi() {
  Serial.println("Conectando WiFi...");
  String cmd = "AT+CWMODE=1";
  monitor.println(cmd);
  delay(2000);
  monitor.flush();
  cmd = "AT+CWJAP=\"";
  cmd += SSID;
  cmd += "\",\"";
  cmd += PASS;
  cmd += "\"";
  monitor.println(cmd);
  delay(5000);
  if (monitor.find("OK")) {
    Serial.println("¡Conexión exitosa!");
    return true;
  } else {
    Serial.println("¡Conexión fallida!");
    return false;
  }
  Serial.println();
}

Librerías (GitHub)

Esquemáticos

Mini Estación Meteorológica Arduino UNO – Sensor Hub DIY con ESP8266 IoT

Proceso de manufactura

  1. Construya una estación meteorológica con Raspberry Pi que envíe datos diarios por email
  2. Robot de Detección Humana con Arduino Uno: Integración de Sensores Paso a Paso
  3. Sensor K30 CO₂: Monitorización en tiempo real de la calidad del aire interior
  4. Construye un estadiómetro digital: Controla tu altura con Arduino y sensor láser
  5. Servidor Web Arduino Uno WiFi: Controla un LED desde el Navegador
  6. Calculadora Básica con Arduino UNO - Proyecto Fácil para Principiantes
  7. Construye una Torre de Sensores con Arduino Cloud: Temperatura, Movimiento y Gas
  8. Construir una pantalla de persistencia de visión portátil con Arduino UNO y ATtiny85
  9. Estación meteorológica Arduino Nano: Sensores BMP280, DHT11, UV y RTC en OLED 0,96"
  10. Estación Inteligente de Monitorización de Salud: Arduino, Bluetooth y Sensores
  11. Sistema de Monitorización de Temperatura con Arduino y Bluetooth para Smartphone