Estación meteorológica con ESP8266 NodeMCU, OLED SSD1306 y sensor BME280
Esta entrada muestra cómo construir una estación meteorológica usando la tarjeta de desarrollo ESP8266 NodeMCU (módulo ESP12-E) y el sensor BME280 de presión barométrica, temperatura y humedad.
El NodeMCU lee los valores de temperatura, humedad y presión del sensor BME280 y los muestra (respectivamente en °C, RH% y hPa) en una pantalla OLED SSD1306 (128×64 pixeles).
Acerca del sensor BME280:
El sensor BME280 de Bosch Sensortec es un sensor digital de presión, temperatura y humedad de bajo costo y con buena exactitud. Como la presión cambia con la altitud, podemos usarlo como altímetro con una exactitud de ±1 metro (exactitud de presión = ±1 hPa). Abajo se listan algunos parámetros del sensor:
Rango de presión: 300 … 1100 hPa (equivalente a +9000…-500 m sobre/bajo el nivel del mar)
Resolución de presión: 0.01 hPa ( < 10 cm)
Rango de temperatura: -40 … 85 °C
Resolución de temperatura: 0.01 °C
Rango de humedad: 0 … 100 %
Interfaz: I2C y SPI
Rango de voltaje de alimentación: 1.71 … 3.6 V
En este proyecto el sensor BME280 se usa en modo I2C.
La pantalla OLED SSD1306 usada en este proyecto está configurada para trabajar en modo I2C; algunas tarjetas OLED SSD1306 pueden requerir pequeñas modificaciones de hardware (para seleccionar entre el modo SPI y el modo I2C), como soldar, colocar jumpers …
Para ver cómo conectar el ESP8266 NodeMCU con la pantalla OLED SSD1306, visita la siguiente entrada:
Conexión del ESP8266 NodeMCU con la OLED SSD1306
Hardware necesario:
- Tarjeta de desarrollo ESP8266 NodeMCU
- Pantalla OLED SSD1306 con resolución de 128×64 pixeles
- Módulo sensor BME280 —-> hoja de datos
- Cable micro USB (para programar y alimentar el circuito)
- Protoboard
- Cables de conexión (jumpers)
Circuito del NodeMCU con sensor BME280 y OLED SSD1306:
Abajo se muestra el diagrama esquemático del circuito del proyecto.
Por lo general, el módulo del sensor BME280 tiene al menos 4 pines porque puede trabajar en modo SPI o en modo I2C. Para el modo I2C necesitamos 4 pines: VCC, GND, SDA y SCL, donde:
GND (tierra) se conecta al pin GND del NodeMCU,
VCC es el pin de alimentación, que se conecta al pin 3V3 del NodeMCU,
SDA es la línea serial de datos del bus I2C, conectada al pin D2 (GPIO4) del NodeMCU,
SCL es la línea serial de reloj del bus I2C, conectada al pin D3 (GPIO0) del NodeMCU.
La pantalla OLED SSD1306 se conecta a la tarjeta NodeMCU de la siguiente manera:
GND de la OLED SSD1306 al pin GND del NodeMCU,
VDD de la OLED SSD1306 al 3V3 del NodeMCU,
pin SDA (datos seriales) de la OLED SSD1306 al pin D2 (GPIO4) del NodeMCU,
pin SCK (reloj serial) de la OLED SSD1306 al pin D3 (GPIO0) del NodeMCU,
pin RES (reset) de la OLED SSD1306 al pin D1 (GPIO5) del NodeMCU.
El pin DC de la pantalla OLED SSD1306 está conectado a VDD (3.3V), lo que significa que la dirección I2C del dispositivo es 0x3D. Si el pin DC se conecta a tierra (GND), entonces la dirección I2C pasa a ser 0x3C.
La OLED SSD1306 y el sensor BME280 están conectados al mismo bus I2C (dispositivos esclavos).
La dirección I2C de la OLED SSD1306 es distinta de la del sensor BME280; esta diferencia permite que el dispositivo maestro (microcontrolador ESP8266EX) se comunique con uno de ellos (solo uno a la vez).
Código del NodeMCU con sensor BME280 y OLED SSD1306:
El siguiente código de Arduino requiere 3 bibliotecas de Adafruit Industries:
La primera biblioteca es un controlador para la pantalla OLED SSD1306, que se puede instalar desde el gestor de bibliotecas del IDE de Arduino (Sketch —> Include Library —> Manage Libraries …, en la caja de búsqueda escribe “ssd1306” e instala la de Adafruit).
La segunda biblioteca es la biblioteca gráfica de Adafruit, que también se puede instalar desde el gestor de bibliotecas del IDE de Arduino.
La tercera biblioteca es para el sensor BME280.
Las 3 bibliotecas anteriores también se pueden instalar manualmente; los enlaces de descarga están abajo:
Controlador Adafruit SSD1306 OLED —-> enlace directo
Biblioteca gráfica de Adafruit —-> enlace directo
Biblioteca Adafruit BME280 —-> enlace directo
Es posible que necesites instalar la biblioteca Adafruit Unified Sensor si aún no está instalada; el enlace de descarga está abajo:
Biblioteca Adafruit Unified Sensor —-> enlace directo
Después de la descarga, ve al IDE de Arduino —> Sketch —> Include Library —> Add .ZIP Library … y busca el archivo .zip (descargado previamente).
Haz lo mismo con los demás archivos de biblioteca.
Las 3 bibliotecas se incluyen en el código así:
| #include <Adafruit_GFX.h> // include Adafruit graphics library #include <Adafruit_SSD1306.h> // include Adafruit SSD1306 OLED display driver #include <Adafruit_BME280.h> // include Adafruit library for BME280 sensor |
La definición del pin de reset (RES) de la OLED SSD1306 y la inicialización de su biblioteca se muestran a continuación:
| // define SSD1306 OLED reset at ESP8266 GPIO5 (NodeMCU D1) #define OLED_RESET 5 // initialize Adafruit display library Adafruit_SSD1306 display(OLED_RESET); |
Como cualquier otro dispositivo I2C, el sensor BME280 tiene una dirección I2C de esclavo que puede ser 0x76 o 0x77. Esta dirección depende de la conexión del pin SDO (usado en modo SPI como salida serial de datos o MISO): si el pin SDO se conecta (directamente o a través de una resistencia) a VCC (3.3V), la dirección será 0x77, y si se conecta a GND, la dirección será 0x76.
La dirección I2C predeterminada de la biblioteca del BME280 está definida como 0x77 y la dirección I2C de mi dispositivo es 0x76.
En el código, la definición de la dirección I2C de esclavo y la inicialización de su biblioteca se muestran a continuación:
| // define device I2C address: 0x76 or 0x77 (0x77 is library default address) #define BME280_I2C_ADDRESS 0x76 // initialize Adafruit BME280 library Adafruit_BME280 bme280; |
La inicialización del sensor BME280 se hace mediante la función begin() que devuelve 1 si todo está OK y 0 si hay error. En el código, la inicialización con la dirección definida previamente se muestra a continuación:
| bme280.begin(BME280_I2C_ADDRESS) |
La lectura de los valores de temperatura y presión se hace como se muestra a continuación:
| // read temperature, humidity and pressure from the BME280 sensor float temp = bme280.readTemperature(); // get temperature in degree Celsius float humi = bme280.readHumidity(); // get humidity in rH% float pres = bme280.readPressure(); // get pressure in Pa |
Ten en cuenta que la biblioteca del sensor BME280 devuelve el valor de la presión en unidades de Pa, y para convertirlo a hPa hay que dividirlo entre 100.
1 bar = 10000 Pa = 100 hPa. ( 1 hPa = 100 Pa = 1 milibar)
Pa: Pascal
hPa: hectoPascal
Los valores de temperatura, humedad y presión se muestran en la pantalla OLED SSD1306.
Si hay un problema con el sensor BME280 (por ejemplo, dirección de dispositivo incorrecta), la pantalla mostrará Connection Error.
Código completo de Arduino:
La siguiente imagen muestra mi sencillo circuito de hardware:

