Raspberry Pi LCD Temperature Display using DS18B20

IMG_0263

I have a Raspberry Pi with a 16×2 RGB LCD and plastic case.  I felt like getting it to measure and display an accurate temperature on the LCD.  Later I will add a webserver to graph the data.

UPDATE: The new version of Raspbian ships with a 3.18 kernel, that uses device trees.  See this new post for updated commands to remap the GPIO.

Hardware configuration

My LCD already plugs onto the GPIO header and takes up the whole header (for mechanical support) even though it only uses a couple of pins for I2C communication.  Fortunately, the Model B has a second GPIO header next to the main one called P5, and we can easily solder some wires to this header
http://elinux.org/Rpi_Low-level_peripherals#P5_header

My waterproof DS18B20 has red (Vdd), white (data) and black (ground) wires although the colours often change.  The pinout for P5 header will therefore be:

Pin 2 – 3.3V (red wire)
Pin 6 – GPIO31 (white wire)
Pin 8 – GND (black wire)
Additionally there needs to be a 4.7k resistor between the signal and Vdd wires as per the DS18B20 datasheet


IMG_0254

I then hot glued the wire to the PCB in 2 places to provide a measure of strain relief, and re-assembled my Pi.  Since I’m not using the HDMI connector, it was a convenient place to route the sensor cable:

IMG_0257

IMG_0259

Software Configuration

The Pi uses GPIO4 as the default pin for the 1 wire bus, so I needed to change it.  I have connected my sensor to GPIO31.  We have to tell the Pi’s CPU

I appended the following string to /boot/cmdline.txt

bcm2708.w1_gpio_pin=31

and added the following lines to /etc/modules

w1-gpio
w1-therm
w1-gpio-custom bus0=0,31,0

After a reboot of the Pi I could see the temperature device

# ls /sys/bus/w1/devices/
28-00043b739cff w1_bus_master1

The first device (starting “28-“) is my temperature sensor’s unique address.

# cat /sys/bus/w1/devices/28-00043b739cff/w1_slave
 81 01 55 00 7f ff 0c 10 19 : crc=19 YES
 81 01 55 00 7f ff 0c 10 19 t=24062

Temperature is 24.062 degrees!

I used Timo Furrer’s W1ThermSensor python library to write a script to display the values on an LCD, since I was already using Adafruit’s Python library for the LCD.

git clone https://github.com/timofurrer/w1thermsensor.git && cd w1thermsensor
python setup.py install

pip install w1thermsensor

The following python script will show the current temperature and max/min in the last hour.  The custom characters (up and down arrows) are defined as bitmaps and referred to using the ‘\x’ escape sequence

#!/usr/bin/python

# Import all the libraries
from Adafruit_CharLCDPlate import Adafruit_CharLCDPlate
from w1thermsensor import W1ThermSensor
import time

# Sample/Refresh time in seconds
refresh = 60

# Temperature history in values (history duration will be samples * refresh)
samples = 60

# Define and initialise the LCD
lcd = Adafruit_CharLCDPlate()

lcd.begin(16,1)
lcd.backlight(lcd.RED)
lcd.message("PiTemp!")

# degree symbol
lcd.createChar(1, [0b01100,
 0b10010,
 0b10010,
 0b01100,
 0b00000,
 0b00000,
 0b00000,
 0b00000])
# Diagonal up arrow
lcd.createChar(2, [0b00000,
 0b01111,
 0b00011,
 0b00101,
 0b01001,
 0b10000,
 0b00000,
 0b00000])
# Diagonal down arrow
lcd.createChar(3, [0b00000,
 0b10000,
 0b01001,
 0b00101,
 0b00011,
 0b01111,
 0b00000,
 0b00000])


# Define the temperature sensor
sensor = W1ThermSensor()

# Set up the history array
temp = sensor.get_temperature()
templist = [temp] * samples

try:
 while True:
 # Shift out the oldest temperature value
 for x in range(len(templist)-1):
 templist[x] = templist[x+1]
 # Set the end item to be our current temperature
 templist[len(templist)-1] = sensor.get_temperature()
 # Uncomment the following line for debugging
 #print "max %.2f min %.2f\n" % (max(templist),min(templist))

 # Display it on the LCD
 lcd.clear()
 lcd.message("""Temp %.2f \x01C\n\x02 %.2f \x03 %.2f""" %
 (templist[len(templist)-1],max(templist),min(templist)))

 # Sleep until we need to sample/refresh
 time.sleep(refresh)

except KeyboardInterrupt:
 print "Interrupted!\n"


lcd.clear()
lcd.message("PiTemp finished")

Final result:

IMG_0263

Loading

One thought on “Raspberry Pi LCD Temperature Display using DS18B20

  1. Pingback: Raspberry Pi Webcam (Fishcam) | Scribblings of an Engineer

Comments are closed.