Enviar datos del BME280 directamente a Graphite con ESP32
electrónica
Lastmod: 2025-01-21
Published: 2021-02-08

He registrado la experiencia de obtener temperatura, humedad y presión atmosférica del BME280 y enviarlos directamente a Graphite a través de la conexión WiFi del ESP32.
No se incluyen explicaciones sobre Graphite o Grafana.

Elementos utilizados

Nombre del productoLugar de compra
ESP-32SAliExpress
Amazon
Rakuten
BME280AliExpress
Amazon
Rakuten

Diagrama de conexión

El BME280 se conecta al ESP-32S a través de I2C.
En el ESP-32S, GPIO21 es SDA y GPIO22 es SCL.

ESP-32SBME280
3.3VVIN
GNDGND
GPIO21SDA
GPIO22SCL

Contenido

  • Conexión a WiFi
  • Consultar un servidor NTP para obtener la hora
  • Crear una interrupción de tiempo para enviar datos cada segundo

Código

#include <Arduino.h>
#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_BME280.h>
#include <Ticker.h>
#include <WiFiUdp.h>
#include <time.h>

// Wifi
const char SSID[] = "";
const char PASSWORD[] = "";

// Servidor NTP
const char NTP_SERVER[] = "ntp.nict.jp";

// Graphite
IPAddress graphite(192,168,0,10);

// Ticker
Ticker ticker;
bool flagTicker = false;

// Sensor BME280
Adafruit_BME280 bme;

void setTicker() {
    flagTicker = true;
}

// UDP
WiFiUDP udp;

void setup() {
  Serial.begin(115200);
  while (!Serial);

  if (!bme.begin(0x76)) {
    Serial.println("¡Error en el sensor BME280!");
    while (1);
  }

  // Conexión WiFi
  WiFi.begin(SSID, PASSWORD);
  Serial.print("Conectando a WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(100);
  }

  IPAddress ipaddr, gateway;
  ipaddr = WiFi.localIP();
  gateway = WiFi.gatewayIP();
  Serial.println("WiFi Conectado.");
  Serial.print("IPAddr:");
  Serial.println(ipaddr);
  Serial.print("Gateway:");
  Serial.println(gateway);

  // NTP
  configTime(9 * 3600L, 0, NTP_SERVER); 

  // ms
  struct timeval tv;
  int ms = 0;
  while(1) {
     if (gettimeofday(&tv, NULL) != 0) {
       Serial.println("error gettimeofday.");
     }else{
      ms = tv.tv_usec / 1000LL;
    }
    if(ms == 0) {
        ticker.attach_ms(1000, setTicker);
        Serial.println("ticker configurado");
        break;
    }
  }
}

void send() {
    time_t now;
    time(&now); 
    udp.beginPacket(graphite, 2003);
    udp.println("sec.esp32.temperature " + String(bme.readTemperature()) + " " + now);
    udp.println("sec.esp32.humidity " + String(bme.readHumidity()) + " " + now);
    udp.println("sec.esp32.pressure " + String(bme.readPressure() / 100) + " " + now);
    udp.endPacket();
}

void loop() {
  if(flagTicker) {
      send();
      flagTicker = false;
  }
}

Bibliotecas utilizadas

Creando gráficos en Grafana

Se pudo obtener los datos del sensor BME280 con el ESP32, almacenarlos en Graphite (go-carbon) a través de WiFi y graficarlos con Grafana.

Con los datos siendo añadidos cada segundo, se ha logrado obtener datos bastante en tiempo real.
También se logró mantener el consumo de energía por debajo de 0.5W, lo que parece facilitar mucho la recolección de datos dentro de casa.