De DS18B20 is een zogenaamde 1-wire digitale temperatuur sensor die temperaturen kan meten tussen de -55°C en +125°C. In dit stappenplan gaan we gebruik maken van de waterdichte temperatuursensor. De DS18B20 is een Dallas one-wire device, dat wil zeggen dat input en output over dezelfde pin gaan zodat je tot 127 devices kan aansluiten op dezelfde pin.
De waterdichte versie kun je gebruiken voor het meten van vloeistoffen, handig om bijvoorbeeld de temperatuur van het aquarium te meten. De sensor aansluiten en uitlezen is vrij simpel, volg het onderstaande stappenplan.
Componenten voor dit project
• Waterdicht DS18B20 temperatuursensor (link)
• 4.7K Weerstand (link)
• Dupont verbindingkabels female/female (link)
Totale kosten van de componenten ~ € 1,50
Raspberry Pi Zero, Raspberry Pi 2, Raspberry Pi 3
Raspbian Jessie (2016-11-25 kernel 4.4)
Aansluitschema DS18B20 temperatuursensor
DS18B20 | RPI functie | RPI pin |
---|---|---|
Rood | VCC 3.3V | 1 |
Zwart | GND | 6 |
Geel of Wit (DATA) | GPIO #4 | 7 |
Plaats tussen DATA en VCC 3v3 een weerstand van ~4.7K-10K.
Activeer One Wire GPIO
Standaard is het W1 protocol niet geactiveerd op de Raspberry Pi, deze moeten we activeren met behulp van een dtoveray in het config.txt bestand van Raspbian.
sudo nano /boot/config.txt
Voeg onderaan het bestand de onderstaande regel toe:
dtoverlay=w1-gpio
Herstart hierna de Raspberry Pi:
sudo reboot -h 0
Werking DS18B20 testen
Activeer ‘one-wire’ op GPIO #4 met de onderstaande twee commando’s:
sudo modprobe w1-gpio sudo modprobe w1-therm
Controleer de werking van de DS18B20 sensor, ga naar de map:
cd /sys/bus/w1/devices
Toon de inhoud van de map:
ls
Als de temperatuursensor is herkend zie je een map die begint met 28-xxxxxx, ga naar deze map:
cd 28-xxxxxx
Gebruik het onderstaande commando om de ruwe sensorwaarden uit te uitlezen, de waarde t=
laat de gemeten temperatuur zien.
cat w1_slave
In het bovenstaande screenshot is de gemeten temperatuur: t=21125 (21.125ºC)
DS18B20 uitlezen met pythonscript
Natuurlijk willen we ook via Python de temperatuur kunnen uitlezen, hiervoor kun je onderstaande script gebruiken. Het script laat de huidige temperatuur zien inclusief drie cijfers achter de komma.
#!/usr/bin/env python | |
# DS18B20 waterdichte temperatuur sensor aansluiten op Raspberry Pi | |
# https://raspberrytips.nl/ds18b20-raspberry-pi/ | |
import os | |
import glob | |
import time | |
os.system('modprobe w1-gpio') | |
os.system('modprobe w1-therm') | |
base_dir = '/sys/bus/w1/devices/' | |
device_folder = glob.glob(base_dir + '28*')[0] | |
device_file = device_folder + '/w1_slave' | |
def read_temp_raw(): | |
f = open(device_file, 'r') | |
lines = f.readlines() | |
f.close() | |
return lines | |
def read_temp(): | |
lines = read_temp_raw() | |
while lines[0].strip()[-3:] != 'YES': | |
time.sleep(0.2) | |
lines = read_temp_raw() | |
equals_pos = lines[1].find('t=') | |
if equals_pos != -1: | |
temp_string = lines[1][equals_pos+2:] | |
temp_c = float(temp_string) / 1000.0 | |
return temp_c | |
while True: | |
print(read_temp()) | |
time.sleep(1) |
Het script kun je downloaden naar je Raspberry Pi met behulp van het commando.
wget https://raspberrytips.nl/ds18b20.py
Start het script met:
python ds18b20.py
Het resultaat zal zijn dat om de seconde een meeting plaats zal vinden en dat de gemeten temperatuur wordt weergegeven in het scherm.
Wil je de temperatuur minder nauwkeurig weergeven bijvoorbeeld tot op een tiende (21.1) wijzig dan de volgende regel in het script:
temp_c = float(temp_string) / 1000.0
Door het toevoegen van round
wordt het getal afgerond op x cijfers achter de comma, wil je twee cijfers achter de comma verander dan 1 in 2).
temp_c = round (float(temp_string) / 1000.0, 1)
Met 1 regel in bash gaat het ook:
grep t= /sys/bus/w1/devices/28-*/w1_slave |awk -F= ‘{ print $2/1000 }’
Als je > 1 meter hebt vul dan bij 28-* jouw thermometer in.
Mijn Raspberry wilt niet opstarten zodra ik de temperatuur sensor erop aansluit.
Heeft iemand hier nogmeer last van?
het 1-wire protocol kan ook in raspi-config aan gezet worden
Leuk man, goeie tutorial, werkt in 1 keer!