BME280で取ったデータをESP32で直接graphiteにデータ送信する
電子工作
Published: 2021-02-08

BME280で温度、湿度、気圧を取得しESP32のWifi接続で直接graphiteに送信を行ってみた記録です。
graphiteやGrafanaの説明はしません。

今回使った物

ESP-32SBME280ESP-32SBME280
[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

KeeYees ESP32 ESP-32S 開発ボード デュアルコア 2.4 G…
価格:4020円(税込、送料別) (2021/2/8時点)


[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

【送料無料】Arduino RasberryPi兼用 BME280 3.3V/5…
価格:1680円(税込、送料別) (2021/2/8時点)


接続図

BME280とESP-32SはI2Cで接続します。
ESP-32SはGPIO21がSDA、GPIO22がSCLとなるようです。

ESP-32SBME280
3.3VVIN
GNDGND
GPIO21SDA
GPIO22SCL

内容

  • Wifiに接続する
  • ntpサーバに問い合わせし時刻を得る
  • 時間割り込みを作り1秒置きにデータを送信する

コード

#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[] = "";

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

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

// Tricker
Ticker ticker;
bool flagTicker = false;

// BME280 Sensor
Adafruit_BME280 bme;

void setTicker() {
    flagTicker = true;
}

// UDP
WiFiUDP udp;

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

  if (!bme.begin(0x76)) {
    Serial.println("BME280 sensor error!");
    while (1);
  }

  // Wifi connection
  WiFi.begin(SSID, PASSWORD);
  Serial.print("WiFi connecting");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(100);
  }

  IPAddress ipaddr, gateway;
  ipaddr = WiFi.localIP();
  gateway = WiFi.gatewayIP();
  Serial.println("Wifi Connected.");
  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("set ticker");
        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;
  }
}

利用ライブラリ

Grafanaでグラフにしてみる

BME280のセンサーデータをESP32で取得し、Wifiを介してGraphite(go-carbon)に蓄積しGrafanaで
グラフ化することができました。

1秒ごとにデータが追加されるのでかなりリアルタイムなデータが取れるようになりました。
消費電力も0.5W以下で実現できたので便利に自宅内のデータ収集がはかどりそうです。