Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Development
  3. Mysensors si7021 sketch

Mysensors si7021 sketch

Scheduled Pinned Locked Moved Development
11 Posts 5 Posters 3.3k Views 4 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • T Offline
    T Offline
    Tommas
    wrote on last edited by
    #1

    Dear All!

    Has anybody a sketch for this temperature and humidity sensor? I would like to use it with mini pro combined easypcb board.

    Thank you in advance!

    S 1 Reply Last reply
    0
    • T Tommas

      Dear All!

      Has anybody a sketch for this temperature and humidity sensor? I would like to use it with mini pro combined easypcb board.

      Thank you in advance!

      S Offline
      S Offline
      sundberg84
      Hardware Contributor
      wrote on last edited by
      #2

      @Tommas - some resources i found.

      https://forum.mysensors.org/topic/2432/si7021-multisensor-first-try
      https://github.com/mysensors/MySensorsArduinoExamples/tree/master/libraries/SI7021
      https://forum.mysensors.org/topic/6434/solved-problems-with-an-si7021-temp-humidity-sensor/3

      Controller: Proxmox VM - Home Assistant
      MySensors GW: Arduino Uno - W5100 Ethernet, Gw Shield Nrf24l01+ 2,4Ghz
      MySensors GW: Arduino Uno - Gw Shield RFM69, 433mhz
      RFLink GW - Arduino Mega + RFLink Shield, 433mhz

      T 2 Replies Last reply
      0
      • S sundberg84

        @Tommas - some resources i found.

        https://forum.mysensors.org/topic/2432/si7021-multisensor-first-try
        https://github.com/mysensors/MySensorsArduinoExamples/tree/master/libraries/SI7021
        https://forum.mysensors.org/topic/6434/solved-problems-with-an-si7021-temp-humidity-sensor/3

        T Offline
        T Offline
        Tommas
        wrote on last edited by
        #3

        Dear @sundberg84

        Thanks for the suggestions!
        Another, which pin should i connect to the si7021? I cant find this info...

        Thanks,

        mfalkviddM 1 Reply Last reply
        0
        • T Tommas

          Dear @sundberg84

          Thanks for the suggestions!
          Another, which pin should i connect to the si7021? I cant find this info...

          Thanks,

          mfalkviddM Offline
          mfalkviddM Offline
          mfalkvidd
          Mod
          wrote on last edited by
          #4

          @Tommas the si7021 uses i2c so you can use the wiring described at https://www.mysensors.org/build/light-bh1750 which also is an i2c device.

          T 1 Reply Last reply
          1
          • mfalkviddM mfalkvidd

            @Tommas the si7021 uses i2c so you can use the wiring described at https://www.mysensors.org/build/light-bh1750 which also is an i2c device.

            T Offline
            T Offline
            Tommas
            wrote on last edited by Tommas
            #5

            Dear @mfalkvidd !

            Thank you, and to everyone for the help!
            I got it work!
            If the sketch will be completed i will upload that!

            1 Reply Last reply
            1
            • S sundberg84

              @Tommas - some resources i found.

              https://forum.mysensors.org/topic/2432/si7021-multisensor-first-try
              https://github.com/mysensors/MySensorsArduinoExamples/tree/master/libraries/SI7021
              https://forum.mysensors.org/topic/6434/solved-problems-with-an-si7021-temp-humidity-sensor/3

              T Offline
              T Offline
              Tommas
              wrote on last edited by
              #6

              @sundberg84

              What is the problem with my sketch? It is in developement phase, but the reading stops at this line, but sometimes it works for 3-4 loop...

              " DEBUG_PRINTLN("Send TEMP and HUM started"); "

              /**
               * 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: Henrik EKblad
               * Version 1.1 - 2016-07-20: Converted to MySensors v2.0 and added various improvements - Torben Woltjen (mozzbozz)
               * 
               * DESCRIPTION
               * This sketch provides an example of how to implement a humidity/temperature
               * sensor using a DHT11/DHT-22.
               *  
               * For more information, please visit:
               * http://www.mysensors.org/build/humidity
               * 
               */
              #define MY_NODE_ID 4
              // Enable debug prints
              #define MY_DEBUG
              
              // Enable and select radio type attached 
              #define MY_RADIO_NRF24
              //#define MY_RADIO_RFM69
              //#define MY_RS485
              /* Sketch with Si7021 and battery monitoring.
              by m26872, 20151109 
              */
              #include <MySensors.h>  
              #include <Wire.h>
              #include <SI7021.h>
              #include <SPI.h>
              #include <RunningAverage.h>
              
              #define DEBUG
              
              #ifdef DEBUG
              #define DEBUG_SERIAL(x) Serial.begin(x)
              #define DEBUG_PRINT(x) Serial.print(x)
              #define DEBUG_PRINTLN(x) Serial.println(x)
              #else
              #define DEBUG_SERIAL(x)
              #define DEBUG_PRINT(x) 
              #define DEBUG_PRINTLN(x) 
              #endif
              
              #define NODE_ID 4             // <<<<<<<<<<<<<<<<<<<<<<<<<<<   Enter Node_ID
              #define CHILD_ID_TEMP 0
              #define CHILD_ID_HUM 1
              //#define SLEEP_TIME 15000 // 15s for DEBUG
              #define SLEEP_TIME 10000   // 5 min
              //#define FORCE_TRANSMIT_CYCLE 36  // 5min*12=1/hour, 5min*36=1/3hour 
              #define FORCE_TRANSMIT_CYCLE 1  // 5min*12=1/hour, 5min*36=1/3hour 
              //#define BATTERY_REPORT_CYCLE 2880   // Once per 5min   =>   12*24*7 = 2016 (one report/week)
              //#define VMIN 1900
              //#define VMAX 3300
              #define HUMI_TRANSMIT_THRESHOLD 3.0  // THRESHOLD tells how much the value should have changed since last time it was transmitted.
              #define TEMP_TRANSMIT_THRESHOLD 0.5
              #define AVERAGES 2
              
              //int batteryReportCounter = BATTERY_REPORT_CYCLE - 1;  // to make it report the first time.
              int measureCount = 0;
              float lastTemperature = -100;
              int lastHumidity = -100;
              
              RunningAverage raHum(AVERAGES);
              SI7021 humiditySensor;
              
              //MySensor gw;
              MyMessage msgTemp(CHILD_ID_TEMP,V_TEMP); // Initialize temperature message
              MyMessage msgHum(CHILD_ID_HUM,V_HUM);
              
              void presentation(){
              
              sendSketchInfo("Node 4, Temp,Hum sensor", "1.1"); 
                present(CHILD_ID_TEMP, S_TEMP);   // Present sensor to controller
                present(CHILD_ID_HUM, S_HUM);
                
              }
              
              
              void setup() {
                DEBUG_SERIAL(115200);    
                DEBUG_PRINTLN("Serial started");
                
                //DEBUG_PRINT("Voltage: ");
                //DEBUG_PRINT(readVcc()); 
                //DEBUG_PRINTLN(" mV");
              /*
                delay(500);
                DEBUG_PRINT("Internal temp: ");
                DEBUG_PRINT(GetInternalTemp()); // Probably not calibrated. Just to print something.
                DEBUG_PRINTLN(" *C");
              */  
                delay(500); // Allow time for radio if power useed as reset
                //begin(NULL,NODE_ID);
                
                //DEBUG_PRINT("Node and "); DEBUG_PRINTLN("2 children presented.");
                
                raHum.clear();
                
              }
              
              void loop() {
                DEBUG_PRINTLN("Loop started"); 
                measureCount ++;
                
                bool forceTransmit = true;
                
                //if (measureCount > FORCE_TRANSMIT_CYCLE) {
                //forceTransmit = true; 
                //}
                sleep(SLEEP_TIME);
                sendTempHumidityMeasurements(forceTransmit);
                DEBUG_PRINTLN("Loop ended"); 
                }
              /*********************************************
               * * Sends temperature and humidity from Si7021 sensor
               * Parameters
               * - force : Forces transmission of a value (even if it's the same as previous measurement)
               *********************************************/
              void sendTempHumidityMeasurements(bool force) {
                bool tx = force;
                DEBUG_PRINTLN("Send TEMP and HUM started"); 
                si7021_env data = humiditySensor.getHumidityAndTemperature();
                float temperature = data.celsiusHundredths / 100.0;
                DEBUG_PRINT("T: ");DEBUG_PRINTLN(temperature);
                float diffTemp = abs(lastTemperature - temperature);
                DEBUG_PRINT(F("TempDiff :"));DEBUG_PRINTLN(diffTemp);
                //if (diffTemp > TEMP_TRANSMIT_THRESHOLD || tx) {
                send(msgTemp.set(temperature, 1));
                //lastTemperature = temperature;
                //measureCount = 0;
                DEBUG_PRINTLN("T sent!");
                //}
                
                int humidity = data.humidityPercent;
                DEBUG_PRINT("H: ");DEBUG_PRINTLN(humidity);
                raHum.addValue(humidity);
                humidity = raHum.getAverage();  // MA sample imply reasonable fast sample frequency
                float diffHum = abs(lastHumidity - humidity);  
                DEBUG_PRINT(F("HumDiff  :"));DEBUG_PRINTLN(diffHum); 
                //if (diffHum > HUMI_TRANSMIT_THRESHOLD || tx) {
                send(msgHum.set(humidity, 1));
                //lastHumidity = humidity;
                //measureCount = 0;
                DEBUG_PRINTLN("H sent!");
                //}
              
              }
              
              S 1 Reply Last reply
              0
              • T Tommas

                @sundberg84

                What is the problem with my sketch? It is in developement phase, but the reading stops at this line, but sometimes it works for 3-4 loop...

                " DEBUG_PRINTLN("Send TEMP and HUM started"); "

                /**
                 * 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: Henrik EKblad
                 * Version 1.1 - 2016-07-20: Converted to MySensors v2.0 and added various improvements - Torben Woltjen (mozzbozz)
                 * 
                 * DESCRIPTION
                 * This sketch provides an example of how to implement a humidity/temperature
                 * sensor using a DHT11/DHT-22.
                 *  
                 * For more information, please visit:
                 * http://www.mysensors.org/build/humidity
                 * 
                 */
                #define MY_NODE_ID 4
                // Enable debug prints
                #define MY_DEBUG
                
                // Enable and select radio type attached 
                #define MY_RADIO_NRF24
                //#define MY_RADIO_RFM69
                //#define MY_RS485
                /* Sketch with Si7021 and battery monitoring.
                by m26872, 20151109 
                */
                #include <MySensors.h>  
                #include <Wire.h>
                #include <SI7021.h>
                #include <SPI.h>
                #include <RunningAverage.h>
                
                #define DEBUG
                
                #ifdef DEBUG
                #define DEBUG_SERIAL(x) Serial.begin(x)
                #define DEBUG_PRINT(x) Serial.print(x)
                #define DEBUG_PRINTLN(x) Serial.println(x)
                #else
                #define DEBUG_SERIAL(x)
                #define DEBUG_PRINT(x) 
                #define DEBUG_PRINTLN(x) 
                #endif
                
                #define NODE_ID 4             // <<<<<<<<<<<<<<<<<<<<<<<<<<<   Enter Node_ID
                #define CHILD_ID_TEMP 0
                #define CHILD_ID_HUM 1
                //#define SLEEP_TIME 15000 // 15s for DEBUG
                #define SLEEP_TIME 10000   // 5 min
                //#define FORCE_TRANSMIT_CYCLE 36  // 5min*12=1/hour, 5min*36=1/3hour 
                #define FORCE_TRANSMIT_CYCLE 1  // 5min*12=1/hour, 5min*36=1/3hour 
                //#define BATTERY_REPORT_CYCLE 2880   // Once per 5min   =>   12*24*7 = 2016 (one report/week)
                //#define VMIN 1900
                //#define VMAX 3300
                #define HUMI_TRANSMIT_THRESHOLD 3.0  // THRESHOLD tells how much the value should have changed since last time it was transmitted.
                #define TEMP_TRANSMIT_THRESHOLD 0.5
                #define AVERAGES 2
                
                //int batteryReportCounter = BATTERY_REPORT_CYCLE - 1;  // to make it report the first time.
                int measureCount = 0;
                float lastTemperature = -100;
                int lastHumidity = -100;
                
                RunningAverage raHum(AVERAGES);
                SI7021 humiditySensor;
                
                //MySensor gw;
                MyMessage msgTemp(CHILD_ID_TEMP,V_TEMP); // Initialize temperature message
                MyMessage msgHum(CHILD_ID_HUM,V_HUM);
                
                void presentation(){
                
                sendSketchInfo("Node 4, Temp,Hum sensor", "1.1"); 
                  present(CHILD_ID_TEMP, S_TEMP);   // Present sensor to controller
                  present(CHILD_ID_HUM, S_HUM);
                  
                }
                
                
                void setup() {
                  DEBUG_SERIAL(115200);    
                  DEBUG_PRINTLN("Serial started");
                  
                  //DEBUG_PRINT("Voltage: ");
                  //DEBUG_PRINT(readVcc()); 
                  //DEBUG_PRINTLN(" mV");
                /*
                  delay(500);
                  DEBUG_PRINT("Internal temp: ");
                  DEBUG_PRINT(GetInternalTemp()); // Probably not calibrated. Just to print something.
                  DEBUG_PRINTLN(" *C");
                */  
                  delay(500); // Allow time for radio if power useed as reset
                  //begin(NULL,NODE_ID);
                  
                  //DEBUG_PRINT("Node and "); DEBUG_PRINTLN("2 children presented.");
                  
                  raHum.clear();
                  
                }
                
                void loop() {
                  DEBUG_PRINTLN("Loop started"); 
                  measureCount ++;
                  
                  bool forceTransmit = true;
                  
                  //if (measureCount > FORCE_TRANSMIT_CYCLE) {
                  //forceTransmit = true; 
                  //}
                  sleep(SLEEP_TIME);
                  sendTempHumidityMeasurements(forceTransmit);
                  DEBUG_PRINTLN("Loop ended"); 
                  }
                /*********************************************
                 * * Sends temperature and humidity from Si7021 sensor
                 * Parameters
                 * - force : Forces transmission of a value (even if it's the same as previous measurement)
                 *********************************************/
                void sendTempHumidityMeasurements(bool force) {
                  bool tx = force;
                  DEBUG_PRINTLN("Send TEMP and HUM started"); 
                  si7021_env data = humiditySensor.getHumidityAndTemperature();
                  float temperature = data.celsiusHundredths / 100.0;
                  DEBUG_PRINT("T: ");DEBUG_PRINTLN(temperature);
                  float diffTemp = abs(lastTemperature - temperature);
                  DEBUG_PRINT(F("TempDiff :"));DEBUG_PRINTLN(diffTemp);
                  //if (diffTemp > TEMP_TRANSMIT_THRESHOLD || tx) {
                  send(msgTemp.set(temperature, 1));
                  //lastTemperature = temperature;
                  //measureCount = 0;
                  DEBUG_PRINTLN("T sent!");
                  //}
                  
                  int humidity = data.humidityPercent;
                  DEBUG_PRINT("H: ");DEBUG_PRINTLN(humidity);
                  raHum.addValue(humidity);
                  humidity = raHum.getAverage();  // MA sample imply reasonable fast sample frequency
                  float diffHum = abs(lastHumidity - humidity);  
                  DEBUG_PRINT(F("HumDiff  :"));DEBUG_PRINTLN(diffHum); 
                  //if (diffHum > HUMI_TRANSMIT_THRESHOLD || tx) {
                  send(msgHum.set(humidity, 1));
                  //lastHumidity = humidity;
                  //measureCount = 0;
                  DEBUG_PRINTLN("H sent!");
                  //}
                
                }
                
                S Offline
                S Offline
                sundberg84
                Hardware Contributor
                wrote on last edited by
                #7

                @Tommas - sorry, im not the code expert...
                If it stops without any indication why it can be a power issue as well.

                Controller: Proxmox VM - Home Assistant
                MySensors GW: Arduino Uno - W5100 Ethernet, Gw Shield Nrf24l01+ 2,4Ghz
                MySensors GW: Arduino Uno - Gw Shield RFM69, 433mhz
                RFLink GW - Arduino Mega + RFLink Shield, 433mhz

                T 1 Reply Last reply
                0
                • S sundberg84

                  @Tommas - sorry, im not the code expert...
                  If it stops without any indication why it can be a power issue as well.

                  T Offline
                  T Offline
                  Tommas
                  wrote on last edited by
                  #8

                  @sundberg84

                  There arent any indication. Sometimes it works.... i tried another si7021 and same. Voltage is Ok. A connected the sda - A4 scl - A5 on easypcb board

                  Any idea?

                  Y 1 Reply Last reply
                  0
                  • T Tommas

                    @sundberg84

                    There arent any indication. Sometimes it works.... i tried another si7021 and same. Voltage is Ok. A connected the sda - A4 scl - A5 on easypcb board

                    Any idea?

                    Y Offline
                    Y Offline
                    Yveaux
                    Mod
                    wrote on last edited by
                    #9

                    @Tommas do you have pullups (around 10k) at sda & scl lines?

                    http://yveaux.blogspot.nl

                    T 1 Reply Last reply
                    0
                    • Y Yveaux

                      @Tommas do you have pullups (around 10k) at sda & scl lines?

                      T Offline
                      T Offline
                      Tommas
                      wrote on last edited by Tommas
                      #10

                      Dear @Yveaux

                      I think that yes. The si7021 module has an smd 103 part on it. Maybe it is at the sda and scl but im not sure.

                      https://www.ebay.com/i/401364416322

                      Thanks

                      1 Reply Last reply
                      0
                      • N Offline
                        N Offline
                        Nca78
                        Hardware Contributor
                        wrote on last edited by
                        #11

                        Hello,

                        you are missing the sensor.begin() to initialize the sensor. Return value will tell you if initialization succeeded or not.

                        if (!sensor.begin()) {
                        #ifdef MY_DEBUG
                            Serial.println("FAILED TO INIT SENSOR !!!!");
                        #endif
                        ...
                          }
                        
                        1 Reply Last reply
                        0

                        Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                        Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                        With your input, this post could be even better 💗

                        Register Login
                        Reply
                        • Reply as topic
                        Log in to reply
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes


                        60

                        Online

                        12.0k

                        Users

                        11.2k

                        Topics

                        113.4k

                        Posts


                        Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                        • Login

                        • Don't have an account? Register

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • MySensors
                        • OpenHardware.io
                        • Categories
                        • Recent
                        • Tags
                        • Popular