Intro
After I locked up the ARM cluster in a rack cabinet, I noticed a loud noise coming from the central PSU. The recent summer heats took its toll, so it wasn’t a surprise to see the devices melting inside the rack. Unfortunately, the cooling system was limited only to a few fans mounted to boards heatsinks, but nothing that would improve the internal airflow. To fix that, I installed a few large fans at the top of the rack, and obviously, that worked but not without side effects. Now, the construction sounds like a beehive, even in the night when the temperature is much lower.
In the end, I used the sensors data (4 sensors in distinct locations) to control the fan speed automatically, but here I’ll only describe how to gather temperature with multiple DS18B20 digital thermometers connected to the BeagleBone Black ARM board.
ds1820
The project describes how to build a leightweight C HTTP server (based on libmicrohttpd) that:
- periodically collects temperature via DS182B20 sensors
- stores measurements in the sqlite3 database
- exposes data via jQuery mobile web interface
- notifies the user if sensors go out of range (msmtp required)
In addition to the above, I described the process of wiring and system setup with BeagleBone Black board.
Wiring
The ARM board communicates with the sensors via 1-wire serial protocol that supports multiple devices on one data line. To enable the driver, we'll have to instruct the kernel about physical wiring, so you should make sure the correct GPIO pin is present in the DTS (device tree source) file.
The figure below presents example setup specifically for BeagleBone Black board (P9.22 GPIO pin, 4.7 kOhm resistor), but it should also work for other prototype boards (ie. Arduino):
System setup
Not so recently, kernel overlays have been deprecated, so anything that depends on "bone_capemgr" won't work. Instead, we must configure/load the device tree overlays at the boot time with U-Boot.
At first we need to compile the DTS file:
$ git clone https://github.com/mkaczanowski/ds1820
$ dtc -O dtb -o dts/BB-W1-00A0.dtbo -b 0 -@ BB-W1-00A0.dts
$ cp BB-W1-00A0.dtbo /lib/firmware/
Now, the dtbo
file needs to be loaded via U-Boot:
$ echo "enable_uboot_overlays=1" >> /boot/uEnv.txt
$ echo "uboot_overlay_addr4=/lib/firmware/BB-W1-00A0.dtbo" >> /boot/uEnv.txt
If all goes right, after the reboot you should see sensors exposed via sysfs:
$ ls /sys/bus/w1/devices/
28-0000035f5e27 28-000004b58c5d w1_bus_master1
Note that the U-Boot configuration is tightly coupled with the BeagleBone Black official Debian image and likely won't be the same on other systems.
Building
It's a standard CMake project, so everything should build smoothly. However dependencies such as libmicrohttpd
or sqlite3
must be installed manually (via apt).
$ git clone https://github.com/mkaczanowski/ds1820
$ cd ds1820
$ mkdir build && cd build
$ cmake ../ && make
The server is configured via JSON config, where you have to update sensors sysfs paths:
{
"host": "0.0.0.0",
"port": 8888,
"db_path": "test.db",
"db_update_rate_secs": 10,
"email_send_rate_secs": 600,
"email_recipient": "[email protected]",
"temperature_scale": 0,
"sensors_range": {
"min": -5,
"max": 17
},
"sensors": [
"/sys/bus/w1/devices/28-0000035f5e27/w1_slave",
"/sys/bus/w1/devices/28-000004b58c5d/w1_slave"
]
}
Spawn up the server:
$ ./temperature-server ../config.json