ぽんこつプログラマーの日々のまとめ
RPi-Logo-Reg-SCREEN

第2回目はラズパイに温度センサー DS18B20を接続し、水温を取得する。
ラズパイの初期設定は前回の記事からどうぞ。

用意したもの


配線

先ずは楽しい配線タイム。今回購入した温度センサーはDS18B20の防水タイプ。このセンサーは1-Wireというプロトコルに対応しており、値を取得するのがとっても簡単。私のような初心者にはうってつけです。
610gy64Bz6L._SL1000_
銅線のままではブレッドボードに刺せない。手持ちにオスコネクタピンが無かったので、抵抗のすずメッキ線を切り取り銅線に半田付けした。安定感ないし簡単に抜けてしまうが、一応接続は可能。
今後もデバッグにはブレッドボードを使うのだが、毎回コネクタピン付ける→本ちゃんでコネクタピン切断して基盤に半田付け、をするのは面倒だなあ。いい案があったら誰か教えてください。

次にデータシートを確認しながら配線していく。
kairo
まったくわからんので素直にGoogle先生にお願いしてたどり着いた答えがこちら。
ds18b20

3.3vから電源を取り(赤線)、黒線をGNDに接続。センサー黄線はGPIO4に接続した。ラズパイのデフォルト1-Wire対応PINはGPIO4だが、"/boot/config.txt"に下記を追記すれば任意のGPIOでも使用できる。
dtoverlay=w1-gpio,gpiopin=4 ←任意のPin番号
あとは電源ラインから4.7kの抵抗を噛ませセンサーラインに接続する。

1-Wire/Pullupを有効化

素のラズパイは 1-Wire が無効なので有効にする。
1. ターミナル上で"sudo raspi-config"を実行し、設定画面を表示
2. "5 Interfacing Options" を開く
3. "P7 1-Wire" を開き yes を選択
4. /boot/config.txt を任意のエディタで開く
5. "dtoverlay=w1-gpio,pullup=on" と追記する
※ラズパイには標準でGPIOに抵抗付いてるらしいので pullup=on を記述しておけば、配線の4.7k抵抗はいらないのかも 要検証

温度を取得する

先ずはセンサーが認識されているか確認するため下記コマンドを実行。
cd /sys/bus/w1/devices/
ls
28-から始まるディレクトリ(例:28-xxxxxxxxxxxxx)があればセンサーを認識している。このディレクトリ名はユニークなもので、後述のスクリプトに使用するのでメモっておく。
上記のディレクトリに移動し、w1_slave を cat すると温度を取得することが出来る。
cat w1_slave
a2 01 55 05 7f a5 a5 66 ce : crc=ce YES
a2 01 55 05 7f a5 a5 66 ce t=26125
t=26125 が温度で摂氏(℃)を1000倍したもの。

Pythonスクリプトを書く

任意のエディタで下記のPythonスクリプトを作成する。
vim temp.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys import subprocess
slave = "/sys/bus/w1/devices/28-xxxxxxxxxxxx/w1_slave"
err = 85000
def main(): try: res = subprocess.check_output(["cat", slave])
except: res = None
if res is not None: val = res.split(b'=') if val[-1] == err: print(-1) else: print(round(float(val[-1]) / 1000, 1)) else: print(-1) if __name__ == "__main__": main()
slaveのパスを指定している 28-xxxxxxxxxxxx の部分は上記のディレクトリ名に書き換えてどうぞ。
今回は水槽の水温を計測するためのコードなので、エラー時に -1 を返している。こちらも適宜書き換えてください。
あとは下記コマンドでちゃんと取得出来てればOK。
python temp.py
26.1

Add Comments

名前
 
  絵文字
 
 
webmaster

Redmusk

最西端の地で釣りとギターとゲームをこよなく愛する本業ぽんこつプログラマー。今を生きるを座右の銘とし日々快楽だけを求め切磋琢磨しております。

soundcloud