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 3.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
                                Reply
                                • Reply as topic
                                Log in to reply
                                • Oldest to Newest
                                • Newest to Oldest
                                • Most Votes


                                24

                                Online

                                11.7k

                                Users

                                11.2k

                                Topics

                                113.1k

                                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