Go Down

Topic: Multiple DS18B20 Temperature Sensors on one bus (Read 21 times) previous topic - next topic

terryking228

Jan 18, 2013, 05:23 am Last Edit: Jan 18, 2013, 02:27 pm by terryking228 Reason: 1
Hi Everyone,

There is a lot around the web on this subject, but I have recently pulled a lot together and written clear example code. You can see the updated page on the http://ArduinoInfo.Info WIKI here:
http://arduino-info.wikispaces.com/Brick-Temperature-DS18B20

I have a utility sketch that you can use to get the internal serial number (Device Address) on DS18B20's that you have.  Then you can use those addresses in the code for multiple temperature sensors on one wire. This is important so you can know "which sensor is which" in a bus environment. You can see that info here:
http://arduino-info.wikispaces.com/Brick-Temperature-DS18B20#mult

I will have an example running in a day or two which displays and graphs inside and outside temperatures on KSduino.org
Regards, Terry King terry@yourduino.com  - Check great prices, devices and Arduino-related boards at http://YourDuino.com
HOW-TO: http://ArduinoInfo.Info

rbatriu

Great tutorial. I could setup my arduino to read temperatures from two sensors easily.

Thanks!

curnow

#2
Aug 23, 2013, 07:13 am Last Edit: Jul 07, 2014, 07:53 pm by robtillaart Reason: 1
G'Day Gang,
I seem to be having trouble finding the addresses of 2 DS18B20 temp probes. I have them set up on a bread board with a 4.7k pull up
resister.
I am using this sketch.

Code: [Select]

/* YourDuino Example: Find Address of a DS18B20 Temperature Sensor
Cut and paste the address to a text file for later use.
V1.1 01/17/2013
Questions: terry@yourduino.com

Connections:
DS18B20 Pinout (Left to Right, pins down, flat side toward you)
- Left   = Ground
- Center = Signal (Pin 2):  (with 3.3K to 4.7K resistor to +5 or 3.3 )
- Right  = +5 or +3.3 V  
This sketch looks for 1-wire devices and  prints their addresses (serial number)
to the Serial Monitor in a format that is useful in Arduino sketches.
Based on example at:
http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html
*/

/*-----( Import needed libraries )-----*/
#include <OneWire.h>

/*-----( Declare Constants and Pin Numbers )-----*/
#define SENSOR_PIN 2  // Any pin 2 to 12 (not 13) and A0 to A5

/*-----( Declare objects )-----*/
OneWire  ourBus(SENSOR_PIN);  // Create a 1-wire object

void setup()  /****** SETUP: RUNS ONCE ******/
{
 Serial.begin(9600);

 discoverOneWireDevices();  // Everything happens here!
}//--(end setup )---

void loop()   /****** LOOP: RUNS CONSTANTLY ******/
{
 // Nothing happening here
}

/*-----( Declare User-written Functions )-----*/
void discoverOneWireDevices(void) {
 byte i;
 byte present = 0;
 byte data[12];
 byte addr[8];

 Serial.print("Looking for 1-Wire devices...\n\r");// "\n\r" is NewLine
 while(ourBus.search(addr)) {
   Serial.print("\n\r\n\rFound \'1-Wire\' device with address:\n\r");
   for( i = 0; i < 8; i++) {
     Serial.print("0x");
     if (addr[i] < 16) {
       Serial.print('0');
     }
     Serial.print(addr[i], HEX);
     if (i < 7) {
       Serial.print(", ");
     }
   }
   if ( OneWire::crc8( addr, 7) != addr[7]) {
     Serial.print("CRC is not valid!\n\r");
     return;
   }
 }
 Serial.println();
 Serial.print("Done");
 ourBus.reset_search();
 return;
}

//*********( THE END )***********


The sketch compiles ok and uploads fine.
When I open the serial monitor I get

"[font=Verdana]Looking for 1-Wire devices...


Done[/font]"

and no device addresses.
I have checked and rechecked pin numbers and connections but still no joy.
Any ideas pls

Cheers
Dennis

moderator added code tags:

Nick_Pyner



The sketch compiles ok and uploads fine.
When I open the serial monitor I get

"Looking for 1-Wire devices...
Done"

and no device addresses.
I have checked and rechecked pin numbers and connections but still no joy.
Any ideas pls

Cheers
Dennis


It might just be the order of events in the code. This isn't much different, but it works.

Code: [Select]
// http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html

#include <OneWire.h>

OneWire  ds(3);  // Connect your 1-wire device to pin 3

void setup(void) {
  Serial.begin(9600);
  discoverOneWireDevices();
}

void discoverOneWireDevices(void) {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
 
  Serial.print("Looking for 1-Wire devices...\n\r");
  while(ds.search(addr)) {
    Serial.print("\n\rFound \'1-Wire\' device with address:\n\r");

    for( i = 0; i < 8; i++) {
      Serial.print("0x");
      if (addr[i] < 16) {
        Serial.print('0');
      }
      Serial.print(addr[i], HEX);

      if (i < 7) {
        Serial.print(", ");
      }
    }
    if ( OneWire::crc8( addr, 7) != addr[7]) {
        Serial.print("CRC is not valid!\n");
        return;
    }
  }
  Serial.print("\n\r\n\rThat's it.\r\n");
  ds.reset_search();
  return;
}

void loop(void) {
  // nothing to see here
}

marcusdeans

#4
Feb 01, 2014, 09:21 pm Last Edit: Feb 01, 2014, 10:37 pm by marcusdeans Reason: 1
Another solution is to repeatedly click the 'reset' button on your Arduino. You normally have to click it at least once for the program to work.

Hello,

I had the same problem recently, using the Hacktronics 1-Wire Address Finder. It ended up that the resistor was not placed in the right spot, connecting power and signal. I used a 10k ohm resistor in place of the 4.7k, as that was all I had at the time. It seems to work alright now, reading the same temperature as my analog manual thermometers. I located the address perfectly but when I loaded the multiple-sensor code, with the correct addresses, it failed. I used the bildr guide which can only use 1 temperature sensor. However, a member posted a code with capability for multiple sensors in the code, which solved my problems.

Following is the 1-Wire Address Finder
Code: [Select]
// This sketch looks for 1-wire devices and
// prints their addresses (serial number) to
// the UART, in a format that is useful in Arduino sketches
// Tutorial:
// http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html

#include <OneWire.h>

OneWire  ds(3);  // Connect your 1-wire device to pin 3

void setup(void) {
 Serial.begin(9600);
 discoverOneWireDevices();
}

void discoverOneWireDevices(void) {
 byte i;
 byte present = 0;
 byte data[12];
 byte addr[8];
 
 Serial.print("Looking for 1-Wire devices...\n\r");
 while(ds.search(addr)) {
   Serial.print("\n\rFound \'1-Wire\' device with address:\n\r");
   for( i = 0; i < 8; i++) {
     Serial.print("0x");
     if (addr[i] < 16) {
       Serial.print('0');
     }
     Serial.print(addr[i], HEX);
     if (i < 7) {
       Serial.print(", ");
     }
   }
   if ( OneWire::crc8( addr, 7) != addr[7]) {
       Serial.print("CRC is not valid!\n");
       return;
   }
 }
 Serial.print("\n\r\n\rThat's it.\r\n");
 ds.reset_search();
 return;
}

void loop(void) {
 // nothing to see here
}



And here is the 'comment' code I am using currently
Code: [Select]
#include <OneWire.h>

int DS18S20_Pin = 4; //DS18S20 Signal pin on digital 4

//Temperature chip i/o
OneWire ds(DS18S20_Pin); // on digital pin 4

void setup(void) {
Serial.begin(9600);
}

void loop(void) {
float temperature = getTemp();
Serial.print ("The inside temperature in Degrees Celsius is:") ;
Serial.println(temperature);

delay(1000); //just here to slow down the output so it is easier to read

}


float getTemp(){
//returns the temperature from one DS18S20 in DEG Celsius

byte data[12];
byte addr[8];

if ( !ds.search(addr)) {
  //no more sensors on chain, reset search
  ds.reset_search();
  return -1000;
}

if ( OneWire::crc8( addr, 7) != addr[7]) {
  Serial.println("CRC is not valid!");
  return -1000;
}

if ( addr[0] != 0x10 && addr[0] != 0x28) {
  Serial.print("Device is not recognized");
  return -1000;
}

ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end

byte present = ds.reset();
ds.select(addr);  
ds.write(0xBE); // Read Scratchpad


for (int i = 0; i < 9; i++) { // we need 9 bytes
 data[i] = ds.read();
}

ds.reset_search();

byte MSB = data[1];
byte LSB = data[0];

float tempRead = ((MSB << 8) | LSB); //using two's compliment
float TemperatureSum = tempRead / 16;

return TemperatureSum;

}

Cheers,
Mark
Arduino is awesome! :)

Go Up