Introducción
En este tutorial te enseñaremos a crear tu propia estación meteorológica con Arduino utilizando el Grove Beginner Kit. Esta tarjeta es compatible con el Arduino Uno R3 y contiene todo lo necesario para realizar una variedad de prácticas con los sensores que vienen conectados de fabrica a través de su circuito impreso.
Si no tienes un Grove Beginner Kit, no te preocupes, de cualquier forma podrás realizar tu proyecto de estación meteorológica utilizando una tarjeta Arduino Nano Every (o Arduino Nano compatible) y sensores individuales, ya que todos los componentes pueden adquirirse por separado en nuestra tienda de electrónica en línea.
Este proyecto es de nivel intermedio y puede llevarlo a cabo cualquier persona que ya se sienta confiada en el manejo de tarjetas Arduino. Es un proyecto muy sencillo pero que tiene la posibilidad de expandirse o mejorarse utilizando tarjetas electrónicas con conectividad WiFi y/o Bluetooth para realizar otro tipo de interacciones.
¿Cómo hacer una estación meteorológica con Arduino?
Para realizar nuestra estación meteorológica necesitamos elegir las variables que vamos a monitorear y elegir los sensores adecuados para realizar las mediciones. Por la amplia disponibilidad de sensores y conveniencia hemos elegido las siguientes variables:
- Humedad relativa – Usaremos un sensor DHT11
- Presión atmosférica – Mediremos con el sensor BMP280
- Temperatura – Podemos usar cualquiera de los sensores anteriores: BMP280 o DHT11
Las variables de nuestra elección se despliegan en una pantalla OLED para su visualización o poder llevar un registro de forma manual.
Ya que tengamos identificados y conectados los sensores al Arduino, requerimos realizar el siguiente procedimiento en nuestro programa:
- Leer el sensor de humedad DHT11
- Tomar lectura de el sensor de presión BMP280
- Medir la temperatura con alguno de los dos sensores
- Actualizar la pantalla OLED con los valores de la lectura
Una vez que el proyecto esté ensamblado y funcionando podemos realizar mejoras a nuestra estación, como agregar una interfaz de usuario más vistosa o realizar una carcasa para instalarlo en nuestro escritorio, etc.
Materiales
O bien:
- Arduino Nano Every (o tarjeta compatible con Arduino Nano)
- Protoboard de 830 puntos
- DHT11 sensor de humedad y temperatura
- BMP280 de temperatura y presión atmosférica
- Alambre para protoboard
- Pantalla o display OLED 128×64 SSD1306
Circuito para estación meteorológica con Arduino
El armado del circuito para realizar una estación meteorológica con Arduino deberá realizarse según se muestra en la siguiente imagen (la resistencia para el sensor DHT11 es de 4.7 KOhms):

Las conexiones son las siguientes:
- Sensor DHT11 – Pin 3 con resistencia pull-up
- Módulo de sensor BMP280 – Bus I2C (A5 = SCL y A4 = SDA)
- Pantalla OLED – Bus I2C (A5 = SCL y A4 = SDA)
En el caso del Grove Beginner Kit las conexiones ya se encuentran realizadas internamente en la tarjeta, por lo que podemos proceder a realizar el programa sin la necesidad de cablear.
La programación del proyecto se llevará a cabo de la misma manera independientemente de la tarjeta de desarrollo que estemos utilizando.
Código para estación meteorológica con Arduino
Como ya mencionamos la tarea de nuestro programa será medir todos los sensores y mostrarnos el resultado de estas mediciones en la pantalla OLED.
Para poder desarrollar nuestro programa de manera más sencilla, debemos instalar algunas librerías en el IDE de Arduino, este proceso se puede realizar fácilmente desde el gestor de librerías.
Las librerías que debemos tener instaladas para poder compilar el código son las siguientes:
Hemos elaborado dos versiones del programa: La más básica que muestra todas las mediciones en una sola pantalla y la que muestra íconos para cada una de las medidas y las muestra en forma secuencial.
Lo que cambia en realidad es la forma en la que mostramos los datos; En el programa más simple utilizamos la librería U8x8 que solo permite mostrar texto en pantalla, esta se incluye junto con la librería U8g2lib. En el programa donde usamos la pantalla para mostrar gráficos hacemos uso de todo el potencial de la librería U8g2.
Hemos comentado bastante el código de este proyecto de forma que sea fácil de entender y puedes encontrar las dos versiones del programa a continuación.
Programa sencillo (librería U8x8lib)
Este programa muestra constantemente los valores leídos desde los sensores simultáneamente en la pantalla OLED.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | /** --> CURSO BASICO DE ARDUINO CON GROVE BEGINNER KIT <-- --> MATERIAL DE APOYO <-- Potenciado por: Geek Factory - "Dale vuelo a tus proyectos" www.geekfactory.mx CONSULTA EL ARCHIVO LICENCIA.TXT PARA CONOCER MÁS SOBRE LOS DERECHOS DE DISTRIBUCIÓN DE ESTE MATERIAL. PUBLICADO BAJO LICENCIA ATTRIBUTION-NONCOMMERCIAL-SHAREALIKE 4.0 INTERNATIONAL (CC BY-NC-SA 4.0). LECCIÓN 6: Estación metereológica programa completo Este programa configura los sensores de la tarjeta Grove Beginner Kit y toma las lecturas de los sensores ambientales. Posteriormente las lecturas se muestran en la pantalla OLED de la tarjeta de desarrollo. */ #include <DHT.h> #include <Adafruit_BMP280.h> #include <U8x8lib.h> const int pinSensorHumedad = 3; /** * Objeto para el sensor de presión barométrica y sensor de temperatura */ Adafruit_BMP280 barometro; /** * Objeto para sensor de humedad y temperatura DHT11 * El primer parámetro indica el pin donde se conecta el sensor * El segundo parámetro es el tipo de sensor (DHT11, DHT22, etc.) */ DHT higrometro(pinSensorHumedad, DHT11); /** * Objeto para realizar la interfaz con la pantalla OLED de 128x16 * este constructor se utiliza para los módulos genéricos conectados * por I2C. */ U8X8_SSD1306_128X64_NONAME_HW_I2C oled(U8X8_PIN_NONE); /** * Variables de tipo float para almacenar la lectura de los sensores */ float presion = 0, temperatura = 0, humedad = 0; void setup() { Serial.begin(9600); Serial.println(F("--> CURSO BASICO DE ARDUINO CON GROVE BEGINNER KIT <--")); Serial.println(F("--> PROGRAMA ESTACIÓN METEOROLÓGICA <--")); // preparar el sensor DHT11 para su uso higrometro.begin(); // preparar el sensor BMP280 para su uso if (!barometro.begin()) { Serial.println(F("Error: No se detecta sensor BMP280")); while (1) ; } // inicializar la pantalla OLED oled.begin(); oled.setFlipMode(1); oled.setFont(u8x8_font_chroma48medium8_r); } void loop() { // esperar dos segundos para actualizar las mediciones delay(2000); // leer el sensor de temperatura (BMP280) temperatura = barometro.readTemperature(); // leer la presión atmosferica (BMP280) presion = barometro.readPressure(); // leer la humedad relativa (DHT11) humedad = higrometro.readHumidity(); // escribir las mediciones a la pantalla OLED // mover el cursor al inicio de la pantalla oled.setCursor(0, 0); // escribir la leyenda "Temperatura" oled.print("Temperatura"); // mover el cursor a la segunda línea de la pantalla oled.setCursor(0, 1); // escribir el valor de la variable oled.print(temperatura); // repetimos el procedimiento con la variable de humedad... oled.setCursor(0, 3); oled.print("Humedad"); oled.setCursor(0, 4); oled.print(humedad); // ...finalmente con la presión atmosférica oled.setCursor(0, 6); oled.print("Presion"); oled.setCursor(0, 7); oled.print(presion); } |
Programa con gráficos (librería U8g2lib)
Este programa muestra una de las variables por vez en la pantalla y además muestra un ícono que permite identificar fácilmente las magnitudes (temperatura, humedad, presión). La pantalla OLED se utiliza para mostrar gráficos con la librería U8g2lib.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 | /** --> CURSO BASICO DE ARDUINO CON GROVE BEGINNER KIT <-- --> MATERIAL DE APOYO <-- Potenciado por: Geek Factory - "Dale vuelo a tus proyectos" www.geekfactory.mx CONSULTA EL ARCHIVO LICENCIA.TXT PARA CONOCER MÁS SOBRE LOS DERECHOS DE DISTRIBUCIÓN DE ESTE MATERIAL. PUBLICADO BAJO LICENCIA ATTRIBUTION-NONCOMMERCIAL-SHAREALIKE 4.0 INTERNATIONAL (CC BY-NC-SA 4.0). Estación metereológica programa completo (con gráficos) Programa para la estación meteorológica basada en Arduino y desarrolada de forma práctica en el Grove Beginner Kit. Este programa utiliza la pantalla OLED en modo gráfico y muestra las medidas de los sensores junto con un ícono representativo de la magnitud medida. Existe una versión más sencilla de este programa en el que se usa la pantalla en modo texto para que sea más fácil de comprender. */ #include <U8g2lib.h> #include <DHT.h> #include <Adafruit_BMP280.h> /** * pin donde está conectado el sensor DHT11 */ const int pinSensorHumedad = 3; /** * Objeto para el sensor de presión barométrica y sensor de temperatura * la comunicación es por I2C. */ Adafruit_BMP280 barometro; /** * Objeto para sensor de humedad y temperatura DHT11 * El primer parámetro indica el pin donde se conecta el sensor * El segundo parámetro es el tipo de sensor (DHT11, DHT22, etc.) */ DHT higrometro(pinSensorHumedad, DHT11); /** * Objeto para manejar la pantalla OLED I2C en modo gráfico, se utiliza * el parametro U8G2_R2 para rotar la pantalla de acuerdo a la posición * que usaremos en el Grove Beginner Kit. * * Este es el constructor para una pantalla OLED genérica basada en el * controlador SSD1306 de 128x64 pixeles. Se utiliza el módo 1 de memoria * buffer para ahorrar RAM, por lo que todas las operaciones de dibujo en * la pantalla deben realizarse dentro de un cíclo. */ U8G2_SSD1306_128X64_NONAME_1_HW_I2C oled(U8G2_R2); /** * Variables de tipo float para almacenar la lectura de los sensores */ float presion = 0, temperatura = 0, humedad = 0; /** * Mapa de bits del ícono de temperatura 54x54 pixeles, se almacena en la memoria de programa * (flash) gracias al uso del modificador PROGMEM. */ const unsigned char iconoTemperatura[] PROGMEM = { 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xe1, 0x01, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x78, 0x8c, 0x07, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x8c, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x0c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x1e, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x3f, 0x38, 0x00, 0x00, 0x00, 0x00, 0x87, 0x7f, 0x38, 0x00, 0x00, 0x00, 0x80, 0xc3, 0xff, 0x70, 0x00, 0x00, 0x00, 0x80, 0xc3, 0xff, 0x70, 0x00, 0x00, 0x00, 0x80, 0xc3, 0xff, 0x70, 0x00, 0x00, 0x00, 0x80, 0xc3, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x87, 0x7f, 0x70, 0x00, 0x00, 0x00, 0x00, 0x87, 0x7f, 0x38, 0x00, 0x00, 0x00, 0x00, 0x07, 0x3f, 0x38, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x00 }; /** * Mapa de bits del ícono de presión 54x54 pixeles, se almacena en la memoria de programa * (flash) gracias al uso del modificador PROGMEM. */ const unsigned char iconoPresion[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x80, 0xff, 0xe1, 0x7f, 0x00, 0x00, 0x00, 0xc0, 0x1f, 0x00, 0xfe, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf8, 0x01, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x30, 0x3c, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x78, 0x3c, 0x00, 0x80, 0x07, 0x00, 0x00, 0x7c, 0x78, 0x00, 0x80, 0x03, 0x00, 0x00, 0x3e, 0x70, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0xc0, 0x03, 0x00, 0x80, 0x0f, 0xf0, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x07, 0xe0, 0x00, 0xe0, 0x01, 0x00, 0xfe, 0x03, 0xe0, 0x01, 0xe0, 0x01, 0x80, 0xff, 0x01, 0xe0, 0x01, 0xe0, 0x01, 0x80, 0xff, 0x00, 0xe0, 0x01, 0xe0, 0x00, 0xc0, 0xf3, 0x00, 0xc0, 0x01, 0xe0, 0x00, 0xc0, 0xe1, 0x00, 0xc0, 0x01, 0xe0, 0x00, 0xc0, 0xe1, 0x00, 0xc0, 0x01, 0xe0, 0x00, 0xc0, 0xf3, 0x00, 0xc0, 0x01, 0xe0, 0x01, 0xc0, 0x7f, 0x00, 0xe0, 0x01, 0xe0, 0x01, 0xe0, 0x7f, 0x00, 0xe0, 0x01, 0xe0, 0x01, 0xf0, 0x1f, 0x00, 0xe0, 0x01, 0xc0, 0x01, 0xf8, 0x00, 0x00, 0xe0, 0x00, 0xc0, 0x03, 0x78, 0x00, 0x00, 0xf0, 0x00, 0xc0, 0x03, 0x38, 0x00, 0x00, 0xf0, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x70, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0xf8, 0x01, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xf0, 0x03, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xc0, 0x1f, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x80, 0xff, 0xe1, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; /** * Mapa de bits del ícono de humedad 54x54 pixeles, se almacena en la memoria de programa * (flash) gracias al uso del modificador PROGMEM. */ const unsigned char iconoHumedad[] PROGMEM = { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf1, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x3e, 0x00, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x7e, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x7c, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xf8, 0x01, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x78, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x7c, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x3c, 0xf0, 0x20, 0xc0, 0x07, 0x00, 0x00, 0x3e, 0x98, 0x31, 0x80, 0x0f, 0x00, 0x00, 0x3e, 0x08, 0x19, 0x80, 0x0f, 0x00, 0x00, 0x1e, 0x08, 0x09, 0x80, 0x0f, 0x00, 0x00, 0x1f, 0x98, 0x0d, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0xf0, 0x04, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x06, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0xf3, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x99, 0x01, 0x1f, 0x00, 0x00, 0x3f, 0x80, 0x09, 0x01, 0x1f, 0x00, 0x00, 0x3f, 0x80, 0x08, 0x81, 0x1f, 0x00, 0x00, 0x3f, 0xc0, 0x98, 0x81, 0x1f, 0x00, 0x00, 0x7e, 0x60, 0xf0, 0x80, 0x0f, 0x00, 0x00, 0x7e, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xfc, 0x01, 0x00, 0xf0, 0x07, 0x00, 0x00, 0xf8, 0x03, 0x00, 0xf8, 0x03, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0xfc, 0x01, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0xff, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xe1, 0xff, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0x00 }; /** * Prototipo de la función para dibujar las pantallas donde se muestran las mediciones * de nuestra estación meteorológica. */ void mostrarMedida(const uint32_t tiempo, const float valor, const char* unidades, const uint8_t* icono); /** * Función setup: se ejecuta una vez cuando encendemos el arduino */ void setup() { Serial.begin(9600); Serial.println(F("--> CURSO BASICO DE ARDUINO CON GROVE BEGINNER KIT <--")); Serial.println(F("--> PROGRAMA ESTACIÓN METEOROLÓGICA <--")); // preparar el display OLED oled.begin(); // preparar el sensor DHT11 para su uso higrometro.begin(); // preparar el sensor BMP280 para su uso if (!barometro.begin()) { Serial.println(F("Error: No se detecta sensor BMP280")); while (1) ; } // borrar la pantalla oled.clear(); // configurar el tipo de letra para el mensaje inicial // se trata de una fuente de 12 pixeles de alto oled.setFont(u8g2_font_t0_12_tf); // inciar el cíclo de escritura de la pantalla oled.firstPage(); // realizar todas las operaciones de dibujo dentro del ciclo do { // posicionar el cursor en la primera linea de la pantalla, estamos usando una fuente de 8 pixeles de alto oled.setCursor(0, 10); oled.print(F("Geek Factory")); // movemos el cursor a la siguiente línea, aumentando 10 pixeles oled.setCursor(0, 20); oled.print(F("Estacion")); oled.setCursor(0, 30); oled.print(F("Meteorologica")); } while (oled.nextPage()); // configurar la fuente para escribir el resultado de las mediciones (usamos la version completa) oled.setFont(u8g2_font_VCR_OSD_tf); // mensaje para indicar que concluimos la función setup de forma satisfactoria Serial.println(F("Setup completado!")); // esperar un poco en la pantalla inicial delay(5000); } /** * Función loop: se ejecuta continuamente mientras el arduino permanece encendido */ void loop() { // leer el sensor de temperatura (BMP280) temperatura = barometro.readTemperature(); // leer la presión atmosferica (BMP280) y convertir pascales a hectoPascales presion = barometro.readPressure() / 100; // leer la humedad relativa (DHT11) humedad = higrometro.readHumidity(); // enviar las mediciones al monitor serial separadas por tabulaciones // ideal para utilizar con Serial Plotter Serial.print(temperatura, 1), Serial.print('t'); Serial.print(presion, 1), Serial.print('t'); Serial.println(humedad, 1); // mostrar la temperatura por 3 segundos mostrarMedida(3000, temperatura, "° C", iconoTemperatura); // mostrar la presion por 3 segundos mostrarMedida(3000, presion, "hPa", iconoPresion); // mostrar la humedad por 3 segundos mostrarMedida(3000, humedad, "% RH", iconoHumedad); } /** * Función implementada para dibujar la pantalla donde se muestran las mediciones. * Se implementa de esta forma para evitar un bucle para cada una de las mediciones. * * Recibe los siguientes parámetros: * * tiempo: Tiempo en milisegundos que permanecerá esta pantalla * valor: Valor a mostrar (float) * unidades: Cadena con las unidades y el símbolo o cualquier otra informacion a mostrar * icono: Bitmap a dibujar en pantalla */ void mostrarMedida(const uint32_t tiempo, const float valor, const char* unidades, const uint8_t* icono) { // borrar pantalla oled.clear(); // inciar el cíclo de dibujo de la pantalla oled.firstPage(); do { // coordenada para el valor de la medición oled.setCursor(60, 25); // imprimir el valor de la medición con un decimal de presición oled.print(valor, 1); // imprimir la cadena de unidades o información adicional oled.drawUTF8(60, 50, unidades); // dibujar el ícono correspondiente oled.drawXBMP(0, 5, 54, 54, icono); } while (oled.nextPage()); // avanzar a la siguiente pagina o salir del ciclo // esperar antes de mostrar la siguiente medida delay(tiempo); } |
Enlaces relacionados
- Documentación de la librería U8g2 / U8x8 (en inglés)
- Tutorial de sensor DHT11 (en inglés)
- Tutorial de sensor BMP280 (en inglés)
- Información de sensor DHT11
- Información de sensor BMP280
Conclusión
- Con este proyecto hemos aprendido a realizar mediciones de sensores de humedad y temperatura, así como de presión atmosférica. Esto puede servirnos para estudiar la relación de las variables medidas con el clima y realizar predicciones según los datos obtenidos.
- Aprendimos a mostrar datos de sensores en una pantalla OLED así como las funciones básicas para posicionar el cursor, borrar la pantalla y escribir texto.
- Mostramos gráficos y texto en la pantalla OLED, realizando una interfaz muy vistosa para nuestro proyecto.
- Con este proyecto como base, podríamos realizar mejoras para poder monitorear y almacenar estas variables remotamente; Por ejemplo, podríamos utilizar alguna tarjeta de desarrollo con tecnología WiFi para enviar los datos a un servidor.
- Otra idea que podemos implementar es almacenar los valores localmente en una memoria SD, Flash o EEPROM para su posterior análisis.







