Raspberry Piと1-Wireステンレス防水温度センサ(DS18B20)を使って水温を計る

水槽の水温が30度超えたら、水槽に設置してある5Vファンを2つまわして、水温を下げる。
というようなものを作ろうと思います。

今は秋ですが夏になれば室温が35度を超えて水温も30度を超えるのでは?と思い今から準備しておきます。今回は、Raspberry Piと1-Wireステンレス防水温度センサ(DS18B20)を使って水温を測るだけをやってみます。

まず最初に、1-Wireステンレス防水温度センサ(DS18B20)をRaspberry PiのGPIO4と3.3VとGndにつなげます。

1-Wireステンレス防水温度センサ
白ケーブル → GPIO4
黒ケーブル → Gnd
赤ケーブル → 3.3V

そしてGPIO4と3.3Vを10kオームのプルアップ抵抗でつなげます。
プルアップ抵抗は4.7kオームが定番ですが、手元になかったので10kオームにしました。

こうなります。

1-Wireステンレス防水温度センサ(DS18B20)はAitendoで買いました。
1-Wireステンレス防水温度センサ

1-Wireステンレス防水温度センサをブレッドボードにさせるように、
ピンヘッダを半田付けしました。

小さい白いブレッドボードは秋月で2つで240円でした。

これで下準備は完了です。

今回は温度を測るのにDS18B20(350円)を使いました。
水温計にするつもりなので、DS18B20が入っている1-Wireステンレス防水温度センサ(630円くらい)にしました。

値段につられて高精度IC温度センサのLM35DZ(150円)なんかを使っちゃうと、ADコンバータをつけたり、特別なプログラミングでSPIで温度情報を読み取るみたいなことをしなくちゃいけなく、大変です。あとついでに防水加工も必要だと。

温度を単純に測りたい場合は、DS18B20を使いましょう。
水中に入れたりするんだったら、最初から防水加工をしたDS18B20を使うのが楽でいいです。

ちなみに温度と湿度を測りたい場合はDHT11を使うと楽っぽいですが、精度がいまいちらしいです。
DHT22(AM2302)のほうが精度が高いらしいので、DHT22をそのうち使ってみようと思います。
DHT22をebayで注文すると400円くらいです。秋月だと950円(送料抜き)です。
発送に時間がかかるので、気になる人は注文しちゃっていいと思います。

次にRaspberry Piをいじくります。

とりあえず、Raspberry Piをアップデート&アップグレードします。

sudo apt-get update
sudo apt-get upgrade

GPIO4で温度を測るための設定。

sudo modprobe w1-gpio
libkmod: ERROR ../libkmod/libkmod.c:554 kmod_search_moddep: could not open moddep file '/lib/modules/3.12.26+/modules.dep.bin'
sudo reboot

意味不明なエラーが出たので、とりあえずリブートしてみた。
いろいろアップグレードしていたから、その影響かな?

再び設定してみる。

sudo modprobe w1-gpio
sudo modprobe w1-therm

エラーメッセージが出なくなりました。

温度センサのデバイスIDを探します。

cd /sys/bus/w1/devices
28-0004335901ff  w1_bus_master1

28-0004335901ffのところは各自で異なります。
これが温度センサのデバイスIDです。

デバイスIDから温度を表示させます。

cd 28-0004335901ff
ls
driver  id  name  power  subsystem  uevent  w1_slave

cat w1_slave
d0 01 55 00 7f ff 0c 10 47 : crc=47 YES
d0 01 55 00 7f ff 0c 10 47 t=29000

t=29000のところが温度で1000分の1にします。
つまり、現在の温度は29.0度になっています。

この時点でGPIO4の電圧を測ってみると3.3Vぐらいで、ほとんど3.3V電源と同じ電圧でした。
プルアップ抵抗を引っこ抜いても変わりませんでした。温度も普通に計測しています。

GPIO4をDS18B20からはずして3.3V電源に突っ込むと、t=0になり、YESという表示がNOになりました。
GPIO4をGndに突っ込んだ場合も同じ表示になりました。

DS18B20からデジタル信号がGPIO4に流れてるんだろうなー、と思っておきましょう。
プルアップ抵抗は、うん、たぶん何かの役に立ってるんだよ。

1-Wireステンレス防水温度センサ(DS18B20)の温度をRaspberry Piで確認することができました。

これをどうやって、“水槽の水温が30度超えたら、水槽に設置してある5Vファンを2つまわして、水温を下げる”という仕組みに持っていくかというと、WebIOPiを使うのです。

なんとWebIOPiのモジュールの中に、DS18B20を読み込む機能が含まれています!

WebIOPiって何だよ?という人、
Raspberry PIでLED点灯コントロール、Part3 ネット経由(WebIOPi)でコントロールするを読んでください。

webiopiでDS18B20を使う方法

from webiopi.devices.sensor import DS18B20

# DS18B20を自動的に抽出する
tmp = DS18B20()

# デバイスIDを使って抽出する場合はこっちを使う
# tmp = DS18B20(slave="28-0004335901ff")

#温度がほしい場合、下記のコマンドでゲットできるそうです。
tmp.getCelsius()

tmp.getCelsius()で水温をチェックして、水温が30度以上の場合、適当なGPIOをHIGHにして、FETをかまして5Vファンを回す感じにすれば、目的が達成です!

残念ながらファンが今ないので、そのうち入手しだい続きを書こうと思います。

買おうと思っているファン
5V 40mm角 DCファン ×2つ

秋月は500円の送料がかかるので、他にいろいろ材料を買う必要が出たときにまとめて買おうと思っています。

Raspberry Piと1-Wireステンレス防水温度センサ(DS18B20)を使って水温を計る” への1件のコメント
    "Raspberry Piと1-Wireステンレス防水温度センサ(DS18B20)を使って水温を計る" に 1 トラックバック・ピンバック
    1. […] ものづくりエクスペリメントさんを参考に防水温度センサと温度センサ DS18B20を2つ取り付ける 防水温度センサはAitendoで買うと2線のものになってたので2線の場合はIT工房Zさん参照してください 私はよく解らなかったのでビクトリーセブンで3線タイプのものを買い直しました […]

    コメントを残す

    メールアドレスが公開されることはありません。

    このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください