Projekt: Raum(-luft)sensor (Temp, Hum, Co2, VOC, LUX)

Begonnen von herrmannj, 21 Januar 2019, 00:24:44

Vorheriges Thema - Nächstes Thema

juergs

Zitatman bekommt einfach keine guten Leute mehr  8) 8) 8)

Gruß Peter

Ja, ja schon klar  ;D ;D ;D ;D

Zitat:
"... just to confuse the russians"

herrmannj

@juergen

ich habe mir die adafruit lib für den bme280 genau angeschaut, die ist fast ein zu eins die Referenz Implementierung von Bosch. Für den BME680 habe ich mir nur das Interface angeschaut, Du hast recht, Temp,Hum,Pres und Resistance. Kein Wunder wenn ich mir die Klimmzüge anschaue mit den libs ...

Frage: die Resistance für VOC stellt ja die VOC dar. Hältst Du es für denkbar aus der Resistance des BME680, mit Hilfe der Werte vom AMS als Referenz, die Werte so aufzubereiten das dann da auch ppm rauskommt ? Die Kurven sahen in Deinen Plots ja ähnlich aus.

Also, den BME per adafruit einbinden, mit Hilfe des AMS Umrechnungsfaktor finden und ready ?

Starsurfer

Moin,
habe mich heute morgen noch einmal darangesetzt und das Script von Anfang an neu aufgebaut. Jetzt funktioniert das WLAN Einrichten wieder und er sendet wieder Daten.
Eingebaut habe ich momentan nur den Mh-z und den BME280.
Allerdings habe ich mit dem senden der BME Daten ein Problem:
T:IAQC;FW:1.0;ID:178FA2;IP:192.168.178.176;R:-86;F:TH_A;T:22.8;H:;P:1025.2;
Wie man sieht ist H leer.

Hier der Code dafür, aufgebaut auf dem DHT Code:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// BME280
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

char BMEMsg[512];
char str_temp[6];
char str_hum[6];
char str_press[6];

void getBMEReadings() {
  float h = bme.readHumidity();
  float t = bme.readTemperature();
  float p = bme.readPressure() / 100.0F;
  if (isnan(t) || isnan(h) || isnan(p)) {
    prevBMEMillis = millis() - intervalBME + 2000;  // retry in 2 sec
  } else {
    dtostrf(h, 3, 1, str_hum);
    dtostrf(t, 3, 1, str_temp);
    dtostrf(p, 3, 1, str_press);
    sprintf(BMEMsg, "F:TH_A;T:%s;H:%s;P:%s;", str_temp, str_hum, str_press);
  };
};


Also habe ich eine Debug Ausgabe für die Serielle Konsole eingebaut:
void printBMEValues() {
    Serial.print("Temperature = ");
    Serial.print(bme.readTemperature());
    Serial.println(" *C");

    Serial.print("Pressure = ");

    Serial.print(bme.readPressure() / 100.0F);
    Serial.println(" hPa");

    Serial.print("Approx. Altitude = ");
    Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
    Serial.println(" m");

    Serial.print("Humidity = ");
    Serial.print(bme.readHumidity());
    Serial.println(" %");

    Serial.println();
}


Ausgabe:
Temperature = 22.94 *C
Pressure = 1025.29 hPa
Approx. Altitude = -99.75 m
Humidity = 30.84 %

Humidity ist also da.

2. Welche Datei muss ich im FHEM Ordner anpassen/erweitern damit die Werte in FHEM angelegt werden, 10_SLinkTH.pm?
FHEM Server: Fujitsu Esprimo q920 + LaCrosseGateway + HM-MOD-RPI-PCB WLAN + ConBee
HomeMatic HM-CC-RT-DN - Sonoff Tasmota
LaCrosse TX29DTH - Innr SP120 - Osram Smart+ Plug
Arduino Mega - MQTT - Pluggit 300
https://www.diy-robot-lawn-mower.com

juergs

Hallo Jörg,

ZitatFrage: die Resistance für VOC stellt ja die VOC dar. Hältst Du es für denkbar aus der Resistance des BME680, mit Hilfe der Werte vom AMS als Referenz, die Werte so aufzubereiten das dann da auch ppm rauskommt ? Die Kurven sahen in Deinen Plots ja ähnlich aus.
Also, den BME per adafruit einbinden, mit Hilfe des AMS Umrechnungsfaktor finden und ready ?
die Überlegung war ja naheliegend. Es haben sich schon einige versucht.
Ich glaube, mit genug Time & Material würde das auch machbar sein, nur fehlt es mir daran  :'(

Komme vermutlich erst am WoE dazu mich um die Implementierung zu kümmern.

Jürgen

herrmannj

Hallo Starsurfer

warum bei Dir kein Hum ankommt wundert mich. Ich bin noch dabei den Sketch auf Wemos anzupassen (u.a.) aber hier ist der sketch mit dem ich den BME teste, Du müsstest die Signatur im sprintf wieder auf die gleiche wie beim DHT setzen (F:THP zu F:TH_A und pressure raus) dann hast Du die Daten in fhem (10_SlinkIAQC.pm). Anpassungen wären sonst in SLink und SLinkIAQ - aber lass, ist ja sowieso noch "under construction".

