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. Multiple Dallas Temperatuur sensors at one sensor node

Multiple Dallas Temperatuur sensors at one sensor node

Scheduled Pinned Locked Moved Troubleshooting
36 Posts 9 Posters 3.7k Views 9 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.
  • dzjrD dzjr

    @grubstake I now have used a 4 wire YCY (screened signal cable), and that also is working ( 9 sensors on one pin).
    Ultimately, the use of a 2K2 resistor was a good solution

    Do you recommend to use the 5 volt of the arduino, or is it better to use the 5 volts which I use as power supply of the arduino?

    And can I or should I put the ground of the sensors on the arduino?

    zboblamontZ Offline
    zboblamontZ Offline
    zboblamont
    wrote on last edited by
    #26

    @dzjr I believe the point @Grubstake was making is to ensure solid and stable connection for voltage and ground to the board itself, not elsewhere, the issue is to ensure stability.
    Glad the stronger pullup solved your problem but would caution on choice of cable. Telephone wire or Cat5 as also stated is known to work well and reliably for One-Wire, is cheap and readily available. Screening or grounding unused cores does affect capacitance, which may lead to problems in final layout.

    1 Reply Last reply
    0
    • dzjrD Offline
      dzjrD Offline
      dzjr
      wrote on last edited by dzjr
      #27

      Thanks again for your help, last weekend I installed everything outside, and everything remains stable!

      The only "problem" I still have is that the resolution of the sensors is 9 Bit, while I prefer to have an 11 or 12 bit resolution.

      now I have made a second setup with two sensors and the same sketch (only name and IP address are different) and that gives a 12 bit resolution.
      Is this because I have connected 9 sensors, or is there possibly something wrong with the reading time in the sketch?
      Or is it just a programming error?

      the whole sketch is a bit big to post, so I cut it into pieces.

      before:

      
      // Dallas temp stukje
      #define COMPARE_TEMP 1 // 1= zenden alleen bij verandering 0= direct zenden
      #define ONE_WIRE_BUS 6 
      #define TEMPERATURE_PRECISION 12
      #define MAX_ATTACHED_DS18B20 13
      unsigned long SLEEP_TIME = 300; //slaaptijd tussen twee metingen in ms
      OneWire oneWire(ONE_WIRE_BUS); //Een oneWire-exemplaar instellen om te communiceren met alle OneWire-apparaten
      DallasTemperature sensors(&oneWire); //OneWire naar Dallas
      float lastTemperature[MAX_ATTACHED_DS18B20];
      int numSensors=0;
      bool receivedConfig = false;
      bool metric = true;
      
      DeviceAddress Probe01 = { 0x28, 0xFF, 0x64, 0x1D, 0xF8, 0x4F, 0x3A, 0x08 }; // op print
      DeviceAddress Probe02 = { 0x28, 0xFF, 0x64, 0x1D, 0xF9, 0x9D, 0xDC, 0x5E  }; // temp op -100 cm
      DeviceAddress Probe03 = { 0x28, 0xED, 0x25, 0x77, 0x91, 0x13, 0x02, 0xFF }; // temp op -50 mtr
      DeviceAddress Probe04 = { 0x28, 0xC5, 0x51, 0x77, 0x91, 0x0B, 0x02, 0x00 }; // temp op -20 cm
      DeviceAddress Probe05 = { 0x28, 0xDC, 0x25, 0x77, 0x91, 0x13, 0x02, 0x25 }; // temp op -10 cm
      DeviceAddress Probe06 = { 0x28, 0x54, 0x96, 0x77, 0x91, 0x08, 0x02, 0xA0 }; // temp op 10 cm
      DeviceAddress Probe07 = { 0x28, 0x1F, 0x11, 0x43, 0x98, 0x25, 0x00, 0x8B }; // temp op 150 cm
      DeviceAddress Probe08 = { 0x28, 0xFF, 0x0A, 0x63, 0x73, 0x16, 0x05, 0x9F }; // temp van water in put
      DeviceAddress Probe09 = { 0x28, 0x98, 0x9C, 0x77, 0x91, 0x19, 0x02, 0xD7 }; // temp in border
      
      
      // Initialiseer temperatuurbericht
      MyMessage msg(0, V_TEMP);
      
      

      Void Loop:

      void loop()
      
      {
      {     
        // Fetch temperatures from Dallas sensors
        sensors.requestTemperatures();
      
        // query conversion time and sleep until conversion completed
        int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution());
       
        wait(conversionTime);
      
        // 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>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
        float temperature;
          // voor geadreseerde sensoren
          switch (i)  {
            case 0:
              temperature = sensors.getTempC(Probe01);
              break;
            case 1:
              temperature = sensors.getTempC(Probe02);
              break;
            case 2:
              temperature = sensors.getTempC(Probe03);
              break;
            case 3:
              temperature = sensors.getTempC(Probe04);
              break;
            case 4:
              temperature = sensors.getTempC(Probe05);
              break;
            case 5:
              temperature = sensors.getTempC(Probe06);
              break;
            case 6:
              temperature = sensors.getTempC(Probe07);
              break;
            case 7:
              temperature = sensors.getTempC(Probe08);
              break;
            case 8:
              temperature = sensors.getTempC(Probe09);
              break; 
            default:
              temperature = sensors.getTempCByIndex(Probe09);
              break;
          }
       
          // Only send data if temperature has changed and no error
          #if COMPARE_TEMP == 1
          if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
          #else
          if (temperature != -127.00 && temperature != 85.00) {
          #endif
       
            // Send in the new temperature
            send(msg.setSensor(i+21).set(temperature,1));
            // Save new temperatures for next compare
            lastTemperature[i]=temperature;
          }
          }
          }
      

      The complete code you can find here; sorry the comments are in dutch...
      https://github.com/dzjr/MySensors-Put-Node

      This was my first real MySensor and second Arduino sketch / project, so if you have some comments or tips, I am open to that!

      Thank you for the help!

      dzjr

      zboblamontZ H 2 Replies Last reply
      0
      • dzjrD dzjr

        Thanks again for your help, last weekend I installed everything outside, and everything remains stable!

        The only "problem" I still have is that the resolution of the sensors is 9 Bit, while I prefer to have an 11 or 12 bit resolution.

        now I have made a second setup with two sensors and the same sketch (only name and IP address are different) and that gives a 12 bit resolution.
        Is this because I have connected 9 sensors, or is there possibly something wrong with the reading time in the sketch?
        Or is it just a programming error?

        the whole sketch is a bit big to post, so I cut it into pieces.

        before:

        
        // Dallas temp stukje
        #define COMPARE_TEMP 1 // 1= zenden alleen bij verandering 0= direct zenden
        #define ONE_WIRE_BUS 6 
        #define TEMPERATURE_PRECISION 12
        #define MAX_ATTACHED_DS18B20 13
        unsigned long SLEEP_TIME = 300; //slaaptijd tussen twee metingen in ms
        OneWire oneWire(ONE_WIRE_BUS); //Een oneWire-exemplaar instellen om te communiceren met alle OneWire-apparaten
        DallasTemperature sensors(&oneWire); //OneWire naar Dallas
        float lastTemperature[MAX_ATTACHED_DS18B20];
        int numSensors=0;
        bool receivedConfig = false;
        bool metric = true;
        
        DeviceAddress Probe01 = { 0x28, 0xFF, 0x64, 0x1D, 0xF8, 0x4F, 0x3A, 0x08 }; // op print
        DeviceAddress Probe02 = { 0x28, 0xFF, 0x64, 0x1D, 0xF9, 0x9D, 0xDC, 0x5E  }; // temp op -100 cm
        DeviceAddress Probe03 = { 0x28, 0xED, 0x25, 0x77, 0x91, 0x13, 0x02, 0xFF }; // temp op -50 mtr
        DeviceAddress Probe04 = { 0x28, 0xC5, 0x51, 0x77, 0x91, 0x0B, 0x02, 0x00 }; // temp op -20 cm
        DeviceAddress Probe05 = { 0x28, 0xDC, 0x25, 0x77, 0x91, 0x13, 0x02, 0x25 }; // temp op -10 cm
        DeviceAddress Probe06 = { 0x28, 0x54, 0x96, 0x77, 0x91, 0x08, 0x02, 0xA0 }; // temp op 10 cm
        DeviceAddress Probe07 = { 0x28, 0x1F, 0x11, 0x43, 0x98, 0x25, 0x00, 0x8B }; // temp op 150 cm
        DeviceAddress Probe08 = { 0x28, 0xFF, 0x0A, 0x63, 0x73, 0x16, 0x05, 0x9F }; // temp van water in put
        DeviceAddress Probe09 = { 0x28, 0x98, 0x9C, 0x77, 0x91, 0x19, 0x02, 0xD7 }; // temp in border
        
        
        // Initialiseer temperatuurbericht
        MyMessage msg(0, V_TEMP);
        
        

        Void Loop:

        void loop()
        
        {
        {     
          // Fetch temperatures from Dallas sensors
          sensors.requestTemperatures();
        
          // query conversion time and sleep until conversion completed
          int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution());
         
          wait(conversionTime);
        
          // 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>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
          float temperature;
            // voor geadreseerde sensoren
            switch (i)  {
              case 0:
                temperature = sensors.getTempC(Probe01);
                break;
              case 1:
                temperature = sensors.getTempC(Probe02);
                break;
              case 2:
                temperature = sensors.getTempC(Probe03);
                break;
              case 3:
                temperature = sensors.getTempC(Probe04);
                break;
              case 4:
                temperature = sensors.getTempC(Probe05);
                break;
              case 5:
                temperature = sensors.getTempC(Probe06);
                break;
              case 6:
                temperature = sensors.getTempC(Probe07);
                break;
              case 7:
                temperature = sensors.getTempC(Probe08);
                break;
              case 8:
                temperature = sensors.getTempC(Probe09);
                break; 
              default:
                temperature = sensors.getTempCByIndex(Probe09);
                break;
            }
         
            // Only send data if temperature has changed and no error
            #if COMPARE_TEMP == 1
            if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
            #else
            if (temperature != -127.00 && temperature != 85.00) {
            #endif
         
              // Send in the new temperature
              send(msg.setSensor(i+21).set(temperature,1));
              // Save new temperatures for next compare
              lastTemperature[i]=temperature;
            }
            }
            }
        

        The complete code you can find here; sorry the comments are in dutch...
        https://github.com/dzjr/MySensors-Put-Node

        This was my first real MySensor and second Arduino sketch / project, so if you have some comments or tips, I am open to that!

        Thank you for the help!

        dzjr

        zboblamontZ Offline
        zboblamontZ Offline
        zboblamont
        wrote on last edited by
        #28

        @dzjr Check out the read times on the Dallas specs, from memory it increases markedly with higher resolutions....

        1 Reply Last reply
        0
        • dzjrD dzjr

          Thanks again for your help, last weekend I installed everything outside, and everything remains stable!

          The only "problem" I still have is that the resolution of the sensors is 9 Bit, while I prefer to have an 11 or 12 bit resolution.

          now I have made a second setup with two sensors and the same sketch (only name and IP address are different) and that gives a 12 bit resolution.
          Is this because I have connected 9 sensors, or is there possibly something wrong with the reading time in the sketch?
          Or is it just a programming error?

          the whole sketch is a bit big to post, so I cut it into pieces.

          before:

          
          // Dallas temp stukje
          #define COMPARE_TEMP 1 // 1= zenden alleen bij verandering 0= direct zenden
          #define ONE_WIRE_BUS 6 
          #define TEMPERATURE_PRECISION 12
          #define MAX_ATTACHED_DS18B20 13
          unsigned long SLEEP_TIME = 300; //slaaptijd tussen twee metingen in ms
          OneWire oneWire(ONE_WIRE_BUS); //Een oneWire-exemplaar instellen om te communiceren met alle OneWire-apparaten
          DallasTemperature sensors(&oneWire); //OneWire naar Dallas
          float lastTemperature[MAX_ATTACHED_DS18B20];
          int numSensors=0;
          bool receivedConfig = false;
          bool metric = true;
          
          DeviceAddress Probe01 = { 0x28, 0xFF, 0x64, 0x1D, 0xF8, 0x4F, 0x3A, 0x08 }; // op print
          DeviceAddress Probe02 = { 0x28, 0xFF, 0x64, 0x1D, 0xF9, 0x9D, 0xDC, 0x5E  }; // temp op -100 cm
          DeviceAddress Probe03 = { 0x28, 0xED, 0x25, 0x77, 0x91, 0x13, 0x02, 0xFF }; // temp op -50 mtr
          DeviceAddress Probe04 = { 0x28, 0xC5, 0x51, 0x77, 0x91, 0x0B, 0x02, 0x00 }; // temp op -20 cm
          DeviceAddress Probe05 = { 0x28, 0xDC, 0x25, 0x77, 0x91, 0x13, 0x02, 0x25 }; // temp op -10 cm
          DeviceAddress Probe06 = { 0x28, 0x54, 0x96, 0x77, 0x91, 0x08, 0x02, 0xA0 }; // temp op 10 cm
          DeviceAddress Probe07 = { 0x28, 0x1F, 0x11, 0x43, 0x98, 0x25, 0x00, 0x8B }; // temp op 150 cm
          DeviceAddress Probe08 = { 0x28, 0xFF, 0x0A, 0x63, 0x73, 0x16, 0x05, 0x9F }; // temp van water in put
          DeviceAddress Probe09 = { 0x28, 0x98, 0x9C, 0x77, 0x91, 0x19, 0x02, 0xD7 }; // temp in border
          
          
          // Initialiseer temperatuurbericht
          MyMessage msg(0, V_TEMP);
          
          

          Void Loop:

          void loop()
          
          {
          {     
            // Fetch temperatures from Dallas sensors
            sensors.requestTemperatures();
          
            // query conversion time and sleep until conversion completed
            int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution());
           
            wait(conversionTime);
          
            // 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>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
            float temperature;
              // voor geadreseerde sensoren
              switch (i)  {
                case 0:
                  temperature = sensors.getTempC(Probe01);
                  break;
                case 1:
                  temperature = sensors.getTempC(Probe02);
                  break;
                case 2:
                  temperature = sensors.getTempC(Probe03);
                  break;
                case 3:
                  temperature = sensors.getTempC(Probe04);
                  break;
                case 4:
                  temperature = sensors.getTempC(Probe05);
                  break;
                case 5:
                  temperature = sensors.getTempC(Probe06);
                  break;
                case 6:
                  temperature = sensors.getTempC(Probe07);
                  break;
                case 7:
                  temperature = sensors.getTempC(Probe08);
                  break;
                case 8:
                  temperature = sensors.getTempC(Probe09);
                  break; 
                default:
                  temperature = sensors.getTempCByIndex(Probe09);
                  break;
              }
           
              // Only send data if temperature has changed and no error
              #if COMPARE_TEMP == 1
              if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
              #else
              if (temperature != -127.00 && temperature != 85.00) {
              #endif
           
                // Send in the new temperature
                send(msg.setSensor(i+21).set(temperature,1));
                // Save new temperatures for next compare
                lastTemperature[i]=temperature;
              }
              }
              }
          

          The complete code you can find here; sorry the comments are in dutch...
          https://github.com/dzjr/MySensors-Put-Node

          This was my first real MySensor and second Arduino sketch / project, so if you have some comments or tips, I am open to that!

          Thank you for the help!

          dzjr

          H Offline
          H Offline
          hard-shovel
          wrote on last edited by
          #29

          @dzjr you have the define

          #define TEMPERATURE_PRECISION 12
          

          In the github code this is not utilized, so the sensors are operating in 9 bit resolution.

          You need to add the following in the before or setup

          sensors.setResolution(TEMPERATURE_PRECISION);
          
          dzjrD 1 Reply Last reply
          1
          • H hard-shovel

            @dzjr you have the define

            #define TEMPERATURE_PRECISION 12
            

            In the github code this is not utilized, so the sensors are operating in 9 bit resolution.

            You need to add the following in the before or setup

            sensors.setResolution(TEMPERATURE_PRECISION);
            
            dzjrD Offline
            dzjrD Offline
            dzjr
            wrote on last edited by
            #30

            @hard-shovel

            Thanks for the reply, i have tryed to load the new sketch into the Arduino, only i cant make USB connection, do i have look at that first 😕.

            You will hear from me.

            Dzjr

            1 Reply Last reply
            1
            • dzjrD Offline
              dzjrD Offline
              dzjr
              wrote on last edited by
              #31

              after replacing the arduino (I could not connect the board) I was able to load the sketch again.

              I now have a better resolution, I do not think I have 12 bits but maybe that's because of the link with domoticz.

              0_1543091621505_4d1fcb8e-a9db-4b02-a46c-61b211146652-image.png

              As I wrote the node is installed, but still think that I must adapt to the sketch.

              I now only have a dallas sensor that does not work anymore, but that will be okay.

              mfalkviddM H 2 Replies Last reply
              0
              • dzjrD dzjr

                after replacing the arduino (I could not connect the board) I was able to load the sketch again.

                I now have a better resolution, I do not think I have 12 bits but maybe that's because of the link with domoticz.

                0_1543091621505_4d1fcb8e-a9db-4b02-a46c-61b211146652-image.png

                As I wrote the node is installed, but still think that I must adapt to the sketch.

                I now only have a dallas sensor that does not work anymore, but that will be okay.

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

                @dzjr are you aware that the accuracy is still ±0.5°C, regardless of resolution?

                dzjrD 1 Reply Last reply
                0
                • mfalkviddM mfalkvidd

                  @dzjr are you aware that the accuracy is still ±0.5°C, regardless of resolution?

                  dzjrD Offline
                  dzjrD Offline
                  dzjr
                  wrote on last edited by
                  #33

                  @mfalkvidd Yes i know that, i allready read it in the spec sheet.

                  1 Reply Last reply
                  0
                  • dzjrD dzjr

                    after replacing the arduino (I could not connect the board) I was able to load the sketch again.

                    I now have a better resolution, I do not think I have 12 bits but maybe that's because of the link with domoticz.

                    0_1543091621505_4d1fcb8e-a9db-4b02-a46c-61b211146652-image.png

                    As I wrote the node is installed, but still think that I must adapt to the sketch.

                    I now only have a dallas sensor that does not work anymore, but that will be okay.

                    H Offline
                    H Offline
                    hard-shovel
                    wrote on last edited by
                    #34

                    @dzjr To get the extra resolution sent to the controller try using

                      send(msg.setSensor(i+21).set(temperature,2));
                    
                    dzjrD 1 Reply Last reply
                    0
                    • H hard-shovel

                      @dzjr To get the extra resolution sent to the controller try using

                        send(msg.setSensor(i+21).set(temperature,2));
                      
                      dzjrD Offline
                      dzjrD Offline
                      dzjr
                      wrote on last edited by
                      #35

                      @hard-shovel I will keep that in mind,

                      for now it is working (only one dallas is broken).

                      1 Reply Last reply
                      0
                      • F Offline
                        F Offline
                        fouad1996
                        wrote on last edited by
                        #36

                        @zboblamont said in Multiple Dallas Temperatuur sensors at one sensor node:

                        If you cannot daisy chain them because there is no sequential route between locations, use a separate pin for each data line (powered via resistor) and communicate with each line in turn.
                        The line here is using 3 cores in 20-30m of Cat5e cable to ensure each chip is physically sequential on the line.
                        When I added a further sensor location, a loop had to be spliced in to keep the line a daisy chain. It is a small house, the length is purely down to the route, and cable is cheap.

                        in case you can not daisy chain them because there is no sequential direction among locations, use a separate pin for each data line (powered thru resistor) and talk with each line in flip.
                        the road here is using three cores in 20-30m of Cat5e cable to make certain each chip is physically sequential on the road.
                        after I delivered a similarly sensor vicinity, a loop needed to be spliced in to preserve the road a daisy chain. it is a small residence, the period is purely down to the route, and cable is cheap.

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


                        18

                        Online

                        11.7k

                        Users

                        11.2k

                        Topics

                        113.0k

                        Posts


                        Copyright 2019 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