Estación meteorológica con ESP8266 NodeMCU, sensor BME280 y TFT ST7789
Este tutorial muestra cómo construir una estación meteorológica sencilla usando la placa ESP8266 NodeMCU (módulo ESP12-E) y el sensor BME280 de presión barométrica, temperatura y humedad.
El microcontrolador NodeMCU (ESP8266EX) lee los valores de temperatura, humedad y presión del sensor BME280 y los muestra (respectivamente en °C, RH% y hPa) en una pantalla TFT ST7789.
El módulo TFT ST7789 contiene un controlador de pantalla con el mismo nombre: ST7789. Es una pantalla a color que utiliza el protocolo de interfaz SPI y requiere 3, 4 o 5 pines de control; es de bajo costo y fácil de usar. Esta pantalla es de tipo IPS, viene en distintos tamaños (1.3″, 1.54″ …) pero todas deben tener la misma resolución de 240×240 píxeles, lo que significa que tiene 57600 píxeles. Este módulo funciona únicamente con 3.3V y no admite 5V.
TFT: Thin-Film Transistor (transistor de película delgada).
SPI: Serial Peripheral Interface (interfaz periférica serie).
IPS: In-Plane Switching (conmutación en el plano).
Para ver cómo conectar la placa ESP8266 NodeMCU con la pantalla TFT ST7789, visita esta entrada:
Conexión del ESP8266 NodeMCU con la pantalla TFT ST7789
Acerca del sensor BME280:
El sensor BME280 de Bosch Sensortec es un sensor digital de presión, temperatura y humedad de bajo costo y buena precisión. Como la presión cambia con la altitud, podemos usarlo como altímetro con una precisión de ±1 metro (precisión de presión = ±1 hPa). A continuación 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.
Material necesario:
- Placa ESP8266 NodeMCU
- Módulo de pantalla TFT ST7789
- Módulo del sensor BME280 —-> hoja de datos
- Cable micro USB (para programar y alimentar el circuito)
- Protoboard
- Cables de conexión (jumpers)
Circuito del ESP8266 NodeMCU con sensor BME280 y TFT ST7789:
El diagrama esquemático del circuito del proyecto se muestra abajo.
Por lo general, el módulo del sensor BME280 tiene al menos 4 pines porque puede funcionar en modo SPI o I2C; se conecta a la placa ESP8266 NodeMCU como se describe a continuación.
Para el modo I2C necesitamos 4 pines: VCC, GND, SDA y SCL, donde:
VCC es el pin de alimentación, que se conecta al pin 3V3 del NodeMCU,
GND (tierra) se conecta al pin GND del NodeMCU,
SDA es la línea de datos serie del bus I2C, conectada al pin D2 del NodeMCU (GPIO4),
SCL es la línea de reloj serie del bus I2C, conectada al pin D1 del NodeMCU (GPIO5).
El módulo de pantalla ST7789 mostrado en el diagrama del circuito tiene 7 pines: (de derecha a izquierda): GND (tierra), VCC, SCL (reloj serie), SDA (datos serie), RES (reset), DC (o D/C: datos/comando) y BLK (retroiluminación).
El módulo de pantalla TFT ST7789 se conecta a la placa NodeMCU de la siguiente manera:
GND se conecta al pin GND de la placa NodeMCU,
VCC y BL se conectan al pin 3V3,
el pin SCL se conecta a D5 (GPIO14 del ESP8266EX),
el pin SDA se conecta a D7 (GPIO13 del ESP8266EX),
el pin RES se conecta a D4 (GPIO2 del ESP8266EX),
el pin DC se conecta a D3 (GPIO0 del ESP8266EX).
Si el módulo de pantalla tiene un pin CS (Chip Select), debe conectarse al pin D8 del NodeMCU (GPIO15).
Conectar el pin BLK es opcional. La retroiluminación se apaga cuando el pin BLK se conecta a tierra (GND).
Los pines D5 (GPIO14) y D7 (GPIO13) son los pines del módulo SPI por hardware del microcontrolador ESP8266EX, respectivamente para SCK (reloj serie) y MOSI (salida maestro-entrada esclavo).
Código del ESP8266 NodeMCU con sensor BME280 y TFT ST7789:
El siguiente código de Arduino requiere 3 librerías de Adafruit Industries:
La primera librería es un controlador para la pantalla TFT ST7789 que se puede instalar desde el gestor de librerías del IDE de Arduino (Sketch —> Include Library —> Manage Libraries …, en el cuadro de búsqueda escribe “st7789” e instala la de Adafruit).
La segunda librería es la librería de gráficos de Adafruit, que también se puede instalar desde el gestor de librerías del IDE de Arduino.
La tercera librería es para el sensor BME280; se puede instalar usando el gestor de librerías (en el cuadro de búsqueda escribe “bme280” y elige la de Adafruit).
Las 3 librerías se pueden instalar manualmente; primero descárgalas desde los siguientes enlaces:
Adafruit ST7789 TFT library —-> enlace directo
Adafruit graphics library —-> enlace directo
Adafruit BME280 Library —-> enlace directo
Puede que necesites instalar la librería Adafruit Unified Sensor si aún no está instalada; el enlace de descarga está abajo:
Adafruit Unified Sensor library —-> 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 librería.
Notas:
En el código hay un total de 4 librerías, que se incluyen de la siguiente manera:
| #include <Wire.h> // Wire library (required for I2C devices) #include <Adafruit_GFX.h> // Adafruit core graphics library #include <Adafruit_ST7789.h> // Adafruit hardware-specific library for ST7789 #include <Adafruit_BME280.h> // Adafruit BME280 sensor library |
La conexión de la pantalla TFT ST7789 con la placa NodeMCU se muestra a continuación, donde la pantalla se conecta al módulo SPI por hardware del NodeMCU (pines: SCK y MOSI):
| // ST7789 TFT module connections #define TFT_DC D3 // TFT DC pin is connected to NodeMCU pin D3 (GPIO0) #define TFT_RST D4 // TFT RST pin is connected to NodeMCU pin D4 (GPIO2) #define TFT_CS D8 // TFT CS pin is connected to NodeMCU pin D8 (GPIO15) // initialize ST7789 TFT library with hardware SPI module // SCK (CLK) —> NodeMCU pin D5 (GPIO14) // MOSI(DIN) —> NodeMCU pin D7 (GPIO13) Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST); |
Y la pantalla TFT se inicializa con el siguiente comando:
| // if the display has CS pin try with SPI_MODE0 tft.init(240, 240, SPI_MODE2); // init ST7789 display 240×240 pixel |
Como cualquier otro dispositivo I2C, el sensor BME280 tiene una dirección de esclavo I2C que puede ser 0x76 o 0x77. Esta dirección depende de la conexión del pin SDO (usado en modo SPI como salida de datos serie o MISO): si el pin SDO se conecta (directamente o mediante 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 librería 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 de esclavo I2C y la inicialización de su librería 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 realiza con la función begin() que devuelve 1 si todo está correcto 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) |
Lectura de los valores de temperatura y presión:
| // read temperature, humidity and pressure from the BME280 sensor float temp = bme280.readTemperature(); // get temperature in °C float humi = bme280.readHumidity(); // get humidity in % float pres = bme280.readPressure(); // get pressure in Pa |
Ten en cuenta que la librería 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 TFT ST7789.
Si hay algún problema con el sensor BME280 (por ejemplo, una dirección de dispositivo incorrecta) la pantalla mostrará Connection Error
Código completo de Arduino:
La imagen de abajo muestra mi sencillo circuito en protoboard:

