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. Troubleshooting
  3. Communication problem (maybe)

Communication problem (maybe)

Scheduled Pinned Locked Moved Troubleshooting
30 Posts 5 Posters 12.7k 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.
  • H Offline
    H Offline
    Hausner
    wrote on last edited by Hausner
    #19

    Temperatur sensor

     // Example sketch showing how to send in OneWire temperature readings
     #include <MySensor.h>  
     #include <SPI.h>
     #include <DallasTemperature.h>
     #include <OneWire.h>
     
     #define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected 
     #define MAX_ATTACHED_DS18B20 16
     unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
     OneWire oneWire(ONE_WIRE_BUS);
     DallasTemperature sensors(&oneWire);
     MySensor gw;
     float lastTemperature[MAX_ATTACHED_DS18B20];
     int numSensors=0;
     boolean receivedConfig = false;
     boolean metric = true; 
     // Initialize temperature message
     MyMessage msg(0,V_TEMP);
     
     //int BATTERY_SENSE_PIN = A0; // select the input pin for the battery sense point
     //int oldBatteryPcnt = 0;
     
     void setup()  
     { 
       // Startup OneWire 
       sensors.begin();
     
       // Startup and initialize MySensors library. Set callback for incoming messages. 
       gw.begin(); 
     
       // Send the sketch version information to the gateway and Controller
       gw.sendSketchInfo("Temperature Sensor", "1.0");
     
       // Fetch the number of attached temperature sensors  
       numSensors = sensors.getDeviceCount();
     
       // Present all sensors to controller
       for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
          gw.present(i, S_TEMP);
       }
       
       // use the 1.1 V internal reference
       //analogReference(INTERNAL);
     }
     
     
     void loop()     
     {     
       // Process incoming messages (like config from server)
       gw.process(); 
     
       // Fetch temperatures from Dallas sensors
       sensors.requestTemperatures(); 
    
       // Read temperatures and send them to controller 
       for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
    
       // Fetch and round temperature to one decimal
       float temperature = static_cast<float>(static_cast<int>  ((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
    
    // Only send data if temperature has changed and no error
    if (lastTemperature[i] != temperature && temperature != -127.00) {
    
      // Send in the new temperature
      gw.send(msg.setSensor(i).set(temperature,1));
      lastTemperature[i]=temperature;
    }
       }
    
    // get the battery Voltage
    //int sensorValue = analogRead(BATTERY_SENSE_PIN);
    //Serial.println(sensorValue);
    // 1M, 470K divider across battery and using internal ADC ref of 1.1V
    // Sense point is bypassed with 0.1 uF cap to reduce noise at that point
     // ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts
     // 3.44/1023 = Volts per bit = 0.003363075
    //float batteryV = sensorValue * 0.004106;
    //int batteryPcnt = sensorValue / 10;
     //Serial.print("Battery Voltage: ");
       //Serial.print(batteryV);
       //Serial.println(" V");
       //Serial.print("Battery percent: ");
       //Serial.print(batteryPcnt);
       //Serial.println(" %");
       //if (oldBatteryPcnt != batteryPcnt) {
       // Power up radio after sleep
       //gw.sendBatteryLevel(batteryPcnt);
       //oldBatteryPcnt = batteryPcnt;
       //}
    
       //gw.sleep(SLEEP_TIME);
     }
    

    The temp sensor has been build according to this: http://mysensors.org/build/temp
    1 small exception though. I have used 5v->3.3v aparters for the radios, but that shouldn't matter.
    10Pcs-lot-Socket-Adapter-Plate-Board-For-8Pin-NRF24L01-Wireless-Transceive-Module-51-Free-Shipping.jpg

    H 1 Reply Last reply
    0
    • H Hausner

      Temperatur sensor

       // Example sketch showing how to send in OneWire temperature readings
       #include <MySensor.h>  
       #include <SPI.h>
       #include <DallasTemperature.h>
       #include <OneWire.h>
       
       #define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected 
       #define MAX_ATTACHED_DS18B20 16
       unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
       OneWire oneWire(ONE_WIRE_BUS);
       DallasTemperature sensors(&oneWire);
       MySensor gw;
       float lastTemperature[MAX_ATTACHED_DS18B20];
       int numSensors=0;
       boolean receivedConfig = false;
       boolean metric = true; 
       // Initialize temperature message
       MyMessage msg(0,V_TEMP);
       
       //int BATTERY_SENSE_PIN = A0; // select the input pin for the battery sense point
       //int oldBatteryPcnt = 0;
       
       void setup()  
       { 
         // Startup OneWire 
         sensors.begin();
       
         // Startup and initialize MySensors library. Set callback for incoming messages. 
         gw.begin(); 
       
         // Send the sketch version information to the gateway and Controller
         gw.sendSketchInfo("Temperature Sensor", "1.0");
       
         // Fetch the number of attached temperature sensors  
         numSensors = sensors.getDeviceCount();
       
         // Present all sensors to controller
         for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
            gw.present(i, S_TEMP);
         }
         
         // use the 1.1 V internal reference
         //analogReference(INTERNAL);
       }
       
       
       void loop()     
       {     
         // Process incoming messages (like config from server)
         gw.process(); 
       
         // Fetch temperatures from Dallas sensors
         sensors.requestTemperatures(); 
      
         // Read temperatures and send them to controller 
         for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
      
         // Fetch and round temperature to one decimal
         float temperature = static_cast<float>(static_cast<int>  ((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
      
      // Only send data if temperature has changed and no error
      if (lastTemperature[i] != temperature && temperature != -127.00) {
      
        // Send in the new temperature
        gw.send(msg.setSensor(i).set(temperature,1));
        lastTemperature[i]=temperature;
      }
         }
      
      // get the battery Voltage
      //int sensorValue = analogRead(BATTERY_SENSE_PIN);
      //Serial.println(sensorValue);
      // 1M, 470K divider across battery and using internal ADC ref of 1.1V
      // Sense point is bypassed with 0.1 uF cap to reduce noise at that point
       // ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts
       // 3.44/1023 = Volts per bit = 0.003363075
      //float batteryV = sensorValue * 0.004106;
      //int batteryPcnt = sensorValue / 10;
       //Serial.print("Battery Voltage: ");
         //Serial.print(batteryV);
         //Serial.println(" V");
         //Serial.print("Battery percent: ");
         //Serial.print(batteryPcnt);
         //Serial.println(" %");
         //if (oldBatteryPcnt != batteryPcnt) {
         // Power up radio after sleep
         //gw.sendBatteryLevel(batteryPcnt);
         //oldBatteryPcnt = batteryPcnt;
         //}
      
         //gw.sleep(SLEEP_TIME);
       }
      

      The temp sensor has been build according to this: http://mysensors.org/build/temp
      1 small exception though. I have used 5v->3.3v aparters for the radios, but that shouldn't matter.
      10Pcs-lot-Socket-Adapter-Plate-Board-For-8Pin-NRF24L01-Wireless-Transceive-Module-51-Free-Shipping.jpg

      H Offline
      H Offline
      hek
      Admin
      wrote on last edited by
      #20

      @Hausner said:

      //gw.sleep(SLEEP_TIME);

      Why did you comment away this line?

      H 1 Reply Last reply
      0
      • H hek

        @Hausner said:

        //gw.sleep(SLEEP_TIME);

        Why did you comment away this line?

        H Offline
        H Offline
        Hausner
        wrote on last edited by
        #21

        @hek

        Because it looks like that the sleep function is messing with the repeater function. With sleep enabled, almost all messages to the relay actuator node gets lost.

        1 Reply Last reply
        0
        • H Offline
          H Offline
          hek
          Admin
          wrote on last edited by hek
          #22

          Hmm.. shouldn't affect transmissions. When you removed this line you will get several hundreds of temp readings per second. It is a very big chance a few of them differs which means they will send it to gateway.

          You could try adding:
          gw.powerUp();
          delay(10)
          Just before gw.send() to add a small some additional delay after radio powers up.

          If you want to keep node awake another option is to use millis() keep track of send frequency. See here:
          https://github.com/mysensors/Arduino/blob/master/libraries/MySensors/examples/TimeAwareSensor/TimeAwareSensor.ino#L47

          H 1 Reply Last reply
          0
          • H hek

            Hmm.. shouldn't affect transmissions. When you removed this line you will get several hundreds of temp readings per second. It is a very big chance a few of them differs which means they will send it to gateway.

            You could try adding:
            gw.powerUp();
            delay(10)
            Just before gw.send() to add a small some additional delay after radio powers up.

            If you want to keep node awake another option is to use millis() keep track of send frequency. See here:
            https://github.com/mysensors/Arduino/blob/master/libraries/MySensors/examples/TimeAwareSensor/TimeAwareSensor.ino#L47

            H Offline
            H Offline
            Hausner
            wrote on last edited by
            #23

            @hek said:

            delay(10)

            I assume that is milliseconds, but does that mean that the radio will be powered on during that delay, and will the node repeat incoming messages during that?

            If so, I think a much bigger delay would be better, like 30000 or even more.

            H 1 Reply Last reply
            0
            • H Offline
              H Offline
              hek
              Admin
              wrote on last edited by
              #24

              This node isn't configured to be a repeater. So no, it won't.

              1 Reply Last reply
              0
              • H Offline
                H Offline
                Hausner
                wrote on last edited by Hausner
                #25

                It isn't??

                hmm... now i'm puzzled!

                Cause this is 2 temp nodes

                0;0;3;0;9;read: 24-23-0 s=0,c=1,t=0,pt=7,l=5:23.8
                

                My relay actuator is 22

                1 Reply Last reply
                0
                • N Offline
                  N Offline
                  niccodemi
                  wrote on last edited by
                  #26

                  @Hausner do you have any issues with relay node if you are NOT using it also as repeater?

                  1 Reply Last reply
                  0
                  • H Hausner

                    @hek said:

                    delay(10)

                    I assume that is milliseconds, but does that mean that the radio will be powered on during that delay, and will the node repeat incoming messages during that?

                    If so, I think a much bigger delay would be better, like 30000 or even more.

                    H Offline
                    H Offline
                    hek
                    Admin
                    wrote on last edited by
                    #27

                    If so, I think a much bigger delay would be better, like 30000 or even more.

                    Yes, thats is actually a third option like you say. Just add a delay(30000) at the end of loop(). (If this node just acts a as a temp sensor and nothing else).

                    1 Reply Last reply
                    0
                    • H Hausner

                      @daulagari

                      By 1-way node I mean a reporting node. It only reports a temperature, nothing else. So therefore 1 way traffic TO the GW/controller.

                      A relay node on the other hand has to receive also, else you can't flip on/off the relays.

                      This is roughly 1 minute worth of controller log:

                       2014-11-13 04:49:27 - Helena_temp_LastUpdate state updated to 2014-11-13T04:49:27
                       2014-11-13 04:49:28 - Temperature_GF_Helena state updated to 26.7
                       2014-11-13 04:49:28 - Helena_temp_LastUpdate state updated to 2014-11-13T04:49:28
                       2014-11-13 04:49:29 - Temperature_GF_Helena state updated to 26.6
                       2014-11-13 04:49:29 - Helena_temp_LastUpdate state updated to 2014-11-13T04:49:29
                       2014-11-13 04:49:30 - Temperature_GF_Helena state updated to 26.7
                       2014-11-13 04:49:30 - Helena_temp_LastUpdate state updated to 2014-11-13T04:49:30
                       2014-11-13 04:49:39 - Temperature_GF_Helena state updated to 26.6
                       2014-11-13 04:49:39 - Helena_temp_LastUpdate state updated to 2014-11-13T04:49:39
                       2014-11-13 04:50:07 - Temperature_GF_Living state updated to 24.3
                       2014-11-13 04:50:07 - Living_temp_LastUpdate state updated to 2014-11-13T04:50:07
                       2014-11-13 04:50:08 - Temperature_GF_Living state updated to 24.2
                       2014-11-13 04:50:08 - Living_temp_LastUpdate state updated to 2014-11-13T04:50:08
                       2014-11-13 04:50:12 - Temperature_GF_Living state updated to 24.3
                       2014-11-13 04:50:12 - Living_temp_LastUpdate state updated to 2014-11-13T04:50:12
                       2014-11-13 04:50:14 - Temperature_GF_Living state updated to 24.2
                       2014-11-13 04:50:14 - Living_temp_LastUpdate state updated to 2014-11-13T04:50:14
                       2014-11-13 04:50:15 - Temperature_GF_Helena state updated to 26.7
                       2014-11-13 04:50:15 - Helena_temp_LastUpdate state updated to 2014-11-13T04:50:15
                       2014-11-13 04:50:16 - Temperature_GF_Helena state updated to 26.6
                       2014-11-13 04:50:16 - Helena_temp_LastUpdate state updated to 2014-11-13T04:50:16
                       2014-11-13 04:50:16 - Temperature_GF_Living state updated to 24.3
                       2014-11-13 04:50:16 - Living_temp_LastUpdate state updated to 2014-11-13T04:50:16
                       2014-11-13 04:50:16 - Temperature_GF_Living state updated to 24.2
                       2014-11-13 04:50:16 - Living_temp_LastUpdate state updated to 2014-11-13T04:50:16
                       2014-11-13 04:50:18 - Temperature_GF_Living state updated to 24.3
                       2014-11-13 04:50:18 - Living_temp_LastUpdate state updated to 2014-11-13T04:50:18
                       2014-11-13 04:50:19 - Temperature_GF_Helena state updated to 26.7
                       2014-11-13 04:50:19 - Helena_temp_LastUpdate state updated to 2014-11-13T04:50:19
                       2014-11-13 04:50:20 - Temperature_GF_Helena state updated to 26.6
                       2014-11-13 04:50:20 - Helena_temp_LastUpdate state updated to 2014-11-13T04:50:20
                       2014-11-13 04:50:20 - Temperature_GF_Living state updated to 24.2
                       2014-11-13 04:50:20 - Living_temp_LastUpdate state updated to 2014-11-13T04:50:20
                       2014-11-13 04:50:20 - Temperature_GF_Helena state updated to 26.7
                       2014-11-13 04:50:20 - Helena_temp_LastUpdate state updated to 2014-11-13T04:50:20
                       2014-11-13 04:50:20 - Temperature_GF_Living state updated to 24.3
                       2014-11-13 04:50:20 - Living_temp_LastUpdate state updated to 2014-11-13T04:50:20
                       2014-11-13 04:50:22 - Temperature_GF_Helena state updated to 26.6
                       2014-11-13 04:50:22 - Helena_temp_LastUpdate state updated to 2014-11-13T04:50:22
                       2014-11-13 04:50:23 - Temperature_GF_Living state updated to 24.2
                       2014-11-13 04:50:23 - Living_temp_LastUpdate state updated to 2014-11-13T04:50:23
                       2014-11-13 04:50:24 - Temperature_GF_Living state updated to 24.3
                       2014-11-13 04:50:24 - Living_temp_LastUpdate state updated to 2014-11-13T04:50:24
                       2014-11-13 04:50:26 - Temperature_GF_Helena state updated to 26.7
                       2014-11-13 04:50:26 - Helena_temp_LastUpdate state updated to 2014-11-13T04:50:26
                       2014-11-13 04:50:26 - Temperature_GF_Living state updated to 24.2
                       2014-11-13 04:50:26 - Living_temp_LastUpdate state updated to 2014-11-13T04:50:26
                       2014-11-13 04:50:27 - Temperature_GF_Living state updated to 24.3
                       2014-11-13 04:50:27 - Living_temp_LastUpdate state updated to 2014-11-13T04:50:27
                       2014-11-13 04:50:29 - Temperature_GF_Helena state updated to 26.6
                       2014-11-13 04:50:29 - Helena_temp_LastUpdate state updated to 2014-11-13T04:50:29
                      

                      As you can see i'm getting way more than 1 reading a second. I think this is happening because of the rounding up/down of the temperature readings.

                      P Offline
                      P Offline
                      pgo
                      wrote on last edited by
                      #28

                      @Hausner I send the temp changes only if change is > 1 deg C and light changes only > +/- 40 lux, have this in main loop:

                      void loop()     
                      {     
                        // Process incoming messages (like config from server)
                        gw.process(); 
                      
                        // Fetch temperatures from Dallas sensors
                        sensors.requestTemperatures(); 
                      
                        // Read temperatures and send them to controller 
                        for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
                      
                          // Fetch and round temperature to one decimal
                          float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
                      
                          // Only send data if temperature has changed more then 1 degC and no error
                          if (int(lastTemperature[i]) != int(temperature) && temperature != -127.00) { //added integer
                      
                            // Send in the new temperature
                            gw.send(msg.setSensor(i).set(temperature,1));
                            lastTemperature[i]=temperature;
                          }
                        }
                        // Read lux from TEMT6000
                        float lightLevel = analogRead(LIGHT_SENSOR_ANALOG_PIN) * 9.765625;  // 1000/1024
                        if (int(lightLevel - lastLightLevel) > 40 || int(lastLightLevel - lightLevel) > 40) {
                            gw.send(msg.setSensor(CHILD_ID_LIGHT).set(int(lightLevel),1));
                            lastLightLevel = lightLevel;
                        }
                        //gw.sleep(SLEEP_TIME); //no sleep for relays!!!!
                      }
                      

                      Hope this helps, Pego

                      1 Reply Last reply
                      0
                      • D Offline
                        D Offline
                        daulagari
                        Hero Member
                        wrote on last edited by
                        #29

                        As you can see i'm getting way more than 1 reading a second. I think this is happening because of the rounding up/down of the temperature readings.

                        Yes, clear, if you do not want this you need to change the if to something like:

                        if (abs(lastTemperature[i] - temperature) >= 0.5 && temperature != -127.00) {
                        
                        H 1 Reply Last reply
                        0
                        • D daulagari

                          As you can see i'm getting way more than 1 reading a second. I think this is happening because of the rounding up/down of the temperature readings.

                          Yes, clear, if you do not want this you need to change the if to something like:

                          if (abs(lastTemperature[i] - temperature) >= 0.5 && temperature != -127.00) {
                          
                          H Offline
                          H Offline
                          Hausner
                          wrote on last edited by
                          #30

                          @daulagari

                          Thank you. I'm gonna try with this

                          if (abs(lastTemperature[i] - temperature) >= 0.2 && temperature != -127.00) {
                          
                          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


                          28

                          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