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. General Discussion
  3. Serial Gateway Sketch with si7021

Serial Gateway Sketch with si7021

Scheduled Pinned Locked Moved General Discussion
18 Posts 2 Posters 4.1k Views 2 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.
  • gohanG Offline
    gohanG Offline
    gohan
    Mod
    wrote on last edited by gohan
    #4

    Why don't you start with a much simpler sketch? And that is for a node, it is missing all the defines for the gateway. Start with the gateway sketch and add only the code needed by the sensor. The error you get is probably a mismatch between the code and the library: check in the library examples how do you retrive humidity from the sensor

    1 Reply Last reply
    0
    • M Markus.

      Well the Problem seems to be in the first step to get a working SI7021 Sketch for MySensors 2.2.0 Beta or 2.1.1.
      I did Try to complie this one now:

      /* Sketch with Si7021 and battery monitoring.
      by m26872, 20151109 
      */
      
      #define MY_DEBUG
      #define MY_RADIO_NRF24
      #define MY_NODE_ID 5             // <<<<<<<<<<<<<<<<<<<<<<<<<<<   Enter Node_ID
      #define MY_BAUD_RATE 115200
      
      #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 CHILD_ID_TEMP 0
      #define CHILD_ID_HUM 1
      // #define SLEEP_TIME 15000 // 15s for DEBUG
      #define SLEEP_TIME 300000   // 5 min
      #define FORCE_TRANSMIT_CYCLE 36  // 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;
      
      MyMessage msgTemp(CHILD_ID_TEMP,V_TEMP); // Initialize temperature message
      MyMessage msgHum(CHILD_ID_HUM,V_HUM);
      
      
      void presentation()  
      { 
        sendSketchInfo("EgTmpHumBat5min", "1.0 151106");
        present(CHILD_ID_TEMP, S_TEMP);   // Present sensor to controller
        present(CHILD_ID_HUM, S_HUM);
      }
      
      
      void setup() {
        DEBUG_SERIAL(115200);    // <<<<<<<<<<<<<<<<<<<<<<<<<< Note BAUD_RATE in MySensors.h
        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
        DEBUG_PRINT("Node and "); DEBUG_PRINTLN("2 children presented.");
        
        raHum.clear();
        
      }
      
      void loop() { 
      
        measureCount ++;
        batteryReportCounter ++;
        bool forceTransmit = false;
        
        if (measureCount > FORCE_TRANSMIT_CYCLE) {
          forceTransmit = true; 
        }
        sendTempHumidityMeasurements(forceTransmit);
      /*
        // Read and print internal temp
        float temperature0 = static_cast<float>(static_cast<int>((GetInternalTemp()+0.5) * 10.)) / 10.;
        DEBUG_PRINT("Internal Temp: "); DEBUG_PRINT(temperature0); DEBUG_PRINTLN(" *C");        
      */
        // Check battery
        if (batteryReportCounter >= BATTERY_REPORT_CYCLE) {
          long batteryVolt = readVcc();
          DEBUG_PRINT("Battery voltage: "); DEBUG_PRINT(batteryVolt); DEBUG_PRINTLN(" mV");
          uint8_t batteryPcnt = constrain(map(batteryVolt,VMIN,VMAX,0,100),0,255);   
          DEBUG_PRINT("Battery percent: "); DEBUG_PRINT(batteryPcnt); DEBUG_PRINTLN(" %");
          sendBatteryLevel(batteryPcnt);
          batteryReportCounter = 0;
        }
        
        sleep(SLEEP_TIME);
      }
      
      // function for reading Vcc by reading 1.1V reference against AVcc. Based from http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/
      // To calibrate reading replace 1125300L with scale_constant = internal1.1Ref * 1023 * 1000, where internal1.1Ref = 1.1 * Vcc1 (per voltmeter) / Vcc2 (per readVcc() function) 
      long readVcc() {
        // set the reference to Vcc and the measurement to the internal 1.1V reference
        ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
        delay(2); // Wait for Vref to settle
        ADCSRA |= _BV(ADSC); // Start conversion
        while (bit_is_set(ADCSRA,ADSC)); // measuring
        uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH  
        uint8_t high = ADCH; // unlocks both
        long result = (high<<8) | low;
        result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
        return result; // Vcc in millivolts
      }
      // function for reading internal temp. From http://playground.arduino.cc/Main/InternalTemperatureSensor 
      double GetInternalTemp(void) {  // (Both double and float are 4 byte in most arduino implementation)
        unsigned int wADC;
        double t;
        // The internal temperature has to be used with the internal reference of 1.1V. Channel 8 can not be selected with the analogRead function yet.
        ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3));   // Set the internal reference and mux.
        ADCSRA |= _BV(ADEN);  // enable the ADC
        delay(20);            // wait for voltages to become stable.
        ADCSRA |= _BV(ADSC);  // Start the ADC
        while (bit_is_set(ADCSRA,ADSC));   // Detect end-of-conversion
        wADC = ADCW;   // Reading register "ADCW" takes care of how to read ADCL and ADCH.
        t = (wADC - 88.0 ) / 1.0;   // The default offset is 324.31.
        return (t);   // The returned temperature in degrees Celcius.
      }
      
      /*********************************************
       * * 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;
      
        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));
          lastHumidity = humidity;
          measureCount = 0;
          DEBUG_PRINTLN("H sent!");
        }
      
      }
      

      But I get always follwoing error...

      exit status 1
      'si7021_env' has no member named 'humidityPercent'
      

      So I am a bit lost at the Moment due to my limited coding Knowledge.. :-(

      M Offline
      M Offline
      Markus.
      wrote on last edited by
      #5

      Did a mistake with the Libary. Used now the SI7021 from MySensorsArduinoExamples-master and this seems to be okay now

      1 Reply Last reply
      0
      • M Offline
        M Offline
        Markus.
        wrote on last edited by
        #6

        the Problem is I cnnaot find any simple Mysensors Sketch to read a SI7021 :-(
        Only with battery Monitoring which I don't Need...

        1 Reply Last reply
        0
        • M Offline
          M Offline
          Markus.
          wrote on last edited by Markus.
          #7

          can it work like this?

          // Enable debug prints to serial monitor
          #define MY_DEBUG
          
          
          // Enable and select radio type attached
          #define MY_RADIO_RFM69
          #define MY_RFM69_FREQUENCY RFM69_868MHZ
          
          #include <Wire.h>
          #include <SI7021.h>
          #include <SPI.h>
          #include <RunningAverage.h>
          
          
          #ifdef MY_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 CHILD_ID_TEMP 0
          #define CHILD_ID_HUM 1
          // #define SLEEP_TIME 15000 // 15s for DEBUG
          #define SLEEP_TIME 300000   // 5 min
          #define FORCE_TRANSMIT_CYCLE 36  // 5min*12=1/hour, 5min*36=1/3hour 
          #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 measureCount = 0;
          float lastTemperature = -100;
          int lastHumidity = -100;
          
          RunningAverage raHum(AVERAGES);
          SI7021 humiditySensor;
          
          
          // Enable serial gateway
          #define MY_GATEWAY_SERIAL
          
          // Define a lower baud rate for Arduino's running on 8 MHz (Arduino Pro Mini 3.3V & SenseBender)
          #if F_CPU == 8000000L
          #define MY_BAUD_RATE 38400
          #endif
          
          // Enable inclusion mode
          #define MY_INCLUSION_MODE_FEATURE
          
          // Set inclusion mode duration (in seconds)
          #define MY_INCLUSION_MODE_DURATION 60
          
          // Set blinking period
          #define MY_DEFAULT_LED_BLINK_PERIOD 300
          
          // Inverses the behavior of leds
          //#define MY_WITH_LEDS_BLINKING_INVERSE
          
          // Flash leds on rx/tx/err
          // Uncomment to override default HW configurations
          //#define MY_DEFAULT_ERR_LED_PIN 4  // Error led pin
          //#define MY_DEFAULT_RX_LED_PIN  6  // Receive led pin
          //#define MY_DEFAULT_TX_LED_PIN  5  // the PCB, on board LED
          
          #include <MySensors.h>
          
          MyMessage msgTemp(CHILD_ID_TEMP,V_TEMP); // Initialize temperature message
          MyMessage msgHum(CHILD_ID_HUM,V_HUM);
          
          
          void setup()
          {
            DEBUG_SERIAL(38400);    // <<<<<<<<<<<<<<<<<<<<<<<<<< Note BAUD_RATE in MySensors.h
            DEBUG_PRINTLN("Serial started");
            delay(500); // Allow time for radio if power useed as reset
            DEBUG_PRINT("Node and "); DEBUG_PRINTLN("2 children presented.");
             raHum.clear();
            
          }
          
          void presentation()
          { 
            sendSketchInfo("Gateway_SI7021", "1.0 161017");
            present(CHILD_ID_TEMP, S_TEMP);   // Present sensor to controller
            present(CHILD_ID_HUM, S_HUM);
          }
          
          
          void loop()
          { 
          
            measureCount ++;
            bool forceTransmit = false;
            
            if (measureCount > FORCE_TRANSMIT_CYCLE) {
              forceTransmit = true; 
            }
            sendTempHumidityMeasurements(forceTransmit);
          /*
            // Read and print internal temp
            float temperature0 = static_cast<float>(static_cast<int>((GetInternalTemp()+0.5) * 10.)) / 10.;
            DEBUG_PRINT("Internal Temp: "); DEBUG_PRINT(temperature0); DEBUG_PRINTLN(" *C");        
          */
           
            sleep(SLEEP_TIME);
          }
          
          /*********************************************
           * * 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;
          
            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));
              lastHumidity = humidity;
              measureCount = 0;
              DEBUG_PRINTLN("H sent!");
            }
          
          }
          
          
          1 Reply Last reply
          0
          • gohanG Offline
            gohanG Offline
            gohan
            Mod
            wrote on last edited by
            #8

            Did you try it?

            1 Reply Last reply
            0
            • M Offline
              M Offline
              Markus.
              wrote on last edited by
              #9

              not yet ;-) Will try it later....

              1 Reply Last reply
              0
              • M Offline
                M Offline
                Markus.
                wrote on last edited by
                #10

                tried now the Sketch... Seems that something is wrong with the sensor.

                 __  __       ____
                |  \/  |_   _/ ___|  ___ _ __  ___  ___  _ __ ___
                | |\/| | | | \___ \ / _ \ `_ \/ __|/ _ \| `__/ __|
                | |  | | |_| |___| |  __/ | | \__ \  _  | |  \__ \
                |_|  |_|\__, |____/ \___|_| |_|___/\___/|_|  |___/
                        |___/                      2.2.0-beta
                
                0;255;3;0;9;53 MCO:BGN:INIT GW,CP=RRNGA---,VER=2.2.0-beta
                0;255;3;0;9;83 TSM:INIT
                0;255;3;0;9;92 TSF:WUR:MS=0
                0;255;3;0;9;100 TSM:INIT:TSP OK
                0;255;3;0;9;108 TSM:INIT:GW MODE
                0;255;3;0;9;118 TSM:READY:ID=0,PAR=0,DIS=0
                0;255;3;0;9;129 MCO:REG:NOT NEEDED
                0;255;3;0;14;Gateway startup complete.
                0;255;0;0;18;2.2.0-beta
                0;255;3;0;11;Gateway_SI7021
                0;255;3;0;12;1.0 161017
                0;0;0;0;6;
                0;1;0;0;7;
                0;255;3;0;9;159 MCO:BGN:STP
                Serial started
                Node and 2 children presented.
                0;255;3;0;9;684 MCO:BGN:INIT OK,TSP=1
                

                Also the issue with the attached sensor blocks completly the Gateway function.Means that the Gateway didn't receive anything. Is it possible to prevent such issue? what I mean, is it possible to seperate both functions in the Sketch in that way If something is wrong with the sensor, the Gateway can still operate?
                THX
                Markus

                1 Reply Last reply
                0
                • gohanG Offline
                  gohanG Offline
                  gohan
                  Mod
                  wrote on last edited by
                  #11

                  add some more serial prints around to see where the code stops

                  M 1 Reply Last reply
                  0
                  • gohanG gohan

                    add some more serial prints around to see where the code stops

                    M Offline
                    M Offline
                    Markus.
                    wrote on last edited by
                    #12

                    @gohan how can i do this ? :-(

                    1 Reply Last reply
                    0
                    • gohanG Offline
                      gohanG Offline
                      gohan
                      Mod
                      wrote on last edited by
                      #13

                      Look at the "DEBUG_PRINTLN" you have in your code, add some of those where you see there aren't.

                      1 Reply Last reply
                      0
                      • M Offline
                        M Offline
                        Markus.
                        wrote on last edited by
                        #14

                        the Code stops here

                        si7021_env data = humiditySensor.getHumidityAndTemperature();
                        

                        Anything wrong with the sensor I guess. But how can I handle such things?

                        1 Reply Last reply
                        0
                        • gohanG Offline
                          gohanG Offline
                          gohan
                          Mod
                          wrote on last edited by
                          #15

                          did you try an example sketch from the library to see if you can read the values correctly?

                          1 Reply Last reply
                          0
                          • M Offline
                            M Offline
                            Markus.
                            wrote on last edited by
                            #16

                            the sensor conenction was the Problem at the end. Changed SCD and SCL and now it Looks good so far. At the Moment is the Gateway not connected to a Controller. Hope the sensor will be then also send the values...

                             __  __       ____
                            |  \/  |_   _/ ___|  ___ _ __  ___  ___  _ __ ___
                            | |\/| | | | \___ \ / _ \ `_ \/ __|/ _ \| `__/ __|
                            | |  | | |_| |___| |  __/ | | \__ \  _  | |  \__ \
                            |_|  |_|\__, |____/ \___|_| |_|___/\___/|_|  |___/
                                    |___/                      2.2.0-beta
                            
                            0;255;3;0;9;53 MCO:BGN:INIT GW,CP=RRNGA---,VER=2.2.0-beta
                            0;255;3;0;9;83 TSM:INIT
                            0;255;3;0;9;92 TSF:WUR:MS=0
                            0;255;3;0;9;100 TSM:INIT:TSP OK
                            0;255;3;0;9;108 TSM:INIT:GW MODE
                            0;255;3;0;9;118 TSM:READY:ID=0,PAR=0,DIS=0
                            0;255;3;0;9;129 MCO:REG:NOT NEEDED
                            0;255;3;0;14;Gateway startup complete.
                            0;255;0;0;18;2.2.0-beta
                            0;255;3;0;11;Gateway_SI7021
                            0;255;3;0;12;1.0 161017
                            0;0;0;0;6;
                            0;1;0;0;7;
                            0;255;3;0;9;159 MCO:BGN:STP
                            Serial started
                            Node and 2 children presented.
                            0;255;3;0;9;684 MCO:BGN:INIT OK,TSP=1
                            Loop1 started
                            T: 21.49
                            TempDiff :121.49
                            0;0;1;0;0;21.5
                            T sent!
                            H: 64
                            HumDiff  :164.00
                            0;1;1;0;1;64
                            H sent!
                            Before first sleep
                            0;255;3;0;9;733 MCO:SLP:MS=300000,SMS=0,I1=255,M1=255,I2=255,M2=255
                            0;255;3;0;9;768 !MCO:SLP:REP
                            0;255;3;0;9;124672 TSF:MSG:READ,106-106-0,s=0,c=1,t=1,pt=7,l=5,sg=0:63.3
                            106;0;1;0;1;63.3
                            0;255;3;0;9;124702 TSF:MSG:READ,106-106-0,s=255,c=3,t=0,pt=1,l=1,sg=0:90
                            106;255;3;0;0;90
                            0;255;3;0;9;124735 TSF:MSG:READ,106-106-0,s=3,c=1,t=38,pt=7,l=5,sg=0:3.71
                            106;3;1;0;38;3.71
                            After first sleep
                            Loop1 started
                            T: 21.64
                            TempDiff :0.15
                            H: 65
                            HumDiff  :0.00
                            Before first sleep
                            0;255;3;0;9;300797 MCO:SLP:MS=300000,SMS=0,I1=255,M1=255,I2=255,M2=255
                            0;255;3;0;9;300830 !MCO:SLP:REP
                            0;255;3;0;9;428443 TSF:MSG:READ,106-106-0,s=255,c=3,t=0,pt=1,l=1,sg=0:90
                            106;255;3;0;0;90
                            0;255;3;0;9;428476 TSF:MSG:READ,106-106-0,s=3,c=1,t=38,pt=7,l=5,sg=0:3.72
                            106;3;1;0;38;3.72
                            

                            But how can I prevent the Situation that a defect or missing sensor on the Gateway blocks also the Gateway function ?

                            Thanks

                            Markus

                            1 Reply Last reply
                            0
                            • gohanG Offline
                              gohanG Offline
                              gohan
                              Mod
                              wrote on last edited by
                              #17

                              You need to make a check in the code that if the sensor read is fails it should keep going

                              M 1 Reply Last reply
                              0
                              • gohanG gohan

                                You need to make a check in the code that if the sensor read is fails it should keep going

                                M Offline
                                M Offline
                                Markus.
                                wrote on last edited by
                                #18

                                @gohan ;-) will try it.... -> Learning leasson... :-)

                                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


                                16

                                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