Estación meteorológica Arduino Nano: Sensores BMP280, DHT11, UV y RTC en OLED 0,96"
Componentes y materiales
- Arduino Nano R3 (x1)
- Sensor barométrico BMP280 (Grove/Seeed) (x1)
- Sensor temperatura/humedad DHT11 (4 pines) (x1)
- Display OLED 0,96" 128×64 (SSD1306) (x1)
- Sensor UV GUVA-S12SD (x1)
- RTC DS3231 (x1)
Herramientas necesarias
- Soldador, hilo soldadura sin plomo
- Impresora 3D (carcasa)
Aplicaciones y servicios
- Arduino IDE
- Autodesk Fusion 360 (diseño carcasa)
Descripción del proyecto
Estación meteorológica local (sin internet) que muestra en OLED: presión, temperatura, humedad, índice UV y reloj con fecha/día semana. Ideal junto a ventana para UV.
Paso 1: Carcasa impresa 3D
Diseñada en Fusion 360, impresa en PLA verde (Ender 3, 20 % relleno, 70 mm/s, con soportes). Archivos STL incluidos.
Paso 2: BMP280 (SPI)
- CS → D10, SDA(MOSI) → D11, SDO(MISO) → D12, SCK → D13
- Librería
Adafruit_BMP280. Lectura:bmp.readPressure()/100(hPa),bmp.readTemperature()(°C),bmp.readAltitude(1005.47)(m, ajustar presión local).
Paso 3: DS3231 RTC (I2C)
- SCL → A5, SDA → A4
- Primero ajustar hora con sketch
DS3231_set.ino(ejemplo librería). - Librería
DS3231.h. Lectura hora, fecha y día semana (switch-case).
Paso 4: DHT11
- Data → D2
- Librería
DHT.h. Lectura:dht.readHumidity()(%).
Paso 5: Sensor UV GUVA-S12SD
- Salida analógica → A0
- Cálculo índice UV:
float sensorValue = analogRead(A0); float sensorVoltage = sensorValue / 1024.0 * 5.0; int UV_index = sensorVoltage / 0.1;
Paso 6: Display OLED 128×64 I2C (SSD1306)
- SCK → A5, SDA → A4 (compartido con RTC)
- Librerías
Adafruit_GFX.hyAdafruit_SSD1306.h. - 4 pantallas rotando cada 5 s: (1) Hora/fecha/día, (2) Presión/altitud, (3) Temp/RH, (4) Índice UV. Incluye bitmaps para iconos.
Vídeo
Demostración en vídeo (sección correspondiente).
Código completo
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define BMP_SCK 13
#define BMP_MISO 12
#define BMP_MOSI 11
#define BMP_CS 10
DS3231 clock;
bool century=false, h12Flag, pmFlag;
Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// Bitmaps (frame0, frame1, frame2) omitidos por brevedad
void setup() {
Serial.begin(57600);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { /* error */ }
Wire.begin(); dht.begin();
if(!bmp.begin()) { /* error */ }
// Pantalla inicial
display.clearDisplay();
display.setTextColor(WHITE);
display.setCursor(0,9); display.setFont(&FreeSans9pt7b); display.println("**** LOCAL ****");
display.setCursor(0,38); display.setFont(&FreeMonoBoldOblique12pt7b); display.println("wather");
display.setCursor(27,58); display.println("Station");
display.display(); delay(2000);
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, Adafruit_BMP280::SAMPLING_X2,
Adafruit_BMP280::SAMPLING_X16, Adafruit_BMP280::FILTER_X16,
Adafruit_BMP280::STANDBY_MS_500);
}
void loop() {
// 1. Pantalla HORA
display.clearDisplay();
display.setFont(&FreeMonoBoldOblique12pt7b);
display.setCursor(13,15); display.print(clock.getHour(h12Flag,pmFlag));
display.setCursor(38,15); display.println(":");
display.setCursor(50,15); display.println(clock.getMinute());
display.setCursor(70,15); display.println(pmFlag?" PM":" AM");
display.setFont(&FreeSans9pt7b);
display.setCursor(20,60); display.println(clock.getDate());
display.setCursor(40,60); display.println("/");
display.setCursor(46,60); display.println(clock.getMonth(century));
display.setCursor(65,60); display.println("/");
display.setCursor(70,60); display.println("20");
display.setCursor(90,60); display.println(clock.getYear());
display.setCursor(30,30);
switch(clock.getDoW()){
case 1: display.println("Saturday"); break;
case 2: display.println("Sunday"); break;
case 3: display.println("Monday"); break;
case 4: display.println("Tuesday"); break;
case 5: display.println("Wednesday"); break;
case 6: display.println("Thursday"); break;
case 7: display.println("Friday"); break;
}
display.display(); delay(5000);
// 2. Pantalla PRESIÓN
display.clearDisplay();
display.drawBitmap(0,0,frame0,40,40,1);
display.setFont(&FreeSans9pt7b);
display.setCursor(41,28); display.println(bmp.readPressure()/100);
display.setCursor(110,28); display.setFont(); display.println("hPa");
display.setCursor(0,55); display.setFont(&FreeSans9pt7b); display.println("Altitude:");
display.setCursor(65,62); display.println(bmp.readAltitude(1005.47));
display.setCursor(113,62); display.println("m");
display.display(); delay(5000);
// 3. Pantalla TEMP + RH
display.clearDisplay();
display.setFont(&FreeMonoBoldOblique12pt7b);
display.drawBitmap(0,5,frame1,40,51,1);
display.setCursor(35,30); display.print(bmp.readTemperature());
display.setFont(&FreeSans9pt7b);
display.setCursor(102,28); display.println(" *");
display.setCursor(110,31); display.println(" C");
display.setFont();
display.setCursor(66,45); display.println("RH :");
byte RH = dht.readHumidity();
display.setCursor(95,45); display.println(RH);
display.setCursor(110,45); display.println("%");
display.drawBitmap(0,56,frame2,135,15,1);
display.display(); delay(5000);
// 4. Pantalla UV
display.clearDisplay();
float sensorValue = analogRead(A0);
float sensorVoltage = sensorValue / 1024.0 * 5.0;
int UV_index = sensorVoltage / 0.1;
display.setFont(&FreeSans9pt7b);
display.setCursor(0,15); display.print(" UV INDEX ");
display.setCursor(58,45); display.println(UV_index);
display.display(); delay(5000);
}
Partes personalizadas y esquemático
Archivo ZIP carcasa 3D. Esquemático de conexiones (imagen).
Proceso de manufactura
- Estación meteorológica solar DIY con Raspberry Pi
- Construcción de una estación meteorológica exterior con Raspberry Pi 2 y ADS‑WS1
- Construya una estación meteorológica con Raspberry Pi que envíe datos diarios por email
- Estación Meteorológica Avanzada v2.0: Monitorización en Tiempo Real de Temperatura, Presión, Humedad y Altitud
- Estación de Mezcla de Cócteles "6-Shooter" con Arduino: Construye tu Propio Barman Automático
- Sistema de Sensor de Temperatura Multiposición para Integración en Hogar Inteligente
- Registrador de Datos de Alto Rendimiento para Globo Meteorológico con Arduino
- Estación Meteorológica Portátil Arduino por $10 – Nano, DHT22, BMP180 y LCD
- Monitorización Meteorológica en Tiempo Real con Arduino y ThingSpeak IoT
- Estación Meteorológica WiFi con ESP8266 y Sensor DHT22 – Envío a ThingSpeak
- Pulsera inteligente con Arduino MKR GSM 1400 y Hologram IoT