Funksensor mit Bosch sensortec BME680 / Luftgüte

Begonnen von juergs, 28 Oktober 2017, 18:05:43

Vorheriges Thema - Nächstes Thema

kylix

Hi Thomas,

the basic.ino sketch doesn't seem to use those 2 functions (I'll have to check bsec.h and bsec.cpp):

#include "bsec.h"

// Helper functions declarations
void checkIaqSensorStatus(void);
void errLeds(void);

// Create an object of the class Bsec
Bsec iaqSensor;

String output;

// Entry point for the example
void setup(void)
{
  Serial.begin(115200);

  iaqSensor.begin(BME680_I2C_ADDR_PRIMARY, Wire);
  output = "\nBSEC library version " + String(iaqSensor.version.major) + "." + String(iaqSensor.version.minor) + "." + String(iaqSensor.version.major_bugfix) + "." + String(iaqSensor.version.minor_bugfix);
  Serial.println(output);
  checkIaqSensorStatus();

  bsec_virtual_sensor_t sensorList[7] = {
    BSEC_OUTPUT_RAW_TEMPERATURE,
    BSEC_OUTPUT_RAW_PRESSURE,
    BSEC_OUTPUT_RAW_HUMIDITY,
    BSEC_OUTPUT_RAW_GAS,
    BSEC_OUTPUT_IAQ_ESTIMATE,
    BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE,
    BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY,
  };

  iaqSensor.updateSubscription(sensorList, 7, BSEC_SAMPLE_RATE_LP);
  checkIaqSensorStatus();

  // Print the header
  output = "Timestamp [ms], raw temperature [°C], pressure [hPa], raw relative humidity [%], gas [Ohm], IAQ, IAQ accuracy, temperature [°C], relative humidity [%]";
  Serial.println(output);
}

// Function that is looped forever
void loop(void)
{
  if (iaqSensor.run()) { // If new data is available
    output = String(millis());
    output += ", " + String(iaqSensor.rawTemperature);
    output += ", " + String(iaqSensor.pressure);
    output += ", " + String(iaqSensor.rawHumidity);
    output += ", " + String(iaqSensor.gasResistance);
    output += ", " + String(iaqSensor.iaqEstimate);
    output += ", " + String(iaqSensor.iaqAccuracy);
    output += ", " + String(iaqSensor.temperature);
    output += ", " + String(iaqSensor.humidity);
    Serial.println(output);
  } else {
    checkIaqSensorStatus();
  }
}

// Helper function definitions
void checkIaqSensorStatus(void)
{
  if (iaqSensor.status != BSEC_OK) {
    if (iaqSensor.status < BSEC_OK) {
      output = "BSEC error code : " + String(iaqSensor.status);
      Serial.println(output);
      for (;;)
        errLeds(); /* Halt in case of failure */
    } else {
      output = "BSEC warning code : " + String(iaqSensor.status);
      Serial.println(output);
    }
  }

  if (iaqSensor.bme680Status != BME680_OK) {
    if (iaqSensor.bme680Status < BME680_OK) {
      output = "BME680 error code : " + String(iaqSensor.bme680Status);
      Serial.println(output);
      for (;;)
        errLeds(); /* Halt in case of failure */
    } else {
      output = "BME680 warning code : " + String(iaqSensor.bme680Status);
      Serial.println(output);
    }
  }
}

void errLeds(void)
{
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
  delay(100);
  digitalWrite(LED_BUILTIN, LOW);
  delay(100);
}

kylix

I think I found them in bsec.cpp, but they are different:
/**
@brief Callback function for reading registers over I2C
*/
int8_t Bsec::i2cRead(uint8_t devId, uint8_t regAddr, uint8_t *regData, uint16_t length)
{
uint16_t i;
int8_t rslt = 0;
if(Bsec::i2c_obj) {
Bsec::i2c_obj->beginTransmission(devId);
Bsec::i2c_obj->write(regAddr);
rslt = Bsec::i2c_obj->endTransmission();
Bsec::i2c_obj->requestFrom((int) devId, (int) length);
for (i = 0; (i < length) && Bsec::i2c_obj->available(); i++) {
regData[i] = Bsec::i2c_obj->read();
}
} else {
rslt = -1;
}
return rslt;
}

