Proyecto

 

Estación Meteorológica

Utilizaremos la placa NodeMCU para crear una estación meteorológica. El objetivo será medir al menos el nivel de luz, la temperatura del entorno y la humedad relativa del aire. Posteriormente, los datos se enviarán por WiFi a la plataforma ThingSpeak donde podremos recopilar y visualizar la información (Revisa el Anexo I, Uso de la Plataforma ThingSpeak). Además, para facilitar el uso de la plataforma, podemos utilizar la librería oficial (ThingSpeak de MathWorks) compatible con la placa NodeMCU con la que estamos trabajando.

A continuación, se muestran la funcionas elementales para subir nuestros datos a la plataforma:


FunciónDescripción
ThingSpeak.begin(cliente);Inicia la conexión con la plataforma  ThingSpeak utilizando como argumento un cliente de tipo WiFiClient creado previamente. Esto se pone en el Setup().
ThingSpeak.setField(campo, valor);Establece el campo (un número del 1 al máximo admitido por canal de ThingSpeak) al valor dado (debe ser un valor numérico).
ThingSpeak.writeFields(canal, "apikey");Envía todos los campos configurados con la función anterior (setField) a la plataforma, concretamente al canal (un número entero del 1 al número de canales que tengas en tu cuenta de ThingSpeak) deseado al que corresponde la apikey dada (obtenida de tu cuenta de ThingSpeak).

 

 

Para esta actividad necesitarás los siguientes componentes electrónicos:


#include "DHT.h" // Librería para usar el DHT (DHT sensor library by Adafruit)

#define DHTPIN 2 // Pin de conexión de Pin de señal del DHT
#define DHTTYPE DHT22 // Tipo de DHT conectado (DHT22 o  DHT11)

// Crear instancia del objeto DHT
DHT dht(DHTPIN, DHTTYPE);

void setup() {

    // Inicializar sensor DHT
    dht.begin();

}

void loop() {

    // Entre medidas hay que esperar unos segundos
    delay(2000);

    // Tomamos las medidas de humedad (%) y temperatura (ºC)
    float humedad = dht.readHumidity();
    float temperatura = dht.readTemperature();

}
// Incluir librerías necesarias
#include <WiFi.h>
#include "ThingSpeak.h"
#include "DHT.h"

// Definir valores constantes
#define TIPODHT DHT22 // DHT22
#define PINDHT 4
#define LDR 32

const char* wifiSsid = "NombreDeTuWiFi";
const char* wifiPawd = "ClaveDeTuWiFi";
const char* apiKey = "TuApiKey";

// Variables para controlar los tiempos
unsigned long ultimaActualizacion = 0;
unsigned long temporizacion = 60000;

// Crear instancia de objetos necesarios
WiFiClient cliente;
DHT dht(PINDHT, TIPODHT);

void setup() {

    // Inicialización de monitor serial
    Serial.begin(9600);

    // Inicialización del DHT
    dht.begin();

    // Inicializar WiFi y ThinSpeak
    WiFi.mode(WIFI_STA);
    ThingSpeak.begin(cliente);

    // Conectar al WiFi
    Serial.print("Conectando al WiFi");
    WiFi.begin(wifiSsid, wifiPawd);

    // Esperar que se realice la conexión
    while(WiFi.status() != WL_CONNECTED) {

        Serial.print(".");
        delay(500);

    }

    Serial.println();
    Serial.println("Conectado a la red");

}

void loop() {

    // Obtenemos medida del sensor de lluvia
    int luminosidad = analogRead(LDR);

    // Obtenemos medida de temperatura
    float temperatura = dht.readTemperature();

    // Obtenemos medida de humedad
    float humedad = dht.readHumidity();

    // Mostramos valores por monitor serial
    Serial.print("Temperatura: ");
    Serial.print(temperatura);
    Serial.println("ºC");

    Serial.print("Humedad: ");
    Serial.print(humedad);
    Serial.println("%");

    Serial.print("Luminosidad: ");
    Serial.println(luminosidad);

    Serial.println();

    // Comprobamos que ha pasado el tiempo suficiente para enviar de nuevo los datos
    if((millis() - ultimaActualizacion) > temporizacion) {

        // Publicar a ThingSpeak los datos
        ThingSpeak.setField(1, temperatura);
        ThingSpeak.setField(2, humedad);
        ThingSpeak.setField(3, luminosidad);

        // Enviar los datos a la plataforma
        ThingSpeak.writeFields(1, apiKey);

        ultimaActualizacion = millis();

    }

    delay(250);

}

 

 

Si quisiéramos ir más allá y montar una estación más completa, podemos medir además la presión barométrica y detectar la lluvia. También podemos sustituir los componentes anteriores y utilizar otros sensores más complejos como los siguientes:


#include <Adafruit_BMP280.h> // Librería para usar el BMP280 (Adafruit BMP280 Library by Adafruit)

 // Crear instancia del objeto BMP280
Adafruit_BMP280 bmp;

void setup() {

    // Inicializar sensor BMP280
    bmp.begin();

    // Configurar la toma de lecturas
    bmp.setSampling(
        Adafruit_BMP280::MODE_NORMAL, // Modo de operación
        Adafruit_BMP280::SAMPLING_X2, // Muestro de Temperatura
        Adafruit_BMP280::SAMPLING_X16, // Muestro de Presión
        Adafruit_BMP280::FILTER_X16, // Filtrado
        Adafruit_BMP280::STANDBY_MS_500 // Tiempo de descanso
    );

}

void loop() {

    // Entre medidas esperamos unos segundos
    delay(2000);

    // Tomamos las medidas de temperatura (ºC), presión (Pa) y altitud (m)
    float temperatura = bmp.readTemperature();
    float presion_atmosferica = bmp.readPressure();
    float altitud = bmp.readAltitude(1013.25); // 1013.25 => Presión al nivel del mar

}
#include "Adafruit_SHT4x.h" // Librería para usar el SHT40 (Adafruit SHT4x Library by Adafruit)

// Crear instancia del objeto SHT40
Adafruit_SHT4x sht4 = Adafruit_SHT4x();

void setup() {

    // Inicializar sensor SHT40
    sht4.begin();

    // Configuración de las medidas del SHT40
    sht4.setPrecision(SHT4X_HIGH_PRECISION); // Precisión de las medidas
    sht4.setHeater(SHT4X_NO_HEATER); // Use de precalentador
  
}


void loop() {

    // Entre medidas esperamos unos segundos
    delay(2000);

    // Obtenemos medida de temperatura (ºC) y humedad (%)
    sensors_event_t humidity, temp;
    sht4.getEvent(&humidity, &temp);

    // Accedemos a los datos utilizando:
    // temp.temperature;
    // humidity.relative_humidity;

}
#include <Wire.h> // Librería para uso del bus I2C (Instalada por defecto)
#include <BH1750.h> // Librería para usar el BH1750 (BH1750 by Christopher Laws)

// Crear instancia del objeto BH1750
BH1750 lightMeter;

void setup() {

    // La librería no inicializa el bus I2C automáticamente
    // Inicializar bus I2C
    Wire.begin();

    // Inicializar sensor BH1750
    lightMeter.begin();

}

void loop() {

    // Entre medidas esperamos unos segundos
    delay(2000);

    // Obtenemos medida de luz (lux)
    float lux = lightMeter.readLightLevel();

}
// Incluir librerías necesarias
#include <WiFi.h>
#include <Wire.h>
#include "ThingSpeak.h"
#include "Adafruit_SHT4x.h"
#include <Adafruit_BMP280.h>
#include <BH1750.h>

// Definir valores constantes
#define LLUVIA 32

const char* wifiSsid = "NombreDelWiFi";
const char* wifiPawd = "ClaveDelWiFi";
const char* apiKey = "TuApiKeyDeThingSpeak";

// Variables para controlar los tiempos
unsigned long ultimaActualizacion = 0;
unsigned long temporizacion = 60000;

// Crear instancia de objetos necesarios
Adafruit_SHT4x sht4 = Adafruit_SHT4x();
Adafruit_BMP280 bmp;
BH1750 luxometro;
WiFiClient cliente;

void setup() {

    // Inicialización de monitor serial y el I2C
    Serial.begin(9600);
    Wire.begin();

    // Inicializar WiFi y ThinSpeak
    WiFi.mode(WIFI_STA);
    ThingSpeak.begin(cliente);
    luxometro.begin();
    sht4.begin();
    bmp.begin(0x76);

    // Conectar al WiFi
    Serial.print("Conectando al WiFi");
    WiFi.begin(wifiSsid, wifiPawd);

    // Esperar que se realice la conexión
    while(WiFi.status() != WL_CONNECTED) {

        Serial.print(".");
        delay(500);

    }

    Serial.println();
    Serial.println("Conectado a la red");

    // Configurar sensor BMP280
    bmp.setSampling(
        Adafruit_BMP280::MODE_NORMAL,
        Adafruit_BMP280::SAMPLING_X2,
        Adafruit_BMP280::SAMPLING_X16,
        Adafruit_BMP280::FILTER_X16,
        Adafruit_BMP280::STANDBY_MS_500
    );

    // Configurar sensor SHT40
    sht4.setPrecision(SHT4X_MED_PRECISION);
    sht4.setHeater(SHT4X_MED_HEATER_1S);

}

void loop() {

    // Obtenemos medida del sensor de lluvia
    int lluvia = analogRead(LLUVIA);

    // Obtenemos medida de temperatura y humedad
    sensors_event_t humedad, temperaturaSht;
    sht4.getEvent(&temperaturaSht, &humedad);

    // Obtenemos medida de intensidad lumínica
    int lux = luxometro.readLightLevel();

    // Obtenemos medida de temperatura, presión y altitud
    float temperaturaBme = bmp.readTemperature();
    float presion = bmp.readPressure();
    float altitud = bmp.readAltitude(1013.25);

    // Calculamos temperatura media entre ambos sensores
    float temperaturaMedia = temperaturaSht.temperature;
    temperaturaMedia += temperaturaBme;
    temperaturaMedia /= 2;

    // Mostramos valores por monitor serial
    Serial.print("Temperaturas: ");
    Serial.print(temperaturaSht.temperature);
    Serial.print(" | ");
    Serial.print(temperaturaBme);
    Serial.println(" ºC");

    //Serial.print("Humedad: ");
    Serial.print(humedad.relative_humidity);
    Serial.println(" %");

    Serial.print("Iluminancia: ");
    Serial.print(lux);
    Serial.println(" lx");

    Serial.print("Presión: ");
    Serial.print(presion);
    Serial.println(" Pa");

    Serial.print("Altitud: ");
    Serial.print(altitud);
    Serial.println(" m");

    Serial.print("Lluvia: ");
    if(lluvia < 500)
        Serial.println("Si");

    else
        Serial.println("No");

    Serial.println();

    // Comprobamos que ha pasado el tiempo suficiente para enviar de nuevo
// los datos
    if((millis() - ultimaActualizacion) > temporizacion) {

        // Publicar a ThingSpeak los datos
        ThingSpeak.setField(1, temperaturaMedia);
        ThingSpeak.setField(2, humedad.relative_humidity);
        ThingSpeak.setField(3, lluvia);
        ThingSpeak.setField(4, lux);
        ThingSpeak.setField(5, presion);
        ThingSpeak.setField(6, altitud);

        // Enviar los datos a la plataforma
        ThingSpeak.writeFields(1, apiKey);

        ultimaActualizacion = millis();

    }

    delay(2000);

}
Vistas
0 Número de vistas
0 Vistas de miembros
0 Vistas públicas
Acciones
0 Gustos
0 No me gusta
0 Comentarios
Compartir en redes sociales
Compartir enlace
Compartir por correo

Por favor iniciar sesión para compartir esto webpage por correo.