ENV sensor calibration

  • Hi,

    does this unit need to be calibrated? The temperature is showing 20oC while my thermostat and my old mercury thermometer is showing 17!

  • @charlestondance said in ENV sensor calibration:


    does this unit need to be calibrated? The temperature is showing 20oC while my thermostat and my old mercury thermometer is showing 17!

    There currently isn't any way to calibrate it.

  • Well that is not much use then!

    Is the problem the supplier or the device or the code?

    If the offset is the same within a certain range surely you could just subtract a constant? the issue is i have no way to measure humidity and pressure independently.

  • @charlestondance I suppose you can try using the maths blocks but I have to ask (don't take this personally) are you sure your how thermostat is calibrated?

    In UIFlow, the temperature is returned as a value and so you can add that to a maths block as a variable number.
    Below is a quick code test (sorry had to retrieve the kit from the office/studio.alt text

  • @ajb2k3 Yes, the humidity results are really bad.
    How can I e.g. connect my own sensor SHT series?
    On my Pycom Wipy I have something like this running successfully.
    I like to set the code to change it for M5Stack.

  • Connecting the sensor depends on many things like operating characteristics.
    Can you post a link to the sensor you are looking at?
    Sometime its just a case of plug and play, sometimes its a case of hacing some code.

  • @ajb2k3

    Of these I have the SHT 20/21 and the SHT 30/31 on my
    Pycom Wipy/Lopy are doing well.

  • @Wolli01 The sensor you sent us a link to, is it on a breakout board with pinouts? and is it possible to communicate with it via i2c?

  • @lukasmaximus Yeah, no problems.
    Enclosed the code that runs in Wipy over Python.

    from machine import I2C
    import time

    R_HIGH = const(1)
    R_MEDIUM = const(2)
    R_LOW = const(3)

    class SHT31(object):
    Diese Klasse implementiert eine Schnittstelle zur SHT31 Temperatur und Luftfeuchtigkeit.
    Sensor von Sensirion.
    # Diese statische Karte hilft, den Heap und die Programmlogik sauber zu halten.
    _map_cs_r = {
    True: {
    R_HIGH : b'\x2c\x06',
    R_MEDIUM : b'\x2c\x0d',
    R_LOW: b'\x2c\x10'
    False: {
    R_HIGH : b'\x24\x00',
    R_MEDIUM : b'\x24\x0b',
    R_LOW: b'\x24\x16'

    def __init__(self, i2c, addr=0x44):
        Initialisiert ein Sensorobjekt auf dem angegebenen I2C-Bus, auf das von der
        angegebene Adresse.
        if i2c == None or i2c.__class__ != I2C:
            raise ValueError('I2C-Objekt als Argument benötigt!')
        self._i2c = i2c
        self._addr = addr
    def _send(self, buf):
        Sendet das angegebene Pufferobjekt über I2C an den Sensor.
        self._i2c.writeto(self._addr, buf)
    def _recv(self, count):
        Lesen von Bytes vom Sensor über I2C. Die Anzahl der Bytes kann angegeben werden.
        als Argument.
        Liefert ein Bytearray für das Ergebnis.
        return self._i2c.readfrom(self._addr, count)
    def _raw_temp_humi(self, r=R_HIGH, cs=True):
        Lesen Sie die Rohtemperatur und Luftfeuchtigkeit vom Sensor ab und überspringen Sie CRC. Überprüfung.
        Liefert ein Tupel für beide Werte in dieser Reihenfolge.
        if r not in (R_HIGH, R_MEDIUM, R_LOW):
            raise ValueError('Falscher Wiederholbarkeitswert angegeben!')
        raw = self._recv(6)
        return (raw[0] << 8) + raw[1], (raw[3] << 8) + raw[4]
    def get_temp_humi(self, resolution=R_HIGH, clock_stretch=True, celsius=True):
        Lesen Sie die Temperatur in Grad Celsius oder Fahrenheit und relativ dazu ab.
        Feuchtigkeit. Auflösung und Taktverlängerung können festgelegt werden.
        Liefert ein Tupel für beide Werte in dieser Reihenfolge.
        t, h = self._raw_temp_humi(resolution, clock_stretch)
        if celsius:
            temp = -45 + (175 * (t / 65535.0))
            temp = -49 + (315 * (t / 65535.0))
        return temp, 100 * (h / 65535.0)

    #Sensor SHT31-----------------------------------------------------------
    if (Sensorwahl) == 'sht31':

    i2c = I2C(0, I2C.MASTER, baudrate=100000)
    sensor = sht31.SHT31(i2c, addr=0x44)
    temp_humi = sensor.get_temp_humi()
    pycom.rgbled(0xff007f) # magenta
    pycom.heartbeat(False) #Lampe ausschalten um Energie zu sparen
    Temp1 = round(temp_humi[0],2)
    Feuchte1 = round(temp_humi[1],2)
    print("Ohne Runden = Temperature: {} °C | Humidity: {} %".format(temp_humi[0], temp_humi[1]))
    #Ãœbergabe der Sensorwerte---------------------------------------
    Temp1 = (Temp1 + 0) #Ãœbergabe und Differenzeingabe
    Feuchte1 = (Feuchte1 + 0) #Ãœbergabe und Differenzeingabe
    #Ãœbergabe der Sensorwerte---------------------------------------

    #Sensor SHT31-----------------------------------------------------------

  • The I2c implementation in UIflow firmware is a little weird, I think if you were to flash the standard micropython firmware and put the necessary libraries on there this would work fine.

  • @lukasmaximus Yes, I thought about that, but how do I get the display to work? I can't cope with that.

  • @lukasmaximus
    Where can I find instructions how to integrate the M5Stack libraries into the MicroPython standard software on a M5Stack Core Grey/Black.

  • You need to use a command line program called ampy to move the libraries across. This guy wrote a guide in which he used the standard micropython firmware and added his own libraries https://www.hackster.io/andreas-motzek/execute-logo-on-m5stack-esp32-basic-with-micropython-3713fd