DS18B20: Difference between revisions
No edit summary |
(No difference)
|
Latest revision as of 2016-08-19T09:32:17
The DS18B20 is a temperature sensor by Maxim Integrated (previously Dallas Semiconductor) with digital output suitable for directly connecting to a digital controller. There are three pins: VDD for connecting the supply voltage, which must be between 3 and 5.5 V, DQ for connecting a controller that programs the sensor and reads the temperature values, and finally, GND for ground. DQ must also be connected to the supply voltage via a 4.7 kΩ pull-up resistor.
Operating with an Arduino
The DallasTemperature software library by Miles Burton handles both the 1-Wire protocol for communicating with 1-Wire devices as well as the specifics of getting temperature data from the DS18B20. You can install the library via the Arduino IDE.
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWire(9); // using digital I/O #9
DallasTemperature sensors(&oneWire);
DeviceAddress thermometer;
void setup()
{
Serial.begin(9600);
sensors.begin();
sensors.getAddress(thermometer, 0);
sensors.setResolution(thermometer, 12);
}
void loop()
{
static unsigned long sensortime = 0;
unsigned long now = millis();
if(sensortime < now)
{
sensortime = now + 60000l; // schedule next readout for 60 seconds later
sensors.requestTemperatures();
float temperature = sensors.getTempC(thermometer); // read temperature in Celsius
temperature = round(10.0*temperature)/10.0;
Serial.print("temperature at ");
Serial.print(now / 1000 / 60);
Serial.print(" minutes after launch: ");
Serial.println(temperature, 1); // show only 1 place after the decimal
}
else
{
delay(2000); // pause for 2 seconds
}
}
Operating with a Raspberry Pi
To set up 1-Wire data communication on a certain pin you need to edit /boot/config.txt and add the line
dtoverlay=w1-gpio,gpiopin=4,pullup=on
where we assume that the DQ pin of the sensor is connected to GPIO4, which is header pin #7. In order for the system to load the kernel modules for 1-Wire communication and for communicating with 1-Wire temperature sensors we edit /etc/modules by adding the following two lines:
w1-gpio pullup=1 w1-therm
The kernel module w1-therm creates a new folder under /sys/bus/w1/devices and the device file w1_slave inside the folder. The device file contains the last reading from the sensor and the folder name is the ID of the 1-Wire device. We use this ID in the Python program below, which periodically reads the sensor data.
#!/usr/bin/python
import re, os, time, datetime
import RPi.GPIO as GPIO
pin_temp_sensor = 12 # corresponds to GPIO18 of SOC
sensorid = "28-000007351a0d" # This ID is specific to the device!!!
def readTemperature(path):
temperature = None
try:
GPIO.output(pin_temp_sensor, GPIO.LOW)
f = open(path, "r")
line = f.readline()
if re.match(r"([0-9a-f]{2} ){9}: crc=[0-9a-f]{2} YES", line):
line = f.readline()
m = re.match(r"([0-9a-f]{2} ){9}t=([+-]?[0-9]+)", line)
if m:
temperature = float(m.group(2))/1000
f.close()
except IOError:
print("sensor error")
return temperature
if __name__ == '__main__':
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(pin_temp_sensor, GPIO.OUT)
deviceFilePath = "/sys/bus/w1/devices/%s/w1_slave" % sensorid # sensorid is the folder name
nextUpdateTime = datetime.datetime.min
while True:
now = datetime.datetime.now()
if nextUpdateTime < now:
nextUpdateTime = now + datetime.timedelta(minutes=1)
t = readTemperature(deviceFilePath)
if t != None:
print("the temperature at " + now.strftime("%H:%M") + " is %.1f" % t)
time.sleep(2)