BME680 mit NodeMCU an TTN anbinden

Diese Anleitung bezieht sich auf die BSEC Library Version 1.4.5.1 vom 16.11.2017

Eine meiner letzten Errungenschaften, ist ein Breakout mit dem BME680 von watterott. Der Sensor liefert Temperatur, Luftfeuchtigkeit, Luftdruck und einen Indoor Air Quality (IAQ) Wert. Für die Berechnung der IAQ wird aber eine spezielle Library von Bosch benötigt, die alles etwas verkompliziert. Ich hatte anfänglich meine Schwierigkeiten alles ans Laufen zu bekommen und hoffe das ich hiermit einigen helfen kann. Ein generelles Problem besteht aber weiterhin. Ich bekommen keine TXCOMPLETE Event geliefert, obwohl die Daten übertragen werder und somit steht der Datenversand immer noch an. Einzig durch einen Reset der LMIC, wie bei der Initialisierung, ermöglicht mir Daten wiederholt zu schicken. Mit einem „Hello World“ Sketch und dem gleichen Pin Mapping ist es kein Problem, aber mit meinem aktuellen BME680 Code schon. Somit ist OTAA auch nicht möglich. Eventuell hat hier jemand eine Idee für mich.

 

BME680 Vorbereitungen

Zunächst müssen wir uns die BSEC Software besorgen. Diese kann, nach Akzeptierung der Lizenzvereinbarungen, direkt von Bosch geladen werden. Ihr entpackt anschließend das Zip-File.

 

Arduino IDE anpassen

Wenn ihr bereits den NodeMCU in die Arduino IDE eingebunden habt, könnt ihr diesen Abschnitt überspringen.

Ihr Öffnet die Arduino IDE und geht auf Datei >> Voreinstelungen >> Zusätzich Boardverwalter-URLs und tragt dort folgenden Link ein.


http://arduino.esp8266.com/stable/package_esp8266com_index.json

Anschließend wechselt ihr zu Werkzeuge >> Board  >> Boardverwalter und sucht nach ESP8266 und installiert dort ESP8266 Community.

 

BSEC integrieren 

Die BSEC beihaltet vorgefertigte Librarys, welche beim Kompilieren mit eingebunden werden müssen, dazu müssen ein Paar Anpssungen vorgenommen werden. Normalerweise solltet ihr die Software eures Boards unter <USER-HOME>\AppData\Local\Arduino15\packages\esp8266\ finden.

1. Kopiert die Datei algo\bin\ESP8266\libalgobsec.a aus dem BSEC Paket nach hardware\esp8266\2.3.0\tools\sdk\lib.

2. Die Linker Datei hardware\esp8266\2.3.0\tools\sdk\ld\eagle.app.v6.common.ld muss ebenfalls angepasst werden. Fügt folgende Zeile ein:


*libalgobsec.a:(.literal .text .literal.* .text.*)

nach

*libm.a:(.literal .text .literal.* .text.*)

3. Anschließend müssen wir dem Linker noch anweisen BSEC zu integrieren. Erweitert dazu folgende Zeile in der Datei hardware\esp8266\2.3.0\platform.txt

compiler.c.elf.libs=-lm -lgcc

um

-lalgobsec

 

Soft- und Hardware Konfiguration

Ihr erstellt nun einen Ordner bsec_iot_example und kopiert folgende Dateien aus dem BSEC Paket. Anschließend sollt euer Ordner neun Dateien enthalten. Der Ordner sollte den Namen bsec_iot_example haben, da das .ino File auch so heißt und euch die Arduino IDE nicht mit der bekannte Fehlermeldung kommt und einen weiteren Ordner erzeugt.

  • aus /algo:
    bsec_datatypes.h
    bsec_interface.h

 

  • aus /API: (alle .h und .c Dateien)
    bme680.c
    bme680.h
    bme680_defs.h

 

  • aus/example
    bsec_integration.c
    bsec_integration.h
    bsec_iot_example.ino

 

Das BME680 Breakout von Watterott verwendet als Default die I²C Adresse 0x77, die BSEC Library aber 0x76 per Default. Es gibt nun drei Möglichkeiten dieses Problem zu beseitigen, ihr braucht nur eine auswählen.

  1. Den Pin SDO auf dem Breakout mit GND verbinden, damit nutzt das BME Breakout die 0x76
  2. In der bme680_defs.h die Adressen anpassen, bzw. tauschen.
  3. In der bsec_integration.c auf die Secondary umschreiben

