Go Down

Topic: Trouble with DS18S20 sensors (Read 1 time) previous topic - next topic

DJS

Mar 06, 2010, 02:15 pm Last Edit: Mar 06, 2010, 08:37 pm by SC Reason: 1
Hello!

I have some trouble with  DS 18S20 sensors and the  Arduino -

The Problem:

I have 9 DS18S20 sensors connected to a converter and I use digitemp to read them (No parasite mode because of higher temperatures) - Works absolutly fine. No problems.

I have an arduino with 2 DS1820 on a board (Also No parasite mode, and a  4K7 resistor (+5 - DATA)) - works fine too

When I try to add the 9 sensors to the arduino - it will see none of them not even the 2.

Maybe the resistor is the problem ?  

Hope that somebody can help me.

DJ






ArduinoM

Seems to me that more people have had this problem in the past
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1266716721/4
It is unresolved there or solution not posted :(

Found on
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?action=print;num=1161557194

the code used:
Code: [Select]

/* DS18S20P Temperature chip i/o
* ---------------
*
* See http://pdfserv.maxim-ic.com/en/ds/DS1820-DS1820S.pdf for the datasheet.
*
* (copyleft) 2006 by Derek Yerger - Free to distribute freely.
* (sorry Derek, great inspiration but I rewrote it completely)
*  heavily modified by bigengineer
* inspired by: http://microsyl.com/
* and Dallas 1-wire datasheets
*
*/
#define DQ 7  //data pin
#define PU 6  //separate pin for pull up
#define pin13 13
#define VERSION 01

void setup(void)
{
// initialize inputs/outputs
// start serial port
pinMode(DQ,INPUT);
pinMode(PU,INPUT);
pinHigh();
Serial.begin(9600);
}
byte reset()
{
pinLow();
delayMicroseconds(500);
pinIn();
delayMicroseconds(70);
if (digitalRead(DQ) == LOW)
{
  delayMicroseconds(500);
  return(1);
}
return(0);
}
void WriteByte(byte data)
{
byte i;
for(i=0;i<=7;i++)
{
  pinLow();
  if (data & 0x01) //write 1
  {
    delayMicroseconds(7);
    pinIn();
    delayMicroseconds(70);      
  }
  else //write 0
  {
    delayMicroseconds(70);
    pinIn();
    delayMicroseconds(7);
  }
  data>>=1;
}
}
void convertTemp()
{
byte i;
byte data = 0x44;

for(i=0;i<=7;i++)
{
  pinLow();
  if (data & 0x01) //write 1
  {
    delayMicroseconds(7);
    pinIn();
    delayMicroseconds(70);      
  }
  else //write 0
  {
    delayMicroseconds(70);
    pinIn();
    delayMicroseconds(7);
  }
  data>>=1;
}
pullupHigh(); //pull pin 6 high for the conversion
delay(750); //conversion time is 750 milliseconds
pullupIn(); //switch off pin 6
pinIn();
}
byte readByte()
{
/* timing is critical here. But timing values are different
 * from the datasheets. These values are found by trial & error.
 * The delay's should be somewhere around 15 uS.
 */
byte data=0;
byte i;
byte bit;
for(i=0;i<8;i++)
{
  pinLow();
  delayMicroseconds(1); // > 2 doesn't work
  pinIn();
  delayMicroseconds(1); // >5 doesn't work
  bit = digitalRead(DQ) & 0x01;
  data >>= 1;
  if (bit) data |= 0x80;
  delayMicroseconds(50); //doesn't seem to be necessary
}
return(data);
}

void pinHigh()
{
pinMode(DQ,OUTPUT);
digitalWrite(DQ,HIGH);
}
void pinLow()
{
pinMode(DQ,OUTPUT);
digitalWrite(DQ,LOW);
}
void pinIn()
{
pinMode(DQ,INPUT);
//pullupIn(); //om de resistor pull-up te laten werken
}

void pullupHigh()
{
pinMode(PU,OUTPUT);
digitalWrite(PU,HIGH);
digitalWrite(pin13, HIGH);
}
void pullupLow()
{
pinMode(PU,OUTPUT);
digitalWrite(PU,LOW);
digitalWrite(pin13, LOW);
}
void pullupIn()
{
pinMode(PU,INPUT); //necessary for resistor pull-up
digitalWrite(pin13, LOW);
}

void readRom()
{
byte j;
byte pad[9];

reset();
WriteByte(0x33);
for(j=0;j<8;j++)
{
  pad[j] = readByte();
}
for(j=0;j<8;j++)
{
  Serial.print(pad[j], HEX);
  Serial.print(" ");
}
Serial.println("read rom");
}
void readScratchpad()
{
byte j;
byte pad[9];
int msb,lsb;

WriteByte(0xBE);
for(j=0;j<9;j++)
{
  pad[j] = readByte();
}
for(j=0;j<9;j++)
{
  Serial.print(pad[j], HEX);
  Serial.print(" ");
}
Serial.print("read scratchpad  ");
msb = pad[1];
lsb = pad[0];
if (msb <= 0x80)lsb = lsb/2;
msb = msb & 0x80;
if (msb >=0x80) lsb = (~lsb)+1;
if (msb >=0x80) lsb = lsb/2;
if (msb >=0x80) lsb = ((-1)*lsb);
Serial.print("T =  ");
Serial.print(lsb);
Serial.print(" ");
 
}
void loop(void)
{
readRom();
reset();
WriteByte(0xCC);
convertTemp();
reset();
WriteByte(0xCC);
readScratchpad();
Serial.print("version: ");
Serial.println(VERSION);
 delay(1000);                 // Lets not flood.
}


Please read the whole post,as there are code improvements suggestions

David

DJS

#2
Mar 06, 2010, 06:37 pm Last Edit: Mar 07, 2010, 02:51 pm by SC Reason: 1
Hi David,

thanks for your help. Indded that semms to be a bigger problem with this 18S20. Nevertheless I´m happy that they wotk fine with the Selfmade-Converter and the digitemp Prg. So I knew tht the things are working well and not dead.

Maybe it could be a solution to have a closer look to this converter and to the digitemp program to find a solution for the arduino too

http://www.digitemp.com/

http://public.rz.fh-wolfenbuettel.de/~hamannm/general/digitempd.html




So it works as long as I use 2 of this with the arduino

Ground ---- Ground
Data    -----  Pin 2
VDD   ------- +5 V

and also a 4K7 Resistor between  Data and +5V


Meanwhile I found this info:

Note on resistors: For larger networks, try something smaller. The ATmega328/168 datasheet indicates starting at 1k6 and a number of users have found smaller to work better on larger networks.

here:

http://www.arduino.cc/playground/Learning/OneWire

which means would be the resistor.

Dirk


Edit: Sun 07.02.2010

I changed the resistor from 4K7 to 1K0 and only one  still makes problems (-127 Degrees C)  (The sensor is ok - no prob with  digitemp). Maybe 1 K are still to much.




DJS

Has someone used this with the Arduino and DS18S20 as explained in appendix A ?

http://pdfserv.maxim-ic.com/en/an/AN148.pdf


DJS

#4
Mar 08, 2010, 07:21 pm Last Edit: Mar 08, 2010, 07:26 pm by SC Reason: 1
And another interesting Advanced 1-Wire Network Driver schematic by Maxim

http://pdfserv.maxim-ic.com/en/an/AN244.pdf

Would be great if someone could add an Arduino and a DS18S20  to this, so that it would be easier to understand this.

http://pdfserv.maxim-ic.com/en/an/AN4206.pdf

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy