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:
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):
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...
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...
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...
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.
Es esquema a montar es el siguiente:
ATENCIÓN
Es muy importante identificar correctamente los pines de los componentes según su serigrafía y no según su posición. Distintos fabricantes pueden tener los pines en orden distinto al aquí mostrado.
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.
Y el montaje final, incluida la shield, la pantalla y los sensores, sería el siguiente:
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);
}
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...
He montado todo tal cual como lo explica el blog, teniendo en cuenta la serigrafía y no las posiciones de los pines, y no me funciona la estación meteorológica. Ni se enciende la pantalla OLED ni se enciende el LED rojo del sensor DH11 (Aunque este se calienta). ¿Alguna ayuda o sugerencia?