Für Punkt 2 müsst ihr folgende Zeilen in der bme680_defs.h anpassen. Tauscht einfach die Adressen oder schreibt eure Werte rein.


/** BME680 I2C addresses */
#define BME680_I2C_ADDR_PRIMARY UINT8_C(0x77)
#define BME680_I2C_ADDR_SECONDARY UINT8_C(0x76)

Für Punkt drei ändert ihr in der bsec_integration.c folgende Zeile. Ich habe dort den Eintrag Primary gegen Secondary getauscht.

bme680_g.dev_id = BME680_I2C_ADDR_SECONDARY;

Den I²C -Bus habe ich auf GPIO 0 und 2 gelegt. Passt dieses euren Wünschen an.

Wire.begin(0,2); //GPIO SDA und SCL D3,D4

Damit sollte euer Sketch kompilieren und laufen. Ein Kleinigkeit noch für alle die kein LoRaWAN nutzen. Bosch hat einen Offset von 5°C eingebaut, diesen solltet ihr entfernen oder euren Gegebenheiten anpassen.

ret = bsec_iot_init(BSEC_SAMPLE_RATE_LP, 0.0f, bus_write, bus_read, sleep, state_load, config_load);

Anschließend habe ich noch alles um die nötigen LoRaWAN Einstellungen angepasst damit ich den Node mit TTN nutzen konnte. Das Ergebnis findet ihr auf GitHub, ist aber nicht sehr schön und hat halt den EV_TXCOMPLETE Bug. Eventuell hat jemand eine Idee.

 

Das Schaltbild sieht so aus. Die Pinbelegung findet ihr im Sketch auf GitHub.

bme680 schema

TTN Anpassen

Damit ist der Payload Decoder gemeint. Somit habt ihr eure Daten gut aufbereitet.

function Decoder(b, port) {

  var temp = (b[0] | b[1]<<8 | (b[1] & 0x80 ? 0xFF<<16 : 0)) / 100;
  var hum = (b[2] | b[3]<<8 | (b[3] & 0x80 ? 0xFF<<16 : 0)) / 100;
  var iaq = (b[4] | b[5]<<8 | (b[5] & 0x80 ? 0xFF<<16 : 0)) / 100;
  var press = (b[6] | b[7]<<8 | (b[8] & 0x80 ? 0xFF<<16 : 0))/10;


  return {
    env: {
      temp: temp,
      hum: hum,
      iaq: iaq,
      press: press
    },
  };
}

 

Ich hoffe ich konnte euch etwas helfen und eventuell fällt jemandem ja ein, wie ich den Bug beheben kann.

4 Gedanken zu “BME680 mit NodeMCU an TTN anbinden

  1. Hallo Björn,
    nachdem Reinhard mich auf Dein Blog aufmerksam gemacht hat, habe ich Deine Doku heute mal nach vollzogen.
    – es scheint mit dem 16.11. eine neue .ZIP von Bosch zu geben. Da ist alles etwas „ge-streamlined“ und von Dir dokumentierte Files fehlen, dennoch kompiliert die .ino ohne Fehler, wenn man die Files einfach weg läßt.
    Vielleicht solltest Du noch schreiben, wo man das Verzeichnis „bsec_iot_example“ , denn das erschießt sich m.E. erst, wenn man sieht, dass man eine .ino reinkopiert.
    – ich habe im Sketch noch #include hinzugefügt, da sonst mein I²C auf Pin D5 und D6 nicht wollte.
    Viele Grüße von Zülpicher Platz
    Klaus

    • Hallo Klaus,

      danke für die Infos, ich werde morgen mal schauen was sich geändert hat. Eventuell sollte ich die ESP8266WiFi.h ebenfalls einbinden, den ich vermute mein TXCOMPLETE Problem hat was mit dem I²C Bus und dem Pin für DIO1 zu tun.
      Die Anmerkung zum Ordner habe ich auch gleich aufgenommen.

      Grüße aus Sülz,
      Björn

Schreibe einen Kommentar

%d Bloggern gefällt das: