I’ve had a half-broken temperature monitoring setup at home for quite some time. It started out with a Atom-based NAS, a USB-serial adapter and a passive 1-wire adapter. It sometimes worked, then stopped working, then started when poked with a stick. Later, the NAS was moved under the stairs and I put a Beaglebone Black in its old place. The temperature monitoring thereafter never really worked, but I didn’t have the time to fix it. Over the last few days, I’ve managed to get it working again, of course by replacing nearly all the existing components.
I’m using the DS18B20 sensors. They’re about USD 1 a piece on Ebay (when buying small quantities) and seems to work quite ok.
My first task was to address the reliability problems: Dropouts and really poor performance. I thought the passive adapter was problematic, in particular with the wire lengths I’m using and I therefore wanted to replace it with something else. The BBB has GPIO support, and various blog posts suggested using that. However, I’m running Debian on my BBB which doesn’t have support for DTB overrides, so I needed to patch the kernel DTB. (Apparently, DTB overrides are landing upstream, but obviously not in time for Jessie.)
I’ve never even looked at Device Tree before, but the structure was
reasonably simple and with a sample override from
bonebrews it was easy enough to come up with my patch.
This uses pin 11 (yes, 11, not 13, read the bonebrews article for
explanation on the numbering) on the P8 block. This needs to be
compiled into a .dtb. I found the easiest way was just to drop the
patched .dts
into an unpacked kernel tree and then running make dtbs
.
Once this works, you need to compile the w1-gpio
kernel module,
since Debian hasn’t yet enabled that. Run make menuconfig
, find it
under “Device drivers”, “1-wire”, “1-wire bus master”, build it as a
module. I then had to build a full kernel to get the symversions
right, then build the modules. I think there is or should be an
easier way to do that, but as I cross-built it on a fast AMD64
machine, I didn’t investigate too much.
Insmod-ing w1-gpio
then works, but for me, it failed to detect any
sensors. Reading the data sheet, it looked like a pull-up resistor on
the data line was needed. I had enabled the internal pull-up, but
apparently that wasn’t enough, so I added a 4.7kOhm resistor between
pin 3 (VDD_3V3
) on P9 and pin (GPIO_45
) on P8. With that in
place, my sensors showed up in /sys/bus/w1/devices
and you can read
the values using cat
.
In my case, I wanted the data to go into collectd and then to graphite. I first tried using an Exec plugin, but never got it to work properly. Using a python plugin worked much better and my graphite installation is now showing me temperatures.
Now I just need to add more probes around the house.
The most useful references were
- Bonebrews article
- Cross compiling official kernel packages
- Verifying pin usage. This is useful for double checking that your DTB actually exports the pins you expect it to.
In addition, various searches for DS18B20 pinout and similar, of course.