Incorrect measurements with ENV III HAT on M5StickC+



  • Hello,

    I have the impression that ENV III HAT is not working properly and is providing incorrect measurements:

    M5StickC+ with ENV III HAT

    First, the measured temperature is about 3°C above the actual temperature (which I also checked with a DS18B20 sensor). I understand that the sensor measurement can be disturbed by the heating of the electronic components, but still... 3°C is a huge difference !

    I made sure to put the microcontroller in deep sleep to give it time to cool down (see my code below)!

    Then, the measured pressure is always equal to zero... 🤔

    Here is my code:

    #include <M5Unified.h>
    #include <UNIT_ENV.h>
    
    constexpr uint32_t SLEEP_DURATION_US = 60 * 1000 * 1000; // 1 min
    
    SHT3X   sht30;
    QMP6988 qmp6988;
    
    void setup() {
    
        M5.begin();
        M5.Display.setRotation(3);
        M5.Display.setFont(&fonts::Font2);
    
        Wire.begin(0, 26);
        qmp6988.init();
        
    }
    
    void loop() {
    
        static float_t temperature, humidity, pressure;
    
        uint8_t fail = sht30.get();
    
        temperature = fail ? 0 : sht30.cTemp;
        humidity    = fail ? 0 : sht30.humidity;
        pressure    = qmp6988.calcPressure();
    
        qmp6988.setpPowermode(QMP6988_SLEEP_MODE);
    
        M5.Display.drawString("T:", 10, 10); M5.Display.drawFloat(temperature, 2, 30, 10);
        M5.Display.drawString("H:", 10, 30); M5.Display.drawFloat(humidity,    2, 30, 30);
        M5.Display.drawString("P:", 10, 50); M5.Display.drawFloat(pressure,    2, 30, 50);
    
        delay(2000);
    
        M5.Power.Axp192.setLDO2(0);
        esp_sleep_enable_timer_wakeup(SLEEP_DURATION_US);
        esp_deep_sleep_start();
    
    }
    

    Did I make a mistake somewhere?

    Maybe you have experienced this sensor yourself and have some elements to share with me?

    Thank you very much in advance.
    Steph



  • I apparently get a small improvement in the temperature measurement by shutting down the microcontroller like this:

        // M5.Power.Axp192.setLDO2(0);
        // esp_sleep_enable_timer_wakeup(SLEEP_DURATION_US);
        // esp_deep_sleep_start();
        M5.Power.deepSleep(SLEEP_DURATION_US);
    

    But I still have a 2.5°C difference...

    On the other hand, I don't have a solution for the pressure measurement. 😕



  • Well... I'm soooooo sorry... I thought I had an ENV III, but it's actually an ENV II... 😬

    ENV II even has two temperature sensors, since instead of the QMP6988, it has a BMP280, which is a pressure and temperature sensor. It is, therefore, possible to perform 2 simultaneous temperature measurements!

    So, this time things work better:

    ENV II with M55StickC+

    We still notice a difference in the temperature measurements. The SHT30 seems to get better results (which is probably why they added it).

    Here, it's still 1°C above the real temperature. In the meantime, I turned on the air-conditioning, so maybe the deviation is reduced because of the ventilation? On the other hand, we can see that the temperature measured by the BMP280 is 1°C higher than the one measured by the SHT30.

    But this time, I get a non-zero pressure measurement. 🙂

    Here is the new version of my code for those who are interested:

    #include <M5Unified.h>
    #include <UNIT_ENV.h>
    #include <Adafruit_BMP280.h>
    
    constexpr uint32_t SLEEP_DURATION_US = 30 * 1000 * 1000; // 30 sec
    
    SHT3X sht30;
    Adafruit_BMP280 bmp;
    // QMP6988 qmp6988; // only for ENV III
    
    void setup() {
    
        M5.begin();
        M5.Display.setRotation(3);
        M5.Display.setFont(&fonts::Font2);
    
        Wire.begin(0, 26);
        bmp.begin(0x76);
        bmp.setSampling(
            Adafruit_BMP280::MODE_NORMAL,
            Adafruit_BMP280::SAMPLING_X16,
            Adafruit_BMP280::SAMPLING_X16,
            Adafruit_BMP280::FILTER_X16,
            Adafruit_BMP280::STANDBY_MS_500
        );
    
        // qmp6988.init(); // only for ENV III
        
    }
    
    void displayMeasurement(
        const uint8_t x1,
        const uint8_t x2,
        const uint8_t x3,
        const uint8_t y,
        const char*   sensor,
        const char*   data,
        const float_t value
    ) {
    
        M5.Display.drawString(sensor,  x1, y);
        M5.Display.drawString(data,    x2, y);
        M5.Display.drawFloat(value, 2, x3, y);
    
    }
    
    void loop() {
    
        static float_t temperature_1, temperature_2, humidity, pressure;
    
        uint8_t fail = sht30.get();
    
        temperature_1 = bmp.readTemperature();
        temperature_2 = fail ? 0 : sht30.cTemp;
        humidity      = fail ? 0 : sht30.humidity;
        pressure      = bmp.readPressure();
        
        // only for ENV III
        // pressure = qmp6988.calcPressure();
        // qmp6988.setpPowermode(QMP6988_SLEEP_MODE);
    
        displayMeasurement(10, 70, 100, 10, "BMP280", "T1", temperature_1);
        displayMeasurement(10, 70, 100, 30, "SHT30",  "T2", temperature_2);
        displayMeasurement(10, 70, 100, 50, "SHT30",  "H",  humidity);
        displayMeasurement(10, 70, 100, 70, "BMP280", "P",  pressure);
    
        delay(2000);
        
        M5.Power.deepSleep(SLEEP_DURATION_US);
    
    }
    

    Sorry for my confusion between ENV II and ENV III. But maybe finally the questions raised here will be useful to some readers...



  • Glad you worked it out.



  • Hello
    Witch tolerances does your AZ device have? Must been shown in the manual.
    Lee



  • Hello @northwest, you're right, I have to check.

    Unfortunately I misplaced the manual, but I did find this summary doc online. It states the following features:

    • Accuracy : -20-100°C +/- 1°C
    • Resolution : 0.1°C

    Nevertheless, I have a couple of DS18B20 sensors, which are known to be pretty accurate, all of which indicate a temperature very close to that measured by my kitchen thermometer.

    An error close to 1°C is acceptable in my use case, but ENV II or ENV III HATs get worse measurements than my DS18B20. I also compared these measurements with other sensors like the Adafruit BME280 (which always gives measurements with a 2°C increase because of the voltage regulator on the sensor board), but which is still accurate when taken into account.

    Thank you,
    Steph



  • At the moment, I try to control the radiators in the house with this ENVIII. I have diffrent meassuring instruments here, I will check next week how they are to compare with the ENVIII



  • @northwest Ok Lee, thank you very much, that's very kind of you 🙂