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() {
        Wire.begin(0, 26);
    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();
        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);

    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.

  • 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();

    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() {
        Wire.begin(0, 26);
        // 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);

    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.

  • 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,

  • 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 🙂