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. Repeater Node and DHT11

Repeater Node and DHT11

Scheduled Pinned Locked Moved Development
7 Posts 2 Posters 1.3k Views 3 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.
  • W Offline
    W Offline
    Wikibear
    wrote on last edited by
    #1

    Hello together,

    i try to understand how does it works. Did i need really only #define MY_REPEATER_FEATURE ???
    Must i set some variables in loop or define more that i can use this as repeater?
    DHT11 takes some time to read out data. Normally we do this over sleep. But in this time the repeater feature will be blocked. I read so many threads and posts here at mysensors that i get more and more confused.

    What i understand at the moment, that i only need #define MY_REPEATER_FEATURE and loop does not contain any sleep. Is this right or not?

    Greetings Wikibear

    mfalkviddM 1 Reply Last reply
    0
    • W Wikibear

      Hello together,

      i try to understand how does it works. Did i need really only #define MY_REPEATER_FEATURE ???
      Must i set some variables in loop or define more that i can use this as repeater?
      DHT11 takes some time to read out data. Normally we do this over sleep. But in this time the repeater feature will be blocked. I read so many threads and posts here at mysensors that i get more and more confused.

      What i understand at the moment, that i only need #define MY_REPEATER_FEATURE and loop does not contain any sleep. Is this right or not?

      Greetings Wikibear

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

      @wikibear yes, that should be sufficient. For the delay when reading DHT11 you can replace sleep() with wait().

      Welcome to the MySensors community!

      1 Reply Last reply
      0
      • W Offline
        W Offline
        Wikibear
        wrote on last edited by Wikibear
        #3

        Thank you very much for this quick reply!

        I read a thread with gw.XXX commands. That confused me. API say only #define MY_REPEATER_FEATURE.

        Now it's more clear to me!

        1 Reply Last reply
        1
        • mfalkviddM Offline
          mfalkviddM Offline
          mfalkvidd
          Mod
          wrote on last edited by
          #4

          @wikibear great.

          gw.xxx is from MySensors 1.x. In MySensors 2.x, gw. is no longer needed. More info here: https://forum.mysensors.org/topic/4261/mysensors-2-0-0-released

          1 Reply Last reply
          1
          • W Offline
            W Offline
            Wikibear
            wrote on last edited by
            #5

            Thanks but it seems not to work. My serial Gateway is working well. My repeater works DHT sends temp and humidity but it seems that repeat function does not work. I'm a little bit far away from gateway. A stay beside my repeater with arduino mini pro direct connected via programmer powered with USB voltage. But i didn't get any connection. If i go beside my gateway all is fine.

            Repeater code:

            
            #define MY_DEBUG
            //#define MY_TRANSPORT_WAIT_READY_MS 1
            
            #define MY_RADIO_NRF24
            #define MY_NODE_ID 51
            #define MY_REPEATER_FEATURE
            #define MY_RF24_IRQ_PIN 2
            #define MY_RF24_PA_LEVEL   (RF24_PA_MAX)
             
            #include <SPI.h>
            #include <MySensors.h>  
            #include <DHT.h>
            
            #define DHT_DATA_PIN 3
            #define SENSOR_TEMP_OFFSET 0
            
            // Sleep time between sensor updates (in milliseconds)
            // Must be >1000ms for DHT22 and >2000ms for DHT11
            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 1
            #define CHILD_ID_TEMP 0
            
            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);
            DHT dht;
            
            
            void presentation()  
            { 
              // Send the sketch version information to the gateway
              sendSketchInfo("TemperatureAndHumidity", "1.1");
            
              // Register all sensors to gw (they will be created as child devices)
              present(CHILD_ID_HUM, S_HUM);
              present(CHILD_ID_TEMP, S_TEMP);
            
              metric = getControllerConfig().isMetric;
            }
            
            
            void setup()
            {
              dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor
              if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) {
                Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
              }
              // Sleep for the time of the minimum sampling period to give the sensor time to power up
              // (otherwise, timeout errors might occure for the first reading)
              sleep(dht.getMinimumSamplingPeriod());
            }
            
            
            void loop()      
            {  
              // Force reading sensor, so it works also after sleep()
              dht.readSensor(true);
            
              // Get temperature from DHT library
              float temperature = dht.getTemperature();
              if (isnan(temperature)) {
                Serial.println("Failed reading temperature from DHT!");
              } else 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;
                if (!metric) {
                  temperature = dht.toFahrenheit(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 DHT library
              float humidity = dht.getHumidity();
              if (isnan(humidity)) {
                Serial.println("Failed reading humidity from DHT");
              } else 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
              wait(UPDATE_INTERVAL); 
            }
            
            

            Mini pro code:

            // Enable debug prints
            #define MY_DEBUG
            
            // Enable and select radio type attached 
            #define MY_RADIO_NRF24
            //#define MY_RADIO_RFM69
            //#define MY_RS485
            
            #define MY_NODE_ID 52
            #define MY_PARENT_NODE_ID 51
            
            #include <SPI.h>
            #include <MySensors.h>  
            #include <DHT.h>
            
            // Set this to the pin you connected the DHT's data pin to
            #define DHT_DATA_PIN 3
            
            // Set this offset if the sensor has a permanent small offset to the real temperatures
            #define SENSOR_TEMP_OFFSET 0
            
            int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
            int oldBatteryPcnt = 0;
            
            // Sleep time between sensor updates (in milliseconds)
            // Must be >1000ms for DHT22 and >2000ms for DHT11
            static const uint64_t UPDATE_INTERVAL = 300000;
            
            // 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 1
            #define CHILD_ID_TEMP 0
            
            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);
            DHT dht;
            
            
            void presentation()  
            { 
              // Send the sketch version information to the gateway
              sendSketchInfo("TemperatureAndHumidity", "1.1");
              
              // Register all sensors to gw (they will be created as child devices)
              present(CHILD_ID_HUM, S_HUM);
              present(CHILD_ID_TEMP, S_TEMP);
              
              metric = getControllerConfig().isMetric;
            }
            
            
            void setup()
            {
              dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor
              if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) {
                Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
              }
              // Sleep for the time of the minimum sampling period to give the sensor time to power up
              // (otherwise, timeout errors might occure for the first reading)
              sleep(dht.getMinimumSamplingPeriod());
              #if defined(__AVR_ATmega2560__)
                analogReference(INTERNAL1V1);
              #else
                analogReference(INTERNAL);
              #endif
            }
            
            
            void loop()      
            {  
              // Force reading sensor, so it works also after sleep()
              dht.readSensor(true);
              
              // Get temperature from DHT library
              float temperature = dht.getTemperature();
              if (isnan(temperature)) {
                Serial.println("Failed reading temperature from DHT!");
              } else 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;
                if (!metric) {
                  temperature = dht.toFahrenheit(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
                /////////////battery part////////////////
                int sensorValue = analogRead(BATTERY_SENSE_PIN);
              #ifdef MY_DEBUG
                Serial.println(sensorValue);
              #endif
              int batteryPcnt = sensorValue / 10;
              #ifdef MY_DEBUG
                float batteryV  = sensorValue * 0.003363075;
                Serial.print("Battery Voltage: ");
                Serial.print(batteryV);
                Serial.println(" V");
            
                Serial.print("Battery percent: ");
                Serial.print(batteryPcnt);
                Serial.println(" %");
              #endif
              if (oldBatteryPcnt != batteryPcnt) {
                    // Power up radio after sleep
                    if(batteryPcnt>100){ Serial.println("too much batt power"); batteryPcnt = 100; }
                    sendBatteryLevel(batteryPcnt);
                    oldBatteryPcnt = batteryPcnt;
                }
                
              } else {
                // Increase no update counter if the temperature stayed the same
                nNoUpdatesTemp++;
              }
            
              // Get humidity from DHT library
              float humidity = dht.getHumidity();
              if (isnan(humidity)) {
                Serial.println("Failed reading humidity from DHT");
              } else 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); 
            }
            

            Thanks for any help

            mfalkviddM 1 Reply Last reply
            0
            • W Wikibear

              Thanks but it seems not to work. My serial Gateway is working well. My repeater works DHT sends temp and humidity but it seems that repeat function does not work. I'm a little bit far away from gateway. A stay beside my repeater with arduino mini pro direct connected via programmer powered with USB voltage. But i didn't get any connection. If i go beside my gateway all is fine.

              Repeater code:

              
              #define MY_DEBUG
              //#define MY_TRANSPORT_WAIT_READY_MS 1
              
              #define MY_RADIO_NRF24
              #define MY_NODE_ID 51
              #define MY_REPEATER_FEATURE
              #define MY_RF24_IRQ_PIN 2
              #define MY_RF24_PA_LEVEL   (RF24_PA_MAX)
               
              #include <SPI.h>
              #include <MySensors.h>  
              #include <DHT.h>
              
              #define DHT_DATA_PIN 3
              #define SENSOR_TEMP_OFFSET 0
              
              // Sleep time between sensor updates (in milliseconds)
              // Must be >1000ms for DHT22 and >2000ms for DHT11
              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 1
              #define CHILD_ID_TEMP 0
              
              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);
              DHT dht;
              
              
              void presentation()  
              { 
                // Send the sketch version information to the gateway
                sendSketchInfo("TemperatureAndHumidity", "1.1");
              
                // Register all sensors to gw (they will be created as child devices)
                present(CHILD_ID_HUM, S_HUM);
                present(CHILD_ID_TEMP, S_TEMP);
              
                metric = getControllerConfig().isMetric;
              }
              
              
              void setup()
              {
                dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor
                if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) {
                  Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
                }
                // Sleep for the time of the minimum sampling period to give the sensor time to power up
                // (otherwise, timeout errors might occure for the first reading)
                sleep(dht.getMinimumSamplingPeriod());
              }
              
              
              void loop()      
              {  
                // Force reading sensor, so it works also after sleep()
                dht.readSensor(true);
              
                // Get temperature from DHT library
                float temperature = dht.getTemperature();
                if (isnan(temperature)) {
                  Serial.println("Failed reading temperature from DHT!");
                } else 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;
                  if (!metric) {
                    temperature = dht.toFahrenheit(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 DHT library
                float humidity = dht.getHumidity();
                if (isnan(humidity)) {
                  Serial.println("Failed reading humidity from DHT");
                } else 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
                wait(UPDATE_INTERVAL); 
              }
              
              

              Mini pro code:

              // Enable debug prints
              #define MY_DEBUG
              
              // Enable and select radio type attached 
              #define MY_RADIO_NRF24
              //#define MY_RADIO_RFM69
              //#define MY_RS485
              
              #define MY_NODE_ID 52
              #define MY_PARENT_NODE_ID 51
              
              #include <SPI.h>
              #include <MySensors.h>  
              #include <DHT.h>
              
              // Set this to the pin you connected the DHT's data pin to
              #define DHT_DATA_PIN 3
              
              // Set this offset if the sensor has a permanent small offset to the real temperatures
              #define SENSOR_TEMP_OFFSET 0
              
              int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
              int oldBatteryPcnt = 0;
              
              // Sleep time between sensor updates (in milliseconds)
              // Must be >1000ms for DHT22 and >2000ms for DHT11
              static const uint64_t UPDATE_INTERVAL = 300000;
              
              // 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 1
              #define CHILD_ID_TEMP 0
              
              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);
              DHT dht;
              
              
              void presentation()  
              { 
                // Send the sketch version information to the gateway
                sendSketchInfo("TemperatureAndHumidity", "1.1");
                
                // Register all sensors to gw (they will be created as child devices)
                present(CHILD_ID_HUM, S_HUM);
                present(CHILD_ID_TEMP, S_TEMP);
                
                metric = getControllerConfig().isMetric;
              }
              
              
              void setup()
              {
                dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor
                if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) {
                  Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
                }
                // Sleep for the time of the minimum sampling period to give the sensor time to power up
                // (otherwise, timeout errors might occure for the first reading)
                sleep(dht.getMinimumSamplingPeriod());
                #if defined(__AVR_ATmega2560__)
                  analogReference(INTERNAL1V1);
                #else
                  analogReference(INTERNAL);
                #endif
              }
              
              
              void loop()      
              {  
                // Force reading sensor, so it works also after sleep()
                dht.readSensor(true);
                
                // Get temperature from DHT library
                float temperature = dht.getTemperature();
                if (isnan(temperature)) {
                  Serial.println("Failed reading temperature from DHT!");
                } else 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;
                  if (!metric) {
                    temperature = dht.toFahrenheit(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
                  /////////////battery part////////////////
                  int sensorValue = analogRead(BATTERY_SENSE_PIN);
                #ifdef MY_DEBUG
                  Serial.println(sensorValue);
                #endif
                int batteryPcnt = sensorValue / 10;
                #ifdef MY_DEBUG
                  float batteryV  = sensorValue * 0.003363075;
                  Serial.print("Battery Voltage: ");
                  Serial.print(batteryV);
                  Serial.println(" V");
              
                  Serial.print("Battery percent: ");
                  Serial.print(batteryPcnt);
                  Serial.println(" %");
                #endif
                if (oldBatteryPcnt != batteryPcnt) {
                      // Power up radio after sleep
                      if(batteryPcnt>100){ Serial.println("too much batt power"); batteryPcnt = 100; }
                      sendBatteryLevel(batteryPcnt);
                      oldBatteryPcnt = batteryPcnt;
                  }
                  
                } else {
                  // Increase no update counter if the temperature stayed the same
                  nNoUpdatesTemp++;
                }
              
                // Get humidity from DHT library
                float humidity = dht.getHumidity();
                if (isnan(humidity)) {
                  Serial.println("Failed reading humidity from DHT");
                } else 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); 
              }
              

              Thanks for any help

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

              @wikibear could you post the debug output from the node, repeater and gateway?

              1 Reply Last reply
              0
              • W Offline
                W Offline
                Wikibear
                wrote on last edited by
                #7

                I'm not sure whats happened... But i think its working now. I try to investigate why it works now! If i find the reason i will post here. Thanks for help.

                1 Reply Last reply
                1
                Reply
                • Reply as topic
                Log in to reply
                • Oldest to Newest
                • Newest to Oldest
                • Most Votes


                21

                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