/**
* @brief Callback function for writing registers over I2C
*/
int8_t Bsec::i2cWrite(uint8_t devId, uint8_t regAddr, uint8_t *regData, uint16_t length)
{
uint16_t i;
int8_t rslt = 0;
if(Bsec::i2c_obj) {
Bsec::i2c_obj->beginTransmission(devId);
Bsec::i2c_obj->write(regAddr);
for (i = 0; i < length; i++) {
Bsec::i2c_obj->write(regData[i]);
}
rslt = Bsec::i2c_obj->endTransmission();
} else {
rslt = -1;
}

return rslt;
}

hdgucken

Ok, i meant "bsec_iot_example" in the folder "example"  :)
Thats different.

greetings Thomas  ;)

PeMue

RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

juergs

Hallo Peter,
die ePaper-Display-Idee finde ich gut.
Nach ca. 1 Jahr verabschiedet sich mein kleines OLED-Display
bei Dauerbetrieb langsam ...

Grüße,
Jürgen

PeMue

Zitat von: juergs am 03 Oktober 2018, 11:13:48
... die ePaper-Display-Idee finde ich gut.
so etwas? Dann sollten wir aber einen neuen Thread dafür öffnen.

Gruß PeMue
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

juergs

#381
Zitat von: PeMue am 03 Oktober 2018, 16:49:14
so etwas? Dann sollten wir aber einen neuen Thread dafür öffnen.
Gruß PeMue

Ja, muss aber erst noch bestellen ...  ;)
Das OLED-Display ist wirklich so schlecht im Dauerbetrieb geworden ...  :(

fh168

Wo gibt es den sketch mit dem OLED Display und der IAD - Anzeige?
Hue, Lacrosse, PCA301, MySensors, V 1.67 CUL 868 V3.4, Lacrosse-WLAN-Gateway, Tasmota RF-

juergs

#383
Hallo fh168,

hier und hdguckens aktuellerer  Universal-Sensor-Sketch

Jeweils mit spezifischer LGW-Version (bin leider noch auf "LaCrosseGateway V1.30")  + fhem-Modul-Änderungen zu betreiben!
Vom Bosch müsste es auch schon wieder neue Versionen der BSEC-Library geben ....

Würde aber eher noch den Sketch von hdgucken hier in diesem Thread nehmen,
da ich noch nicht auf die neue Version der LaCrosseGateway umgestellt habe.
Sobald PeMue mit dem Braten der LGW-Platine nachgezogen hat, baue ich meine Sketche ebenfalls um (Sorry..)

Die IAQ-Quer ist nur der gleitende Mittelwert des IAQ-Wertes, der steht etwas ruhiger ...

Grüße,
Jürgen


hdgucken


juergs

... und der Preis von 19$ scheint im Bereich des BME680 zu liegen ...  ;)


PeMue

#388
Zitat von: juergs am 04 Oktober 2018, 20:47:59
Sobald PeMue mit dem Braten der LGW-Platine nachgezogen hat, baue ich meine Sketche ebenfalls um (sorry ...)
hat er  ;) und die BME680 werden erkannt bzw. liefern Werte.

Gruß Peter
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

juergs

#389
Hallo Peter,

die Sensor-Platine hat sich nach der Bestückung etwas zickig angestellt.
Habe aber auch eine etwas "eigenwilligen" Aufbau gewählt:

Da die FTDI232 noch nicht da waren, habe ich mich mit einem Serial-Adapter beholfen.
Dann war zu klären wie das mit dem RTS-Signal zu handeln ist, wenn der Adapter dieses nicht nach außen geführt hat...

Den Flash-Vorgang habe ich dann versucht, mit 2 Tastern zu "simulieren",  was aber auf Anhieb nicht funktionierte.
Dann habe ich mich auf die Fehlersuche begeben:
Beim Antippen des CH-PD-Pins mit der Oszi-Spitze leuchtete die Reset-LED kurz auf.
Dann habe ich den CH_PD-Eingang kurzerhand mit 3V3Volt verbunden -> Programmieren geht!

