01-05-2021 10:28 AM - edited 01-05-2021 10:40 AM
Good morning, i have implemented a temperature sensor with bme 680 and esp32.
The sketch I implemented seems to work correctly, but after about 12 hours it goes into error.
This problem has been repeated for days and I can't understand why.
Unfortunately I could not find the error code
I am new to arduino and the code is probably not clean.
To make sure it doesn't depend on other factors, I'm trying the same code, but without using the bme680 sensor. That is, I connect to wifi, publish a message on MQTT and go to sleep, all this repeated every 3 minutes
Thank you
This is my actual sketch:
#include <Arduino.h>
#include <ArduinoJson.h>
#include "bsec.h"
#include <PubSubClient.h>
#include <WiFiClientSecure.h>
#define uS_TO_S_FACTOR 1000000 /* Conversion factor for micro seconds to seconds */
#define TIME_TO_SLEEP 180 /* Time ESP32 will go to sleep (in seconds) */
RTC_DATA_ATTR int bootCount = 0;
const char *SSID = "XXXXXX";
const char *PWD = "XXXXXXX";
const char* mqtt_server = "XXXXX";
const char* mqtt_user = "XXXXX";
const char* mqtt_pwd = "XXXXX";
WiFiClientSecure espclientSecure;
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
char msg[MSG_BUFFER_SIZE];
int value = 0;
String output;
StaticJsonDocument<500> jsonDocument;
char buffer[500];
// Create an object of the class Bsec
Bsec iaqSensor;
// env variable
String temperature;
String humidity;
String pressure;
String CO2;
String gasResistance;
String iaq;
int i;
void connectToWiFi() {
Serial.print("Connecting to ");
Serial.println(SSID);
WiFi.begin(SSID, PWD);
while (WiFi.status() != WL_CONNECTED) {
if ( i == 15 ){ WiFi.reconnect();}
if (i > 30){
break;
}
delay(500); i++;
}
Serial.print("Connected. IP: ");
Serial.println(WiFi.localIP());
}
void setup() {
Serial.begin(9600);
// Sensor setup
Wire.begin();
iaqSensor.begin(BME680_I2C_ADDR_SECONDARY, Wire);
bsec_virtual_sensor_t sensorList[10] = {
BSEC_OUTPUT_RAW_TEMPERATURE,
BSEC_OUTPUT_RAW_PRESSURE,
BSEC_OUTPUT_RAW_HUMIDITY,
BSEC_OUTPUT_RAW_GAS,
BSEC_OUTPUT_IAQ,
BSEC_OUTPUT_STATIC_IAQ,
BSEC_OUTPUT_CO2_EQUIVALENT,
BSEC_OUTPUT_BREATH_VOC_EQUIVALENT,
BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE,
BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY,
};
iaqSensor.updateSubscription(sensorList, 10, BSEC_SAMPLE_RATE_LP);
checkIaqSensorStatus();
connectToWiFi();
client.setServer(mqtt_server, 1883);
}
void loop() {
if (!client.connected()) {
connectToWiFi();
delay(5000);
reconnect();
}
setCpuFrequencyMhz(160);
++value;
snprintf (msg, MSG_BUFFER_SIZE, "Nuovi dati letti, count: #%ld", value);
Serial.print("Publish message: ");
Serial.println(msg);
iaqSensor.run();
temperature = (String)iaqSensor.temperature;
humidity = (String)iaqSensor.humidity;
iaq = (String)iaqSensor.iaq;
pressure = (String)(iaqSensor.pressure / 100);
gasResistance = (String)iaqSensor.gasResistance;
Serial.println("Umidità:"+(String)iaqSensor.humidity);
Serial.println("Temperatura:"+(String)iaqSensor.temperature);
Serial.println("IAQ:"+(String)iaqSensor.iaq);
Serial.println("Pressure:"+(String)(iaqSensor.pressure/100));
Serial.println("Gas Resistance:"+(String)iaqSensor.gasResistance);
//PubSubClient::setBufferSize(500);
setJsonValues(iaqSensor.temperature, iaqSensor.humidity, iaqSensor.gasResistance, iaqSensor.pressure, iaqSensor.iaq);
size_t n = serializeJson(jsonDocument, buffer);
client.publish("esp32/output", buffer, n);
String messageTemperature = "Temperatura:"+(String)iaqSensor.temperature;
bot.sendMessage(CHAT_ID, messageTemperature, "");
delay(3000);
client.disconnect();
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); // ESP32 wakes up every 5 seconds
Serial.println("Going to light-sleep now");
Serial.flush();
setCpuFrequencyMhz(80);
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
btStop();
esp_light_sleep_start();
}
// 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 */
Serial.println("Restarting in 10 seconds");
delay(10000);
ESP.restart();
} 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 */
Serial.println("Restarting in 10 seconds");
delay(10000);
ESP.restart();
} else {
output = "BME680 warning code : " + String(iaqSensor.bme680Status);
Serial.println(output);
}
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP32Cameretta-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str(), mqtt_user, mqtt_pwd)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void add_json_object(char *tag, float value, char *unit) {
JsonObject obj = jsonDocument.createNestedObject();
obj["type"] = tag;
obj["value"] = value;
obj["unit"] = unit;
}
void setJsonValues(float temperature, float humidity, float gasResistance, float pressure, float iaq) {
jsonDocument.clear();
Serial.println("Get env");
add_json_object("temperature", temperature, "°C");
add_json_object("humidity", humidity, "%");
add_json_object("gas", gasResistance, "ohm");
add_json_object("pressure", pressure, "mBar");
add_json_object("iaq", iaq, "IAQ");
}
void errLeds(void)
{
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
delay(200);
digitalWrite(LED_BUILTIN, LOW);
delay(200);
}
Solved! Go to Solution.
01-06-2021 11:27 PM
Hello
It's not super clear what kind of error you are facing. Could you share more details on the error such as logs etc?
01-07-2021 09:42 AM
The problem reported in the post appears to be solved.
Now the problem is that the value of iaqAccuracy is always 0 even after 24 hours of operation?
Can you help me?
02-10-2021 10:43 AM
It seems that the you set too much delay inside the main process. BSEC can only support ~6.25% tolerance for the sample rate which means if the system delay is over 0.18 second under LP mode, the BSEC act this measurement as the first measurement again.
Accuracy is 0 during first run-in time which is 5min under LP mode. In this case, sensors are always in run-in time.
Please use standard example code and no extra delay for the main process.