Ruben Laguna’s blog

Arduino and DS1620 Digital Temperature Sensor

I received a couple of Arduinos Diecimilla that I bought from Libelium.

My first project with Arduino has been interfacing with DS1620 digital temperature sensor.

Picture 17

It was really easy it just a matter of connecting pin 3, 4 and 5 on the Arduino to RST, CLK and DQ on the DS1620. The source code in this post will read the temperature from the DS1620 using the 3 wire interface and it will output the result to the serial interface in the Arduino.

IMG_0329

I mostly use the information of PC Parallel Port Interfacing with DS1620 Digital Thermometer / Thermostat page to learn how to interface to this thermometer and the information on the SerialPortExample page to learn how to output to the serial port.

The DS1620 measures temperatures from -55°C to +125°C
in 0.5°C increments. As you can see in the code reading a DS1620 sensor is way more complicated than reading an analog LM35 temperature sensor (and the LM35 gives you more precision and also takes one pin instead of three) so probably is a LM35 is a better option if you want an easy way to get the temperature in your arduino project.

Source code (gist):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
<span class='line'>/*
</span><span class='line'>  DS160 example
</span><span class='line'>
</span><span class='line'>  Reading temperature from DS1620 digital temperature sensor 
</span><span class='line'>  and showing the result via serial interface.
</span><span class='line'>  
</span><span class='line'>  
</span><span class='line'>  Arduino    DS1620
</span><span class='line'>  pin 3  ->    RST
</span><span class='line'>  pin 4  ->    CLK
</span><span class='line'>  pin 5  ->    DQ
</span><span class='line'>  
</span><span class='line'>  by Ruben Laguna
</span><span class='line'>  based on examples from Tom Tigoe &lt;http://www.arduino.cc/en/Reference/SoftwareSerialExample>
</span><span class='line'>  and phanderson &lt;http://www.phanderson.com/printer/ds1620/ds1620.html>
</span><span class='line'>  written: 30 Aug 2008
</span><span class='line'>  
</span><span class='line'>
</span><span class='line'>*/
</span><span class='line'>
</span><span class='line'>// include the SoftwareSerial library so you can use its functions:
</span><span class='line'>#include &lt;SoftwareSerial.h>
</span><span class='line'>
</span><span class='line'>#define rxPin 0
</span><span class='line'>#define txPin 1
</span><span class='line'>#define ledPin 13
</span><span class='line'>#define buttonPin 2
</span><span class='line'>
</span><span class='line'>#define rstPin 3
</span><span class='line'>#define clkPin 4
</span><span class='line'>#define dqPin 5
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>// set up a new serial port
</span><span class='line'>SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
</span><span class='line'>byte pinState = 0;
</span><span class='line'>
</span><span class='line'>void setup()  {
</span><span class='line'>  // define pin modes for tx, rx, led pins:
</span><span class='line'>  pinMode(rxPin, INPUT);
</span><span class='line'>  pinMode(txPin, OUTPUT);
</span><span class='line'>  pinMode(buttonPin, INPUT);
</span><span class='line'>  pinMode(ledPin, OUTPUT);
</span><span class='line'>  pinMode(rstPin, OUTPUT);
</span><span class='line'>  pinMode(clkPin, OUTPUT);
</span><span class='line'>  pinMode(dqPin, OUTPUT);
</span><span class='line'>  
</span><span class='line'>  // set the data rate for the SoftwareSerial port
</span><span class='line'>  mySerial.begin(9600);
</span><span class='line'>}
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>void loop() {
</span><span class='line'>  int val = digitalRead(buttonPin);
</span><span class='line'>        
</span><span class='line'>    rst_low();
</span><span class='line'>    
</span><span class='line'>    clk_high();
</span><span class='line'>    rst_high(); //all data transfer are initiated by driving RST high
</span><span class='line'>    write_command(0x0c); // write config command
</span><span class='line'>    write_command(0x02); // cpu mode
</span><span class='line'>    rst_low();
</span><span class='line'>    delay(200); //wait until the configuration register is written 
</span><span class='line'>    
</span><span class='line'>    clk_high();
</span><span class='line'>    rst_high();
</span><span class='line'>    write_command(0xEE); //start conversion
</span><span class='line'>    rst_low();
</span><span class='line'>    delay(200);
</span><span class='line'>   
</span><span class='line'>    clk_high();
</span><span class='line'>    rst_high();
</span><span class='line'>    write_command(0xAA);
</span><span class='line'>    int raw_data = read_raw_data();
</span><span class='line'>    rst_low();
</span><span class='line'>    
</span><span class='line'>    mySerial.print("temperature:");
</span><span class='line'>    mySerial.print(raw_data/2);
</span><span class='line'>    mySerial.println(" C");
</span><span class='line'>    
</span><span class='line'>    
</span><span class='line'>    delay(100);
</span><span class='line'>  
</span><span class='line'>  
</span><span class='line'>  // toggle an LED just so you see the thing's alive.  
</span><span class='line'>  
</span><span class='line'>  toggle(13);
</span><span class='line'>
</span><span class='line'>}
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>void toggle(int pinNum) {
</span><span class='line'>  // set the LED pin using the pinState variable:
</span><span class='line'>  digitalWrite(pinNum, pinState); 
</span><span class='line'>  // if pinState = 0, set it to 1, and vice versa:
</span><span class='line'>  pinState = !pinState;
</span><span class='line'>}
</span><span class='line'>
</span><span class='line'>void write_command(int command)
</span><span class='line'>/* sends 8 bit command on DQ output, least sig bit first */ 
</span><span class='line'>{
</span><span class='line'>  int n, bit;
</span><span class='line'>  
</span><span class='line'>  for(n=0;n&lt;8;n++)
</span><span class='line'>  {
</span><span class='line'>    bit = ((command >> n) & (0x01));
</span><span class='line'>    out_bit(bit);
</span><span class='line'>  }
</span><span class='line'>}
</span><span class='line'>
</span><span class='line'>int read_raw_data(void)
</span><span class='line'>{
</span><span class='line'>  int bit,n;
</span><span class='line'>  int raw_data=0;
</span><span class='line'>
</span><span class='line'>  pinMode(dqPin,INPUT);
</span><span class='line'>  
</span><span class='line'>     /* jam the dq lead high to use as input */
</span><span class='line'>  for(n=0;n&lt;9;n++)
</span><span class='line'>  {
</span><span class='line'>     clk_low();
</span><span class='line'>     bit=(digitalRead(dqPin));
</span><span class='line'>     clk_high();
</span><span class='line'>     raw_data = raw_data | (bit &lt;&lt;  n);
</span><span class='line'>  }
</span><span class='line'>  pinMode(dqPin, OUTPUT);
</span><span class='line'>  return(raw_data);
</span><span class='line'>}
</span><span class='line'>
</span><span class='line'>void out_bit(int bit) 
</span><span class='line'>{
</span><span class='line'>  digitalWrite(dqPin, bit);  /* set up the data */
</span><span class='line'>  clk_low();             /* and then provide a clock pulse */   
</span><span class='line'>  clk_high();
</span><span class='line'>}
</span><span class='line'>
</span><span class='line'>void clk_high(void)
</span><span class='line'>{
</span><span class='line'>  digitalWrite(clkPin,HIGH);
</span><span class='line'>}
</span><span class='line'>
</span><span class='line'>void clk_low(void)
</span><span class='line'>{
</span><span class='line'>  digitalWrite(clkPin,LOW);
</span><span class='line'>}
</span><span class='line'>
</span><span class='line'>void rst_high(void)
</span><span class='line'>{
</span><span class='line'>   digitalWrite(rstPin,HIGH);
</span><span class='line'>}
</span><span class='line'>
</span><span class='line'>void rst_low(void)
</span><span class='line'>{
</span><span class='line'>   digitalWrite(rstPin,LOW);
</span><span class='line'>}</span>

Comments

Copyright © 2015 - Ruben Laguna - Powered by Octopress