btw: wie genau stimmen Deinen HUM Werte? Ich habe eine konstanten offset von 7% ...

Testsketch
// WEMOS D1 mini: Arduino Board Lolin/Wemos D1 R2 & mini
// Libs:
// Adafruit unified sensor library
// Adafruit BME280 library

// uncomment for Serial debugging statements
#define DEBUG_SERIAL

#ifdef DEBUG_SERIAL
#define DEBUG_BEGIN Serial.begin(115200)
#define DEBUG_PRINT(x) Serial.println(x)
#else
#define DEBUG_PRINT(x)
#define DEBUG_BEGIN
#endif

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

// timer vars
// Signal LED
unsigned long prevLedMillis     = millis(); // counter main loop for signaling led
unsigned long prevBme280Millis  = millis(); // counter main loop for BME 280
unsigned long prevIaqMillis     = millis(); // counter main loop for iaq
unsigned long prevMhz19Millis   = millis(); // counter main loop for MH-Z19
unsigned long prevLdrMillis     = millis(); // counter main loop for LDR
unsigned long sigLedOn          = 50;       // ms for led on
unsigned long sigLedOff         = 450;      // ms for led off
unsigned long intervalBme280    = 10000;    // default
unsigned long intervalIaq       = 10000;    // default
unsigned long intervalMhz19     = 10000;    // default
unsigned long intervalLdr       = 1000;     // default
unsigned long intervalLed       = 0;        //

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// BME 280
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
char bme280Msg[64];   // ie.
Adafruit_BME280 bme;  // I2C
char str_temp[6];
char str_hum[6];
char str_pressure[16];

void getBme280Readings() {
  float t = bme.readTemperature();
  float h = bme.readHumidity();
  float p = bme.readPressure();
  //display.setTempHum(t, h);
  dtostrf(t, 4, 1, str_temp);
  dtostrf(h, 4, 1, str_hum);
  dtostrf(p / 100.0F, 3, 1, str_pressure);
  sprintf(bme280Msg, "F:THP;T:%s;H:%s;P:%s;", str_temp, str_hum, str_pressure);
  DEBUG_PRINT(bme280Msg);
};

void setup() {
 
  DEBUG_BEGIN; //for terminal debugging
  DEBUG_PRINT();

  // Enable I2C for Wemos D1 mini SDA:D2 / SCL:D1
  Wire.begin(D2, D1);
  Wire.setClockStretchLimit(1000); // Default is 230us, see line78 of https://github.com/esp8266/Arduino/blob/master/cores/esp8266/core_esp8266_si2c.c
  Wire.setClock(1000000L);

  if (! bme.begin(0x76, &Wire)) {
    DEBUG_PRINT("Could not find a valid BME280 sensor, check wiring and address!");
  };
 
};

void loop() {

  unsigned long currentMillis = millis();
 
  if (currentMillis - prevBme280Millis > intervalBme280) {
    prevBme280Millis = currentMillis;
    getBme280Readings();
  };
 
};

Starsurfer

#230
Habe das mal eingebaut und lade gerade hoch und teste das mal.
Habe mittlerweile auch den MAX4009 Lichtsensor eingebaut und funktioniert, wird auch in FHEM angelegt, da ich den LDR Code dafür nutze.
Die Luftfeuchtigkeit liegt mit knapp 8% daneben, gegen ein TX29DHT, der ein paar cm weiter weg steht.
Ein zweiter BME280 mit espeasy am Nodemcu liegt nur mit knapp 4% daneben, der liegt fast neben den Wemos.

Habe die Datei mal angehängt, die includes am Anfang sind auch deutlich weniger geworden :-)


Nachtrag:
Jetzt habe ich Luftfeuchtigkeit:
T:IAQC;FW:1.0;ID:178FA2;IP:192.168.178.176;R:-84;F:CO2;C:519;
T:IAQC;FW:1.0;ID:178FA2;IP:192.168.178.176;R:-84;F:TH_A;T:22.8;H:31.7;P:10.3;

FHEM Server: Fujitsu Esprimo q920 + LaCrosseGateway + HM-MOD-RPI-PCB WLAN + ConBee
HomeMatic HM-CC-RT-DN - Sonoff Tasmota
LaCrosse TX29DTH - Innr SP120 - Osram Smart+ Plug
Arduino Mega - MQTT - Pluggit 300
https://www.diy-robot-lawn-mower.com

herrmannj

Hallo Jürgen,

ja, ist kein revolutionärer Gedanke ...  ;)

Hier habe ich was gefunden: https://forums.pimoroni.com/t/bme680-observed-gas-ohms-readings/6608/15

Die Theorie vom user "Billy_the_nid", die ich plausibel finde, lautet so:

Die Werte werden hauptsächlich von Alterung, den Heating settings und der Luftfeuchte beeinflusst.
"Alterung" ist klar -> "automatic baseline correction"
"Heating" -> haben wir in der Hand wobei ich eh nicht genau verstehe warum man das anpassen kann. Genauer: was bewirkt das, warum genau dreht man da.
"Humitidy" -> da hat er sogar eine Formel zur Korrektur (die verstehe ich aber noch nicht)

Mein BME680 kommt auch erst Ende der Woche. Den habe ich sowieso nur bestellt damit ich das auch supporten kann. Ich nehme den mal zum testen. Wenn die Anpassung mit PEMue an den Platinen fertig ist dann bestelle. Bis die dasind ist der BME schon mal eingebrannt, dann bauae ich einen zum Datensammeln draussen auf.

Dort erwarte ich dann konstante und niedrige VOC, das heist ein/wei Wochen Daten sammeln und loggen und wenn der Wettergott es gut meint hat man dann bei konstantem VOC genügend Feuchteschwankungen um, vielleicht, zu sehen wir sich das auswirkt. Im nächsten Schritt würde es dann darum gehen ob man eine Formel findet das zu korrigieren. Zeitleiste also x Wochen plus.

Parallel, bzw lange vorher, hast Du die Bosch libs laufen.

An alle die still oder laut mitlesen: nehmt einen AMS ... (den habe ich am Tag nach einer Party(!) erstmals in Betrieb genommen. Zeit vom Öffnen der Verpacken bis Daten in fhem unter 60 Minuten ....)

herrmannj

ZitatDie Luftfeuchtigkeit liegt mit knapp 8% daneben, gegen ein TX29DHT, der ein paar cm weiter weg steht.
Wie bei mir, habe 2 Thermometer daneben stehen (HM und NoName).

Zeigt der 8% zu wenig an ?

Starsurfer

Ja 8% zu wenig. Habe aber noch nicht verfolgt ob das konstant gleich bleibt.
FHEM Server: Fujitsu Esprimo q920 + LaCrosseGateway + HM-MOD-RPI-PCB WLAN + ConBee
HomeMatic HM-CC-RT-DN - Sonoff Tasmota
LaCrosse TX29DTH - Innr SP120 - Osram Smart+ Plug
Arduino Mega - MQTT - Pluggit 300
https://www.diy-robot-lawn-mower.com

herrmannj

Ich habe Beiträge im Netz gefunden die das ähnlich beschrieben. Für die Adafruit lib gibt es hier einen bugreport https://github.com/adafruit/Adafruit_BME280_Library/issues/44
der möglicherweise was damit zu tun hat. Allerdings habe ich die lib dahingehen geändert und das hat nichts gebracht - da habe ich es wieder ausgebaut ... also einfach 7% bzw 8% draufrechnen. Das heist ich muss in den sketch was einbauen damit man eine Korrektur hinterlegen kann.

Mal schauen ob das noch von anderen beobachtet wird. Bei mir ist die Diff schon über Tage konstant, ich hatte erst die Hoffnung dass sich das noch einläuft ... wie es scheint eher nein ;)

Starsurfer

Ich hatte heute erst beim suchen ein BME Script gesehen, wo man einen Offset eingeben konnte, war aber glaube ich für die Temperatur. Die liegt bei mir knapp 1 C zu hoch.
Habe oben mal mein aktuelles Script mit dazu gepackt.
FHEM Server: Fujitsu Esprimo q920 + LaCrosseGateway + HM-MOD-RPI-PCB WLAN + ConBee
HomeMatic HM-CC-RT-DN - Sonoff Tasmota
LaCrosse TX29DTH - Innr SP120 - Osram Smart+ Plug
Arduino Mega - MQTT - Pluggit 300
https://www.diy-robot-lawn-mower.com

herrmannj

bei der Temp verstehe ich das ja noch. Da habe ich im Bosch Datasheet gelesen das die auch Anpassungen anbieten (Großserie, nicht uns;) ) wenn der Sensor in einem Gehäuse mit Wärmequellen liegt. Die rechnen das also echt raus. Bei der Hum verstehe ich es nicht, schon garnicht 7/8%, das ist auch viel zu viel für den geplanten Einsatz (Dewpoint, Lüftung etc).

Wenn es dazu kommt baue ich das aber so dass man den offset von fhem aus hinterlegen kann.

juergs

Offset ist eine Sache, aber ob es dynamisch in der Steigung auch passt ?

herrmannj


juergs

Zitatmuss man sehen. passt hum bei Dir?
Ich habe mehere BME680 im Einsatz, so einige LaCrosse etc- Sensoren im Einsatz.
Aber alle differieren in den von Euch angegebenen Toleranzen. So 8..10% scheint mir "normal" zu sein.
Viel Schlimmer sind die DHTs mit 20% und mehr Abweichung...
Schaue heute Abend mal genauer drauf.
Hatte aber auch eine gute Webseite zur Kalibrierung der Luftfeuchte: Stichw. gesättigte Salzlösung.  ;)