Estación meteorológica

En este proyecto vamos ha realizar una pequeña estación meteorológica. Con ella vamos a poder medir la temperatura y la humedad ambientales, así como la presión atmosférica y la altitud local.

Los resultados de las medidas se presentan en un display que se actualiza cada dos segundos.

Usamos como procesador una placa de Ardunio UNO y montamos el conjunto en una Shield para prototipos, consiguiendo así un sistema compacto.

El montaje terminado tendrá un aspecto como el siguiente. Aquí podemos ver la estación terminada y un detalle de las mediciones mostradas en la pantalla:

Montaje final y detalle de la pantalla

Características generales

  • Alimentación: 7 – 12 V ó USB
  • Consumo: ~ 35mA
  • Display: 0,96″ 128 x 64 pixels
  • Rango de medición de temperatura: 0 – 50 ºC (2 ºC de precisión)
  • Rango de medición de humedad: 20 – 80% (5% de precisión)
  • Rango de presión: 300 – 1100 hPa ± 1hPa
  • Altitud: Estimación, ver nota más abajo

Material necesario

Los componentes que vamos a necesitar son los siguientes (pinchar para ver los detalles y programación de cada uno de los módulos):

Pantalla OLED 0.96″ I2C/SPI

OLED (Organic light emitting diode) son las siglas que denominan el tipo de led del que están compuestas este tipo de pantallas. Incorpora el controlador SDD1306 que nos permite una conexión I2C o SPI...

Read more

DHT11 y DHT22. Sensores de temperatura y humedad

Los DHT11 y DHT22 son sensores digitales que entregan medidas de temperatura y humedad ambientales simultáneamente. Aunque se usan de la misma forma, el DHT11 es el más básico y tiene menor precisión. Internamente...

Read more

BMP280. Sensor de presión atmosférica

El BMP280 es un sensor que permite medir la presión barométrica y la temperatura ambiente. Así mismo, dado que la altitud sobre el nivel del mar está relacionada con la presión, puede hacer estimaciones...

Read more

Estos elementos los montaremos en una Shield para prototipos sobre un Arduino UNO. Además, necesitaremos Cables dupont de conexión para protoboard y dos resistencias de 4K7 Ohms.

Arduino UNO R3 compatible CH340

Arduino UNO es un microcontrolador basado en ATMEGA328P a 16MHz. Incluye 14 pines de entrada salida digital, 6 de los cuales pueden usarse como salidas PWM.

Placa SHIELD prototipos para Arduino UNO

Esta protoboard tiene formato shield para conectarla facilmente a tu Arduino UNO o MEGA y diseñar tus propios circuitos.

Cables de conexión para protoboard, 65uds

Cables dupont para conexión en protoboard.

Montaje

Aquí vemos el esquema a montar. En él podemos ver la Shield para prototipos, la pantalla OLED de 0,96″, el sensor de temperatura y humedad DHT11 y el sensor de presión BMP280.

La pantalla y el BMP280 se comunican con Arduino mediante el bus I2C. El DHT11 se comunica a través de un bus propio con su línea DATA.

El BMP280 tiene un nivel lógico de 3,3V, ésto nos impide conectar las líneas I2C ( SDA y SCL) directamente al bus de Arduino. Podríamos solucionarlo con un adaptador de niveles lógicos, pero podemos hacer uso de la sugerencia de Arduino Playground I2C bi-directional level shifter. Así, con un par de resistencias de 4K7 Ohms conectadas entre las líneas I2C y el pin 3,3V podemos conectar el sensor al bus I2C de Arduino.

Esquema de la Estación meteorológica

El montaje sobre la protoboard de la Shield para prototipos podría ser el siguiente. Es importante respetar las posiciones de los pines de los componentes sobre los agujeros de la protoboard para evitar cruces indeseados. Notar que las dos resistencias tienen un extremo común, pero el otro está conectado a líneas distintas de la protoboard.

Disposición de los componentes en la protoboard

Y el montaje final, incluida la shield, la pantalla y los sensores, sería el siguiente:

Montaje final de la Estación meteorológica

Código Arduino

En el código cargamos las librerías necesarias para leer cada sensor y para gestionar la pantalla OLED. Para el sensor de temperatura y humedad DHT11 usamos la librería DHT proporcionada por Adafruit. Para gestionar el sensor de presión BMP280 podemos usar la librería Adafruit_BMP280_Library. Para el control de la pantalla OLED usamos la librería Adafruit_SSD1306. La librería Adafruit_GFX sólo será necesaria si queremos usar gráficos en el display.

#include <DHT_U.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "DHT.h"
#include <Adafruit_BMP280.h>

#define SCREEN_WIDTH 128 // Anchura de la pantalla en pixels
#define SCREEN_HEIGHT 64 // Altura de la pantalla en piexels
#define DHTTYPE DHT11

const int DHTPin = 2;

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
DHT dht(DHTPin, DHTTYPE);
Adafruit_BMP280 bmp;

void setup() {
	display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
	dht.begin();
	bmp.begin();

	delay(2000);
	display.clearDisplay();

	display.setTextSize(1);
	display.setTextColor(WHITE, BLACK);
	display.setCursor(10, 3);
	display.print("EST. METEOROLOGICA");
	display.drawRect(0, 0, 128, 64, WHITE);
	display.drawLine(0, 13, 128, 13, WHITE);
	display.display();
}

void loop() {
	float h = dht.readHumidity();
	float t = dht.readTemperature();
	float p = bmp.readPressure() / 100;
	float a = bmp.readAltitude(1040); // Ajustar con la presión a nivel del mar.

	display.setCursor(5, 25);
	display.print("TEMP: "); display.print(t, 0); display.print("C");
	display.print("  HUM: "); display.print(h, 0); display.print("%");

	display.setCursor(5, 40);
	display.print("PRES: "); display.print(p, 0); //display.print("hP");
	display.print(" ALT: "); display.print(a, 0); //display.print("m");

	display.display();
	delay(2000);
}

NOTA sobre el cálculo de la Altitud

El cálculo de la altitud se hace mediante una estimación. Para que esta estimación sea fiable, en la instrucción bmp.readAltitude() tenemos que pasar la presión atmosférica a nivel del mar que se usa como referencia. Esto es un poco desconcertante ya que esta presión variará de un momento a otro, tendríamos que tener un sensor de presión situado a nivel del mar que nos enviara la presión de referencia.
Podemos ver el algoritmo usado en la estimación en la línea 373 del archivo Adafruit_BMP280.cpp de la librería.
Si conocemos la altitud local en un punto, podemos usar la función bmp.seaLevelForAltitude(float altitude, float atmospheric) para obtener la presión a nivel del mar a partir de la altitud y la presión en un punto dado.

NOTA sobre la dirección I2C

Si no conocemos la dirección I2C en la que se encuentra nuestro dispositivo, podemos usar el Scanner I2C para averiguarlo.

Scanner I2C

Hay muchos dispositivos que se conectan a través del bus I2C. En ocasiones no sabemos la dirección I2C que tiene asignada el dispositivo. El siguiente código arduino escanea las posibles direcciones y muestra en...

Read more

También te podría gustar...

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *