Skip to content

Initial reading inaccurate when using MODE_SLEEP #27

@olicooper

Description

@olicooper

I Serial.print() the following to the console. Notice the intial h_pc, p_hpa and alt_m readings are off and how it takes 16ms to read...

Measure time 16ms => {"h_pc":51.34,"p_hpa":95007.30,"alt_m":558.15,"temp_c":21.32}
Measure time 8ms => {"h_pc":58.79,"p_hpa":98630.13,"alt_m":234.53,"temp_c":21.30}
Measure time 8ms => {"h_pc":51.03,"p_hpa":98629.98,"alt_m":234.55,"temp_c":21.26}
Measure time 8ms => {"h_pc":56.95,"p_hpa":98627.13,"alt_m":234.80,"temp_c":21.25}
Measure time 8ms => {"h_pc":53.36,"p_hpa":98624.58,"alt_m":235.02,"temp_c":21.25}

If it helps I am using PlatformIO with the latest ESP32 Arduino (1.3.0) on the Lolin Wemos D1 mini Pro

My main.cpp looks as follows:

#include <Arduino.h>
#include <Wire.h>
#include "SparkFunBME280.h"

BME280 bme; // I2C

void printValues();

void setup() {
    Serial.begin(9600);
    Serial.println(F("BME280 test"));

    Wire.begin(SDA,SCL);
    Wire.setClock(400000);
    bme.setI2CAddress(0x76);

    if (bme.beginI2C() == false) {
        Serial.println(F("No sensor response. Please check wiring."));
        ESP.deepSleep(0);
    }
    bme.setFilter(2); //0 to 4 is valid. Filter coefficient. See 3.4.4
    bme.setStandbyTime(5); //0 to 7 valid. Time between readings. See table 27.
    bme.setTempOverSample(1); //0 to 16 are valid. 0 disables temp sensing. See table 24.
    bme.setPressureOverSample(1); //0 to 16 are valid. 0 disables pressure sensing. See table 23.
    bme.setHumidityOverSample(1); //0 to 16 are valid. 0 disables humidity sensing. See table 19.
    bme.setMode(MODE_SLEEP); //MODE_SLEEP, MODE_FORCED, MODE_NORMAL is valid. See 3.3
}

void loop() {
    bme.setMode(MODE_FORCED); //Wake up sensor and take reading

    long startTime = millis();
    while(bme.isMeasuring() == false); //Wait for sensor to start measurment
    while(bme.isMeasuring() == true); //Hang out while sensor completes the reading    
    long endTime = millis();
    // bme.setMode(MODE_SLEEP); //Needed?

    //Sensor is now back asleep but we get get the data
    Serial.print(F("Measure time "));
    Serial.print(endTime - startTime);
    Serial.print("ms => ");

    printValues();
    delay(30e3); // 30 second sleep (30,000 ms)
}

void printValues() {
    Serial.print("{\"h_pc\":"); Serial.print(bme.readFloatHumidity(), 2);
    Serial.print(",");

    Serial.print("\"p_hpa\":"); Serial.print(bme.readFloatPressure(), 2);
    Serial.print(",");

    Serial.print("\"alt_m\":"); Serial.print(bme.readFloatAltitudeMeters(), 2);
    Serial.print(",");

    Serial.print("\"temp_c\":"); Serial.print(bme.readTempC(), 2);
    Serial.print("}\n");
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions