ESP32 - odeslání naměřených hodnot snímače BME280 do InfluxDB

08.10.2022 Raspberry Pi #esp32 #influxdb #bme280

V tomto článku se dozvíte, jak odesílat hodnoty snímače BME280 do InfluxDB pomocí desek ESP32 nebo ESP8266. InfluxDB je databáze časových řad. Každý záznam v databázi je spojen s časovým razítkem, díky čemuž je ideální pro datalogging IoT a projekty domácí automatizace. InfluxDB také poskytuje nástroje dashboard pro vizualizaci dat v různých formátech, jako jsou grafy, měřidla, histogramy atd.


Budeme vycházet z předpokladu, že InfluxDB je nainstalován an Raspberry Pi. Jak nastavit InfluxDB je uvedeno v článku - ESP32 a InfluxDB.

Jak odesílat hodnoty senzoru do InfluxDB

V této části naprogramujeme desky ESP32 tak, aby odeslaly údaje o teplotě, vlhkosti a tlaku BME280 do InfluxDB.

Schematický diagram

V tomto tutoriálu odešleme údaje snímače BME280 do InfluxDB. Takže musíte připojit snímač BME280 k vaší desce. Postupujte podle jednoho z následujících schematických diagramů.

ESP32 s BME280

Použijeme I2C komunikaci se senzorovým modulem BME280. Připojte snímač k výchozímu ESP32 SCL (GPIO 22) a SDA (GPIO 21) kolíky, jak je znázorněno na následujícím schématu.

esp32-bme280-sensor-temperature-humidity-pressure-wiring-diagram-circuit_f

Instalace knihoven

Pro tento projekt je třeba nainstalovat následující knihovny:

Instalace – Arduino IDE

Pokud používáte Arduino IDE, nainstalujte knihovnu podle následujících kroků.

  1. Přejděte na  Skica  >  Zahrnout knihovnu  >  Spravovat knihovny
  2. Vyhledejte InfluxDB a nainstalujte knihovnu ESP8266 Influxdb od Tobiase Shürga.
  3. Při instalaci knihovny Adafruit BME280 Library a Adafruit Unified Sensor Library postupujte podle stejných pokynů .

Instalace – VS kód

Pokud používáte VS Code s rozšířením PlatformIO, začněte vytvořením projektu Arduino pro vaši desku ESP32 nebo ESP8266.

Poté klikněte na ikonu PIO Home  a vyberte  kartu Knihovny . Vyhledejte „ influxdb “. Vyberte  ESP8266 Influxdb od Tobiase Schürga.

install-influxdb-library-vs-code 

Postupujte stejným způsobem pro knihovnu Adafruit BME280 a knihovnu Adafruit Unified Sensor.

Vaše plaformio.ini soubor by měl vypadat následovně (také jsme přidali řádek pro změnu přenosové rychlosti Serial Monitor na 115200).

monitor_speed = 115200
lib_deps = 
	tobiasschuerg/ESP8266 Influxdb@^3.12.0
	adafruit/Adafruit BME280 Library@^2.2.2
	adafruit/Adafruit Unified Sensor@^1.1.5

Odesílání hodnoty senzoru do InfluxDB - kód

Zkopírujte následující kód do Arduino IDE nebo domain.cpp pokud používáte VS Code s příponou PlatformIO. Kód je kompatibilní s deskami ESP32 a ESP8266.

Tento kód je založen na tomto příkladu knihovny. Provedli jsme několik úprav, abychom zahrnuli údaje snímače BME280.

#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#if defined(ESP32)
  #include <WiFiMulti.h>
  WiFiMulti wifiMulti;
  #define DEVICE "ESP32"
#elif defined(ESP8266)
  #include <ESP8266WiFiMulti.h>
  ESP8266WiFiMulti wifiMulti;
  #define DEVICE "ESP8266"
  #define WIFI_AUTH_OPEN ENC_TYPE_NONE
#endif

#include <InfluxDbClient.h>
#include <InfluxDbCloud.h>

