[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?
-
Maybe try an i2c scanner to see if the datasheet has got the address wrong? https://playground.arduino.cc/Main/I2cScanner/
-
@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
Scanning...
I2C device found at address 0x40 !
doneSo 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.
-
@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. * ******************************* * * REVISION HISTORY * Version 1.0: Andrew Sutcliffe * * DESCRIPTION * 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.begin(115200); 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: "); Serial.println(temperature); #endif } else { // Increase no update counter if the temperature stayed the same nNoUpdatesTemp++; } // 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: "); Serial.println(humidity); #endif } else { // Increase no update counter if the humidity stayed the same nNoUpdatesHum++; } // Sleep for a while to save energy sleep(UPDATE_INTERVAL); }
-
@4994james great to hear you solved it, and thanks for reporting back!