I'm in the process of building a indoor climate monitor and I'm having difficulties getting the CCS811 and Si7021 sensors to run together. All the code used are the Adafruit lib examples.
I can run them separately just fine without any immediate or long run issues. However when I combine the two and start addressing both it will run fine for anywhere between 1 minute and 60 minutes, then fail with this error:
08:07:06.874 -> Si7021 test!
08:07:06.941 -> Found model Si7021 Rev(2) Serial #DB4AB1DE15B5FFFF
08:07:06.975 -> CO2: 0ppm, TVOC: 0ppb Temp:25.00
08:07:07.009 -> Humidity: 58.46 Temperature: 22.24
…
08:36:15.081 -> CO2: 405ppm, TVOC: 0ppb Temp:24.08
08:36:15.114 -> Humidity: 58.41 Temperature: 22.58
08:36:16.098 -> ERROR!
08:36:19.116 ->
08:36:19.116 -> Soft WDT reset
08:36:19.116 ->
08:36:19.116 -> >>>stack>>>
08:36:19.116 ->
08:36:19.116 -> ctx: cont
08:36:19.116 -> sp: 3ffffde0 end: 3fffffc0 offset: 01b0
08:36:19.150 -> 3fffff90: 00000000 00000000 00000001 3ffee4f8
08:36:19.218 -> 3fffffa0: 3fffdad0 00000000 3ffee4c8 40202a94
08:36:19.253 -> 3fffffb0: feefeffe feefeffe 3ffe851c 40101021
08:36:19.320 -> <<<stack<<<
I've experimented with various delays at the end of the loop() and between css811 and si7021 code but without any noticeable difference. Googling around for a resolution did point to issues relating to I2C clock stretching, but I haven't been able to get my head around what I need to do yet.
Any help much appreciated!
Here's the setup:
Sensor SDA is wired to GPIO4 and SCL is wired to GPIO5
NodeMCU ESP-12 development kit V1_0
Adafruit CSS811 hw and this sw lib: https://github.com/adafruit/Adafruit_Si7021 v1.0.1
Adadruit Si7021 hw and this sw lib: https://github.com/adafruit/Adafruit_CCS811 v1.2.2
Here's the code:
#include <Adafruit_CCS811.h>
Adafruit_CCS811 ccs;
#include "Adafruit_Si7021.h"
Adafruit_Si7021 sensor = Adafruit_Si7021();
void setup() {
// START CCS811 example
Serial.begin(9600);
Serial.println("CCS811 test");
if(!ccs.begin()){
Serial.println("Failed to start sensor! Please check your wiring.");
while(1);
}
//calibrate temperature sensor
while(!ccs.available());
float temp = ccs.calculateTemperature();
ccs.setTempOffset(temp - 25.0);
// START Si7021 example
// wait for serial port to open
while (!Serial) {
delay(10);
}
Serial.println("Si7021 test!");
if (!sensor.begin()) {
Serial.println("Did not find Si7021 sensor!");
while (true)
;
}
Serial.print("Found model ");
switch(sensor.getModel()) {
case SI_Engineering_Samples:
Serial.print("SI engineering samples"); break;
case SI_7013:
Serial.print("Si7013"); break;
case SI_7020:
Serial.print("Si7020"); break;
case SI_7021:
Serial.print("Si7021"); break;
case SI_UNKNOWN:
default:
Serial.print("Unknown");
}
Serial.print(" Rev(");
Serial.print(sensor.getRevision());
Serial.print(")");
Serial.print(" Serial #"); Serial.print(sensor.sernum_a, HEX); Serial.println(sensor.sernum_b, HEX);
}
void loop() {
// START CCS811 example
if(ccs.available()){
float temp = ccs.calculateTemperature();
if(!ccs.readData()){
Serial.print("CO2: ");
Serial.print(ccs.geteCO2());
Serial.print("ppm, TVOC: ");
Serial.print(ccs.getTVOC());
Serial.print("ppb Temp:");
Serial.println(temp);
}
else{
Serial.println("ERROR!");
while(1);
}
}
// START Si7021 example
Serial.print("Humidity: ");
Serial.print(sensor.readHumidity(), 2);
Serial.print("\tTemperature: ");
Serial.println(sensor.readTemperature(), 2);
//delay(1000); //from si7021 example
//delay(500); // from ccs811 example
delay(1000); // custom
}