// WiFi AP SSID
#define WIFI_SSID "REPLACE_WITH_YOUR_SSID"
// WiFi password
#define WIFI_PASSWORD "REPLACE_WITH_YOUR_PASSWORD"
// InfluxDB v2 server url, e.g. https://eu-central-1-1.aws.cloud2.influxdata.com (Use: InfluxDB UI -> Load Data -> Client Libraries)
#define INFLUXDB_URL "REPLACE_WITH_YOUR_DATABASE_URL"
// InfluxDB v2 server or cloud API authentication token (Use: InfluxDB UI -> Load Data -> Tokens -> <select token>)
#define INFLUXDB_TOKEN "REPLACE_WITH_YOUR_TOKEN"
// InfluxDB v2 organization id (Use: InfluxDB UI -> Settings -> Profile -> <name under tile> )
#define INFLUXDB_ORG "REPLACE_WITH_YOUR_ORG"
// InfluxDB v2 bucket name (Use: InfluxDB UI -> Load Data -> Buckets)
#define INFLUXDB_BUCKET "SENSOR"
// Set timezone string according to https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html
// Examples:
//  Pacific Time:   "PST8PDT"
//  Eastern:        "EST5EDT"
//  Japanesse:      "JST-9"
//  Central Europe: "CET-1CEST,M3.5.0,M10.5.0/3"
#define TZ_INFO "WET0WEST,M3.5.0/1,M10.5.0"

// InfluxDB client instance with preconfigured InfluxCloud certificate
InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN, InfluxDbCloud2CACert);
// InfluxDB client instance without preconfigured InfluxCloud certificate for insecure connection 
//InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN);

// Data point
Point sensorReadings("measurements");

//BME280
Adafruit_BME280 bme; // I2C

float temperature;
float humidity;
float pressure;

// Initialize BME280
void initBME(){
  if (!bme.begin(0x76)) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
}

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

  // Setup wifi
  WiFi.mode(WIFI_STA);
  wifiMulti.addAP(WIFI_SSID, WIFI_PASSWORD);

  Serial.print("Connecting to wifi");
  while (wifiMulti.run() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println();
  
  //Init BME280 sensor
  initBME();
  
  // Add tags
  sensorReadings.addTag("device", DEVICE);
  sensorReadings.addTag("location", "office");
  sensorReadings.addTag("sensor", "bme280");

  // Accurate time is necessary for certificate validation and writing in batches
  // For the fastest time sync find NTP servers in your area: https://www.pool.ntp.org/zone/
  // Syncing progress and the time will be printed to Serial.
  timeSync(TZ_INFO, "pool.ntp.org", "time.nis.gov");

  // Check server connection
  if (client.validateConnection()) {
    Serial.print("Connected to InfluxDB: ");
    Serial.println(client.getServerUrl());
  } else {
    Serial.print("InfluxDB connection failed: ");
    Serial.println(client.getLastErrorMessage());
  }
}

void loop() {
  // Get latest sensor readings
  temperature = bme.readTemperature();
  humidity = bme.readHumidity();
  pressure = bme.readPressure()/100.0F;

  // Add readings as fields to point
  sensorReadings.addField("temperature", temperature);
  sensorReadings.addField("humidity", humidity);
  sensorReadings.addField("pressure", pressure);

  // Print what are we exactly writing
  Serial.print("Writing: ");
  Serial.println(client.pointToLineProtocol(sensorReadings));
  
  // Write point into buffer
  client.writePoint(sensorReadings);

  // Clear fields for next usage. Tags remain the same.
  sensorReadings.clearFields();

  // If no Wifi signal, try to reconnect it
  if (wifiMulti.run() != WL_CONNECTED) {
    Serial.println("Wifi connection lost");
  }

  // Wait 10s
  Serial.println("Wait 10s");
  delay(10000);
}

Před nahráním kódu do desky nástěnku musíte vložit své síťové přihlašovací údaje, adresu URL databáze, token, organizaci a název segmentu. Nezapomeňte také zadat své časové pásmo. Zkontrolujte tento dokument a vyhledejte své časové pásmo ve správném formátu.

Jak kód funguje

Začněte zahrnutím požadovaných knihoven a nastavením DEVICE název podle vybrané desky (ESP32 nebo ESP8266).

#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#if defined(ESP32)
  #include <WiFiMulti.h>
  WiFiMulti wifiMulti;
  #define DEVICE "ESP32"
#elif defined(ESP8266)
  #include <ESP8266WiFiMulti.h>
  ESP8266WiFiMulti wifiMulti;
  #define DEVICE "ESP8266"
  #define WIFI_AUTH_OPEN ENC_TYPE_NONE
#endif

#include <InfluxDbClient.h>
#include <InfluxDbCloud.h>

Vložte své síťové přihlašovací údaje do následujících proměnných, aby se desky ESP32 nebo ESP8266 mohly připojit k internetu pomocí vaší místní sítě.

// WiFi AP SSID
#define WIFI_SSID "REPLACE_WITH_YOUR_SSID"
// WiFi password
#define WIFI_PASSWORD "REPLACE_WITH_YOUR_PASSWORD"

Do následujících řádků vložte adresu URL serveru InfluxDB:

// InfluxDB v2 server url, e.g. https://eu-central-1-1.aws.cloud2.influxdata.com (Use: InfluxDB UI -> Load Data -> Client Libraries)
#define INFLUXDB_URL "REPLACE_WITH_YOUR_INFLUXDB_URL"

Poznámka: Pokud spouštíte InfluxDB lokálně na Raspberry Pi, bude URL adresou Raspberry Pi IP na portu 8086. Například 192.168.1.106:8086.

Vložte svůj token InfluxDB:

#define INFLUXDB_TOKEN "REPLACE_WITH_YOUR_INFLUXDB_TOKEN"

Přidejte název organizace InfluxDB:

#define INFLUXDB_ORG "REPLACE_WITH_YOUR_INFLUXXDB_ORGANIZATION_ID"

Nakonec přidejte název kbelíku InfluxDB:

#define INFLUXDB_BUCKET "REPLACE_WITH_YOUR_BUCKET_NAME"

Časové pásmo musíte nastavit podle těchto pokynů. Nejjednodušší způsob je zkontrolovat tuto tabulku a zkopírovat odtud své časové pásmoV mém případě je to lisabonské časové pásmo:

#define TZ_INFO "WET0WEST,M3.5.0/1,M10.5.0"

Klient InfluxDB

Nyní, když máte všechna požadovaná nastavení, můžete vytvořit soubor InfluxDBClient instance. Vytváříme zabezpečeného klienta, který používá předem nakonfigurovaný certifikát – další informace o zabezpečeném připojení.

InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN, InfluxDbCloud2CACert);

Point

Poté vytvoříme Point volaný instancí sensorReadings. Bod se bude v databázi nazývat measurements. Později v kódu se můžeme odkázat na tento bod (sensorReadings) pro přidání značek a polí.

Point sensorReadings("measurements");

Proměnné BME280

Vytvořit Adafruit_BME280 jako instanci bme na výchozích pinech ESP I2C.

Adafruit_BME280 bme; // I2C

Vytvořte proměnné pro uložení teplot, vlhkosti a tlaku.

float temperature;
float humidity;
float pressure;

Funkce initBME().

Funkce initBME() inicializuje snímač BME280. Zavoláme ji později v setup() pro inicializaci senzoru.

// Initialize BME280
void initBME(){
  if (!bme.begin(0x76)) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
}

setup()

V setup(), inicializujte Serial Monitor pro účely ladění.

Serial.begin(115200);

Inicializujte Wi-Fi.

// Setup wifi
WiFi.mode(WIFI_STA);
wifiMulti.addAP(WIFI_SSID, WIFI_PASSWORD);

Serial.print("Connecting to wifi");
while (wifiMulti.run() != WL_CONNECTED) {
  Serial.print(".");
  delay(500);
}
Serial.println();

Zavolej funkci initBME() pro inicializaci snímače BME280.

//Init BME280 sensor
initBME();

Přidejte ke svým datům značky pomocí addTag(). Přidáváme název zařízení, název senzoru a umístění senzoru. Můžete přidat další značky, které mohou být užitečné pro váš konkrétní projekt.

sensorReadings.addTag("device", DEVICE);
sensorReadings.addTag("location", "office");
sensorReadings.addTag("sensor", "bme280");

Synchronizujte čas, který je nutný pro ověření certifikátu.

timeSync(TZ_INFO, "pool.ntp.org", "time.nis.gov");

Zkontrolujte připojení k serveru InfluxDB a vytiskněte chybové zprávy v případě, že se připojení nezdaří:

// Check server connection
if (client.validateConnection()) {
  Serial.print("Connected to InfluxDB: ");
  Serial.println(client.getServerUrl());
} else {
  Serial.print("InfluxDB connection failed: ");
  Serial.println(client.getLastErrorMessage());
}

loop()

V loop(), odešleme hodnoty senzoru do InfluxDB každých 10 sekund.

Získáváme údaje o teplotě, vlhkosti a tlaku:

temperature = bme.readTemperature();
humidity = bme.readHumidity();
pressure = bme.readPressure()/100.0F;

A tyto hodnoty přidáme jako pole do našeho bodu (řádek s daty v databázi).

// Add readings as fields to point
sensorReadings.addField("temperature", temperature);
sensorReadings.addField("humidity", humidity);
sensorReadings.addField("pressure", pressure);

Vytiskněte si v Serial Monitor, co píšeme k věci:

Serial.println(client.pointToLineProtocol(sensorReadings));

Nakonec, abychom skutečně přidali bod do databáze, použijeme metodu writePoint() na InfluxDBClient objekt a předejte jako argument bod, který chceme přidat: client.writePoint(sensorReadings).