Um die Frage zu beantworten wie das mit der ID und mehreren Sensoren geht (seriell, mit 115.200 KBaud, 8N1):

(COM6) Compiled: Fri Dec 07 17:57:22 2018
(COM6) Protocol: UniversalSensor
(COM6) BSEC version: 1.4.5.1<LF>ESP Core Version: 2_4_0_RC1
(COM6) ESP SDK Version: 2.0.0(656edbf)
(COM6)
(COM6) Do you want to delete settings in EEPROM (Y/N)?
(COM6) Not deleted.
(COM6)
(COM6) Node-ID is: 255 (0xFF)
(COM6) New value (1-254):
(COM6) sl<NUL>lœž|<NUL>Œ#<STX>ân<EOT><EOT><FF>Œ<EOT>$ì<FF>#|ƒ<STX>ä<ESC>"r²Ü>Œ<EOT>bŒòonŸ$nnœâì<FF>b<FS>pì#$ <ETX>{lpûnà<DLE><STX><FF><EOT>,<FF>l<EOT>ŒÜ<EOT><EOT><FF>b<EOT>oã|<STX>dì<EOT><EOT>p<FF>,,ûnNî<STX>lŒŽd`<STX><ESC><DC2>on<FF>$`<STX><SI><STX>o{Û'o<FF><FF>b<EOT>Ü<SI>l<SO>{›'o<FF><EOT>b<FF>Ü<SO>lÜãâ<FF>Ü<FS>ŽŒŒœpr$ü,oÜ<STX><Error: RX FRAMING ERROR><Error: RX FRAMING ERROR><Error: RX FRAMING ERROR><ESC>{,²Üî<STX><FF><DC3/XOFF>b<ESC>"olœ|Œûn|p<FF>$ž|<ESC><STX><EOT>nàŽ,<ETX>ä<ESC>ã'ƒ<ETX><EOT><ESC>b<DC2>Ûo`{l<Error: RX FRAMING ERROR>
(COM6) BME680 wireless sensor V3.0
(COM6) Compiled: Fri Dec 07 17:57:22 2018
(COM6) Protocol: UniversalSensor
(COM6) BSEC version: 1.4.5.1<LF>ESP Core Version: 2_4_0_RC1
(COM6) ESP SDK Version: 2.0.0(656edbf)
(COM6)
(COM6) Do you want to delete settings in EEPROM (Y/N)?
(COM6) Y
(COM6) Settings deleted.
(COM6)
(COM6) Node-ID is: 255 (0xFF)
(COM6) New value (1-254):
(COM6) 112
(COM6) Node-ID set to: 112 (0x70)
(COM6) Save permanently (Y/N)?
(COM6) OK.



(COM6) RFM69  init ... done
(COM6) BME680 init ... done
(COM6) BH1750 init ... done
(COM6) Ready, start measuring ...
(COM6)
(COM6) [63321.00] P: 994.3| T: 38.24| rH: 18.11| IAQ: 25.00 (0)| Gas: 1184.00| Light: 15.42lx
(COM6) [66321.00] P: 994.2| T: 38.28| rH: 18.00| IAQ: 25.00 (0)| Gas: 1443.00| Light: 15.42lx
(COM6) [69321.00] P: 994.3| T: 38.32| rH: 17.88| IAQ: 25.00 (0)| Gas: 2019.00| Light: 15.42lx
(COM6) [72321.00] P: 994.3| T: 38.33| rH: 17.83| IAQ: 25.00 (0)| Gas: 2560.00| Light: 15.42lx
(COM6) [75321.00] P: 994.3| T: 38.35| rH: 17.77| IAQ: 25.00 (0)| Gas: 3147.00| Light: 15.42lx
(COM6) [78321.00] P: 994.3| T: 38.33| rH: 17.77| IAQ: 25.00 (0)| Gas: 3593.00| Light: 15.42lx


Versuche, das auf der Sensor-HW/Platine noch herauszufinden woran das liegt/lag ...
...und ob die LGW damit zurecht kommt.  ;-)

Grüße,
Jürgen