I made a simple HAT (Hardware Attached on Top) for the Raspberry Pi to read multiple DS18B20 temperature sensors — it was surprisingly easy. I used the measured temperatures to control a fan using Home Assistant.
Table of contents
First test
I started testing with a single DS18B20 break-out board.
First we need to do a couple of things on the Pi:
- Enable 1-wire communication with
raspi-config
- Install python package
sudo apt install python3-w1thermsensor
Now — let’s try to list the connected 1-wire devices:
$ ls /sys/bus/w1/devices/
28-0416a02b0eff w1_bus_master1
Alright, we have one device! Now to read the temperature:
$ cat /sys/bus/w1/devices/28-0416a02b0eff/w1_slave
8e 01 4b 46 7f ff 0c 10 de : crc=de YES
8e 01 4b 46 7f ff 0c 10 de t=24875
24875
= 24.875°C
Sweet! 😄
Making the HAT
To make something more permanent — I used a 30×70 mm prototyping perfboard, schematic diagram and parts list below.
On the underside I attached a female pin-header for the Raspberry Pi GPIO ports.
And on the top; five 3-pin male pin-headers for DS18B20 temperature sensors, and a 10k pull-up resistor. All the 3-pin male pin-headers are connected in series.
Only three pins are needed to connect to the Raspberry Pi; VDD (5V), GND and GPIO4 (1-wire). I’m using a 20-pin header because it makes the HAT attach more firmly.
I connected a couple more DS18B20 temperature sensors and listed their IDs:
$ ls /sys/bus/w1/devices/
28-0416a02b0eff 28-0517021db9ff 28-051702869eff w1_bus_master1
Reading the sensors
To read the sensor values I made a tiny python script.
- Source code is available in a git repository:
- https://github.com/thomasjsn/rpi-w1therm
It reads each sensor every 15 seconds and publishes the measurements over MQTT, it also calculates the average of all the connected sensors and publishes that.
See it in action here:
Home Assistant
My Home Assistant subscribes to the temperature measurements over MQTT, and I use the average temperature from all sensors to control the home office exhaust fan.
Sensor configuration
sensor:
- platform: mqtt
state_topic: 'sensor/office/temp/above_rack'
availability_topic: "sensor/office/temp/above_rack/status"
name: 'Office ceiling above rack'
unit_of_measurement: '°C'
- platform: mqtt
state_topic: 'sensor/office/temp/above_desk'
availability_topic: "sensor/office/temp/above_desk/status"
name: 'Office ceiling above desk'
unit_of_measurement: '°C'
- platform: mqtt
state_topic: 'sensor/office/temp/room_center'
availability_topic: "sensor/office/temp/room_center/status"
name: 'Office ceiling center'
unit_of_measurement: '°C'
- platform: mqtt
state_topic: 'sensor/office/temp/average'
name: office_temp_average
unit_of_measurement: '°C'
Fan automation
- alias: Fan on auto
trigger:
platform: numeric_state
entity_id: sensor.office_temp_average
above: 25
action:
service: switch.turn_on
entity_id: switch.office_fan
- alias: Fan off auto
trigger:
platform: numeric_state
entity_id: sensor.office_temp_average
below: 24
for:
minutes: 5
action:
service: switch.turn_off
entity_id: switch.office_fan
Schematic diagram
Parts used
- 1 × microSDHC card, Transcend, 32GB, class 10, 20MB/17MBs
- 1 × PCB, perfboard prototyping, 30x70mm, 21cm2
- 1 × Raspberry Pi 1 Model B+, 700MHz ARM CPU, 512MB RAM
- 1 × Resistor, carbon film, 0.25W, 10 kΩ, 5%
- 1 × Rubber foot, adhesive, SJ-5012, Ø 12.7x3.5 mm
- 10 × Straight pin header, female, Dual row, 2.54mm
- 12 × Straight pin header, female, Single row, 2.54mm
- 15 × Straight pin header, male, Single row, 2.54mm
- 4 × Temperature sensor DS18B20, probe, Water-proof, 1M cable
- 1.5 m Wire, stranded, 0.22mm2, Black
- 1.5 m Wire, stranded, 0.22mm2, Red
- 1.5 m Wire, stranded, 0.22mm2, Yellow
Last commit 2024-11-11, with message: Add lots of tags to posts.