前回のエントリーで書いた温度計は会社で常時稼働を始めました。サーバールームの室温が常に把握できていい感じです。
で、これはZabbixに記録されている値を出すものだったので、今度は温度計のRaspberry Piに接続されたDS18B20温度センサーの値を出すようにしてみました。つまり自席の室温も見たいというわけです。
1-Wireに使えるGPIO4はすでに埋まっているので、なんかうまい方法をと思っていましたが、そういえばDeviceTreeの設定の説明(/boot/overlays/README)になんか書いてあったなと思い返しました。抜粋。
File: w1-gpio-overlay.dtb Info: Configures the w1-gpio Onewire interface module. Use this overlay if you *don't* need a GPIO to drive an external pullup. Load: dtoverlay=w1-gpio,<param>=<val> Params: gpiopin GPIO for I/O (default "4") pullup Non-zero, "on", or "y" to enable the parasitic power (2-wire, power-on-data) feature
gpiopinの値を変えたらなんか使えそうなので、/boot/config.txtに以下の一文を追記しました。
dtoverlay=w1-gpio,gpiopin=26
で、スクリプトにDS18B20周りの実装を追加。
電源に使える3VピンもLCDのボードで全部隠されているので、26番ピンのとなりの19番ピンを出力にして対処しました(雑)。
室温データの取得を行うread_temp()は、「RaspberryPi - Raspberry Piで1-Wireデジタル温度センサのDS18B20をPythonから使う - Qiita」のコードを参考に、いらない部分をガリガリ削りました。
(以下は、前回のエントリーのGistのスクリプトにいい感じに書き足す) import subprocess import Adafruit_GPIO as GPIO # DS18B20 ds18b20 = "/sys/bus/w1/devices/28-00000xxxxxxx/w1_slave" # Power gpio=GPIO.get_platform_gpio() gpio.setup(19, GPIO.OUT) gpio.set_high(19) # Data def read_temp_raw(): catdata = subprocess.Popen(['cat',ds18b20], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out,err = catdata.communicate() out_decode = out.decode('utf-8') lines = out_decode.split('\n') 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 = float(temp_string) / 1000.0 return round(temp, 2)
あとは表示を付け足して、冒頭の写真のとおりとなりました。良いですね。
というわけで、1-WireのGPIOピンはいざというときは変更して違うピンで使える、という話でした。