[SOLVED] s17021 vs HTU21

  • I have had plenty of success with s17021 sensors and the mysensors library in the past however I have recently purchased some more boards for what I thought was a reasonable deal from Amazon. This is exactly what I have.
    The issue I have is that none of them work. When it gets to Begin() it just stops. It doesn't return at all so doesn't issue a "sensor not detected" which is what I would expect if not connected. I hooked up my logic analyser trace and can see the initial command but nothing comes back.
    I can see the basic chip is different to the ones to the boards I have used previously so assume there is some software incompatibility. However I have looked at the data sheet and it is a I2C component and seems to have identical addresses and commands as the si7021. Have I just got a load of defective items or should I be using different software?

  • Mod

    Maybe try an i2c scanner to see if the datasheet has got the address wrong? https://playground.arduino.cc/Main/I2cScanner/

  • Mod

    @4994james How do you connect the board? Do you have the I2C pull-up resistors mounted?

  • @mfalkvidd Hi. Thank you. Most useful. Just tried and it reports:

    I2C Scanner
    I2C device found at address 0x40 !

    So seems to be the same as si7021 and correct. Will respond to @Yveaux with more details as still not working with si7021 library.

  • @Yveaux
    Many thanks for your response.
    I think the board has onboard pull up resistors, But to eliminate doubt I added 2 1k pull ups to sda and scl. This is the debug output when i use a sparkfun si7021 board (also with same pull ups - though not needed for this board for sure):

    setup!10446 MCO:BGN:INIT OK,TSP=1
    Temp 18.83C	Hum 50.94

    and this is a screenshot of the trace on sda and scl:

    E3 is temp command.

    followed by

    Temp reading and another (not shown) set of commands and humidity reading.

    However with the HTU21D the sketch hangs here:

    setup!10397 MCO:BGN:INIT OK,TSP=1

    i get the same first command trace as you would expect (same library) but no response from the board.

  • Mod

    @4994james as you own the tools to monitor the i2c traffic, what is going on with the htu on the bus during initialization?

  • @Yveaux
    This is what I see on trigger. this is identical when HTU21 and Si7021 boards are connected.

  • @4994james
    Hi. I have been reading https://forum.mysensors.org/topic/476/htu21d-humidity-temperature-sensor/8 and have now got this working using the adafruit htu21d library. Not sure what the difference is but there obviously is something. I also confirm that the board works without external pull up resistors. Thanks for you help.

    This is my new (working) code:

     * The MySensors Arduino library handles the wireless radio link and protocol
     * between your home built sensors/actuators and HA controller of choice.
     * The sensors forms a self healing radio network with optional repeaters. Each
     * repeater and gateway builds a routing tables in EEPROM which keeps track of the
     * network topology allowing messages to be routed to nodes.
     * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
     * Copyright (C) 2013-2015 Sensnology AB
     * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
     * Documentation: http://www.mysensors.org
     * Support Forum: http://forum.mysensors.org
     * This program is free software; you can redistribute it and/or
     * modify it under the terms of the GNU General Public License
     * version 2 as published by the Free Software Foundation.
     * Version 1.0: Andrew Sutcliffe
     * This sketch provides an example of how to implement a humidity/temperature
     * sensor using a HTU21DF Sensor.
     * For more information, please visit:
     * http://www.mysensors.org/build/humidity
     * Connect Vin to 3-5VDC
     * Connect GND to ground
     * Connect SCL to I2C clock pin (A5 on UNO)
     * Connect SDA to I2C data pin (A4 on UNO)
    // Enable debug prints
    #define MY_DEBUG
    // Enable and select radio type attached 
    //#define MY_RADIO_NRF24
    //#define MY_RADIO_RFM69
    #define MY_RS485
    // Define this to enables DE-pin management on defined pin
    #define MY_RS485_DE_PIN 2
    // Set RS485 baud rate to use
    #define MY_RS485_BAUD_RATE 9600
    #include <MySensors.h>  
    #include <Wire.h>
    #include "Adafruit_HTU21DF.h"
    Adafruit_HTU21DF htu = Adafruit_HTU21DF();
    // Set this offset if the sensor has a permanent small offset to the real temperatures
    #define SENSOR_TEMP_OFFSET 0
    // Sleep time between sensor updates (in milliseconds)
    static const uint64_t UPDATE_INTERVAL = 60000;
    // Force sending an update of the temperature after n sensor reads, so a controller showing the
    // timestamp of the last update doesn't show something like 3 hours in the unlikely case, that
    // the value didn't change since;
    // i.e. the sensor would force sending an update every UPDATE_INTERVAL*FORCE_UPDATE_N_READS [ms]
    static const uint8_t FORCE_UPDATE_N_READS = 10;
    #define CHILD_ID_HUM 0
    #define CHILD_ID_TEMP 1
    #define MY_NODE_ID 104
    float lastTemp;
    float lastHum;
    uint8_t nNoUpdatesTemp;
    uint8_t nNoUpdatesHum;
    bool metric = true;
    MyMessage msgHum(CHILD_ID_HUM, V_HUM);
    MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
    void presentation()  
      // Send the sketch version information to the gateway
      sendSketchInfo("HTU21DF-TemperatureAndHumidity", "1.0");
      // Register all sensors to gw (they will be created as child devices)
      present(CHILD_ID_HUM, S_HUM);
      present(CHILD_ID_TEMP, S_TEMP);
    void setup()
      Serial.println("HTU21D-F test");
      if (!htu.begin()) {
        Serial.println("Couldn't find sensor!");
        while (1);
    void loop(){
      // Get temperature from HTU21DF library
      float temperature = (htu.readTemperature());
     if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) {
        // Only send temperature if it changed since the last measurement or if we didn't send an update for n times
        lastTemp = temperature;
        // Reset no updates counter
        nNoUpdatesTemp = 0;
        temperature += SENSOR_TEMP_OFFSET;
        send(msgTemp.set(temperature, 1));
        #ifdef MY_DEBUG
        Serial.print("T: ");
      else {
        // Increase no update counter if the temperature stayed the same
      // Get humidity from HTU21DF library
      float humidity = (htu.readHumidity());
      if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) {
        // Only send humidity if it changed since the last measurement or if we didn't send an update for n times
        lastHum = humidity;
        // Reset no updates counter
        nNoUpdatesHum = 0;
        send(msgHum.set(humidity, 1));
        #ifdef MY_DEBUG
        Serial.print("H: ");
      else {
        // Increase no update counter if the humidity stayed the same
      // Sleep for a while to save energy

  • Mod

    @4994james great to hear you solved it, and thanks for reporting back!

Log in to reply

Suggested Topics