client.writePoint(sensorReadings);

Vymažte pole, abyste byli připraveni k použití v další smyčce.

sensorReadings.clearFields();

Nová data se do databáze zapisují každých 10 sekund.

Serial.println("Wait 10s");
delay(10000);

Ukázka – vizualizace dat

Po vložení všech požadovaných nastavení na kód jej můžete nahrát na vaši desku ESP32/ESP8266. Pokud se během kompilace objeví nějaká chyba, zkontrolujte následující:

  • zkontrolujte, že máte vybranou desku ESP32/ESP8266 v Nástroje > Deska.
  • Zkontrolujte verzi instalace desek ESP32/ESP8266 v nabídce Nástroje > Deska > Správce desek > ESP8266 nebo ESP32. Vyberte verzi 3.0.1 pro ESP8266 nebo verzi 2.01 pro ESP32, pokud máte problémy s jinými verzemi.

Po nahrání kódu na vaši desku otevřete sériový monitor s přenosovou rychlostí 115200. Stisknutím tlačítka RESET na desce ESP restartujte desku. Na sériovém monitoru by měl vytisknout něco podobného:

influxdb-send-sensor-readings-esp32 

Nyní přejděte na svůj účet InfludDB a přejděte do Průzkumníka dat kliknutím na odpovídající ikonu.

influxdb-data-explorer  

Nyní můžete svá data vizualizovat. Začněte výběrem požadovaného kbelíku. Poté musíme přidat filtry, abychom vybrali naše data. Vyberte měření v poli _measurement , zařízení a umístění. Poté můžete vybrat hodnoty teploty, vlhkosti nebo tlaku. Můžete také vybrat všechny hodnoty, pokud je chcete všechny vykreslit do stejného grafu.

Po zadání dotazu klikněte na tlačítko ODESLAT. Tím se zobrazí vaše data ve vámi zvoleném formátu. V levém horním rohu můžete vybrat různé způsoby vizualizace dat. Můžete také kliknout na tlačítko PŘIZPŮSOBIT a změnit barvu série.

influxdb-esp32-esp8266-temperature-data-explorer

Můžete vytvořit řídicí panel pro zobrazení více vizualizací dat v různých formátech (měřidla, histogram, jednotlivé statistiky atd.) nebo různých dat na stejné stránce. Například více grafů pro zobrazení teploty, vlhkosti a tlaku a polí pro zobrazení aktuálních měření.

Vytvoření řídicího panelu

Klikněte na ikonu řídicího panelu a poté na Vytvořit řídicí panel > Nový řídicí panel.

influxdb-create-dashboard 

Přidejte buňku. Vytvořte dotaz pro získání dat a vyberte požadovanou vizualizaci. Pojmenujte buňku, například Office Temperature(ESP32) . Můžete také kliknout na tlačítko Přizpůsobit a přizpůsobit graf (doporučujeme vybrat různé barvy pro teplotu, vlhkost a tlak). Nakonec klikněte na ikonu  v pravém horním rohu a přidejte vizualizaci jako buňku na svůj řídicí panel.

influxdb-esp32-esp8266-temperature-cell

Opakujte stejný postup pro ostatní měření (vlhkost a tlak). Můžete také přidat jednu statistiku pro zobrazení aktuálních hodnot každého měření.

Mám ESP32 a ESP8266 běžící stejným kódem současně, takže jsem vytvořil řídicí panel, který zobrazuje hodnoty každé desky.

esp32-esp8266-sensor-readings-dashboard (1)

Své buňky můžete přesunout na různé pozice a uspořádat řídicí panel tak, aby vám to dávalo smysl. Můžete si také přizpůsobit způsob, jakým se data obnovují a kolik datových bodů chcete vidět (až do posledních 30 dnů).

Závěr

V tomto tutoriálu jste se naučili, jak odeslat více hodnot senzorů do InfluxDB. InfluxDB přidá časové razítko ke všem datovým řádkům (bodu).

Jako příklad jsme použili snímač BME280, ale příklad můžete snadno upravit a použít jakýkoli jiný snímač nebo přidat další snímače. Tento příklad můžete také spustit na více tabulích, abyste mohli sledovat teplotu, vlhkost a tlak na různých místech – nezapomeňte přidat různé značky pro identifikaci míst nebo tabulí.

Literatura:

ESP32/ESP8266: Send BME280 Sensor Readings to InfluxDB. Random Nerd Tutorials [online]. RandomNerdTutorials.com, 2022 [cit. 2022-09-28]. Dostupné z: https://randomnerdtutorials.com/esp32-esp8266-sensor-bme280-influxdb/