Raspberry Pi Zero Wと温度センサを利用して、屋外の温度を記録する温度ロガーをつくった。記録した温度データをブラウザから閲覧する仕組みもつくった。
注意
素人が適当に勘と見よう見まねでつくっているだけなので、不適切な部分があるかもしれません。参考にする場合は専門家に相談するようにしてください。責任取れませんので…。
システム構成
- Raspberry Pi Zero Wを使う。
- 家の外に設置して記録したデータを取り出すのに、家のWifiに繋がれば楽なので。というかSSHで繋げられるので管理が楽。
- 16GBのmicro SDカード
- 温度センサは防水プローブに入ったDS18B20を利用
- あとプルアップ用に4.7 kΩの抵抗器が1つ必要。プルアップ用なので別にその辺りの抵抗値なら何でも良さそう。
- パソコンにSDを挿しなおす
- イメージを書き込んだSDカード(
boot
)を開く→ssh
という名前の空ファイルを作成(拡張子なし!)
- SDカード(boot)の直下に
wpa_supplicant.conf
というファイルを次の内容で作成する
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="xxxxxxxxxxxxxxxxxxxx"
psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
key_mgmt=WPA-PSK
}
ssidは繋ぎたい無線LANのSSIDを入力する(クォートで囲む)。
pskには次のサイトにSSIDとパスフレーズを入力して計算した16進ハッシュ値を書く(クォートで囲まない)。
(改行コードはLFにしたけどCRLFでも動くんだろうか?)
電源につないで起動する。
初期設定
パスワード変更
passwd
現行のパスワード(raspberry
)1回、変更後の好きなパスワード2回を入力してパスワードを変更する。
adminのパスワードを変更するのは、
sudo passwd admin
とする。
ソフトウェアを最新に更新
sudo apt update
sudo apt upgrade -y
SSHを公開鍵認証だけにする
cd ~
mkdir .ssh
nano .ssh/authorized_keys
(ここで接続元のコンピュータの公開鍵を書き込む)
chmod 600 .ssh/authorized_keys
chmod 700 .ssh
sudo nano /etc/ssh/sshd_config
コメントアウトしたりして次のような設定に変更する。書いてない部分はそのまま。
Port 22
LoginGraceTime 30
PermitRootLogin no
StrictModes yes
MaxAuthTries 3
MaxSessions 5
PubkeyAuthentication yes
IgnoreRhosts yes
PasswordAuthentication no
PermitEmptyPasswords no
参考: sshd_configの設定項目の理解を目指す | Unskilled?
センサーのはんだ付け
接続
(画像はFritzingで作成)
温度自動記録の設定
自動記録のコードを用意した。温度を読み取ってファイルに時刻と温度を書き込むだけのコード。
github.com
これを動かす。
cd ~
git clone https://github.com/nixeneko/record_temperature
git checkout v1.0
cp settings.py.template settings.py
ls /sys/bus/w1/devices/
nano settings.py
/sys/bus/w1/devices/
の中に温度センサのデバイスがあるので、使いたい温度センサ(たぶん28-
で始まってるやつ)をメモして、settings.py
をそれに合わせて変更する。
自動実行の設定
cron.d
に書く
sudo nano /etc/cron.d/record_temperature
で設定ファイルを開いて、
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
*/1 * * * * pi /home/pi/record_temperature/rec_temp.py
と書き込み、保存する。これは1分毎に記録する場合。*/1
を*/5
にすれば5分ごとの記録になる。(*/1
は*
と同じ。)
防水プラボックスの加工
屋外に設置するので防水プラボックス(今回使ったのはタカチ BCAP112107T)に入れる。大は小を兼ねるということで大きめにした、入らなかったら嫌なので。固定用の金具も購入。蓋が透明な奴にしたけど別に蓋が透明である必要なかったなと思った。
配線を通すために穴を開ける。
穴あけ
ドリルで穴を開け、穴をつなげてやする。
シリコンシーラントで穴をふさぐ
これ本当にうまく行ってんのか謎。
ケーブルが上下に動くと普通にはがれるっぽいのでケーブルを固定してからやった方がいいっぽい。最終的に設置してからもう一回もりもりやった。
延長コードと遮断機付きのコードを繋ぎ、自己融着テープで絶縁・防雨対策
延長コードと遮断機付きのコードは適当に屋外でも使えそうなやつを通販で買った。室外機とかの屋外配線見る限りもっと簡易な作りのやつが使われてるような気がするんだけど…。
過電流遮断器なので短絡くらいしか検出できないけど、まあないよりマシかなあという感じ。漏電は配電盤の漏電遮断器が検出してくれると思う。
コード同士を接続し、自己融着テープで絶縁する。
自己融着テープは光に弱いらしく、ビニールテープでさらに巻いておくといいらしい。直射日光に当たらないのでそのままにしたが。
接地
2x4材を立てて、そこにタッピングネジでプラボックスを固定。
コードを屋外コンセントにつなぎ、電源を入れる。
インターネットからドメインでアクセスできるようにする
IP更新
cd ~
nano update_ip.sh
を次の内容で作成する。
wget https://ipv4.mydns.jp/login.html --http-user=ID --http-passwd=PASSWORD -O /dev/null
ID
とPASSWORD
は自分のアカウントに合わせて変更し、保存する。
chmod +x
してcrontab
で一日一回実行するように設定
chmod +x update_ip.sh
./update_ip.sh
IPの更新が動いているのを確かめる。
自動更新の設定
sudo nano /etc/cron.d/update_dynamic_dns
次の内容にして保存する。
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
12 5 * * * pi /home/pi/update_ip.sh
(環境変数の設定、とりあえず書いといたけど必要ないかも?)
これでドメインからIPが引けるようになるが、まだルータで止まってアクセスはできない。
参考: DDNSにBasic認証でIPアドレスを通知する - Qiita
ローカルからドメインでアクセスできるようにする
Dnsmasqのインストール
sudo apt -y install dnsmasq
sudo nano /etc/dnsmasq.conf
設定は、Raspberry PiのIPが192.168.11.10
、ルータのIPが192.168.11.1
、ドメインがexample.com
の場合を書く。次の項目のコメントアウトを外し、server
はルータ(というかDNSサーバ)のIPに書き換える。
domain-needed
bogus-priv
no-resolv
address=/example.com/192.168.11.10
server=192.168.11.1
有効化する。
sudo systemctl restart dnsmasq
sudo systemctl enable dnsmasq
参考: ラズパイ(Raspberry Pi)とDnsmasqで作るDNSサーバ | Device Plus - デバプラ
ルータのDNSルーティング設定を行う
ルータの設定画面を開き、
詳細設定→DNSルーティング設定(ルータによって異なる)から
- DNSルーティングエントリ:
example.com
- ゲートウェイ:
192.168.11.10
- プライマリDNS:
192.168.11.10
を追加。
これでローカルからもドメインでアクセスできるようになった。
気温のグラフを表示するWebサイト+CGIの設置
サイトのデータ置く用のユーザwww
を追加(この辺知識がないので何がベストプラクティスなのか分からない…)
sudo adduser --shell /bin/false www
適当に入力してユーザを作成。
サイトのデータを用意を次に用意したのでこれを使う。特定の日のデータをJSONで取得するCGIと、JSONで取得した温度データをChart.jsを使ってグラフにするHTMLファイルからなる。
github.com
用意。
sudo -Hu www /bin/bash
cd ~
git clone https://github.com/nixeneko/temperature_website
cd temperature_website/public/
cp settings.js.template settings.js
cp api/settings/settings.py.template api/settings/settings.py
Ctrl+D押してログアウト
HTTPサーバの設定
Apach2のインストールと設定
sudo apt -y install apache2
sudo nano /etc/apache2/sites-available/example.com.conf
設定を環境に合わせて次のようにする。
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName example.com
DocumentRoot /home/www/temperature_website/public
<Directory /home/www/temperature_website/public>
Require all granted
</Directory>
<Directory /home/www/temperature_website/public/api>
Options +ExecCGI
SetHandler cgi-script
</Directory>
<Directory /home/www/temperature_website/public/api/settings>
Require all denied
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
サイトやモジュールの有効化
sudo a2enmod cgid
sudo a2ensite example.com.conf
sudo a2dissite 000-default.conf
sudo apache2ctl configtest
sudo systemctl restart apache2
sudo gpasswd -a www-data www
参考: Ubuntu 20.04にApache Webサーバーをインストールする方法 | DigitalOcean
ファイアフォールの設定(ufw)
sudo apt install ufw
sudo ufw default deny
sudo ufw allow 53
sudo ufw allow 80/tcp
sudo ufw limit 22/tcp
sudo ufw enable
sudo ufw status
sudo systemctl restart ufw
参考: ufwコマンドの使い方 - Qiita
百葉箱の設置
センサー部分は百葉箱の中に突っ込む。どうせ家の蔭で日には当たらないので別にいらない気もするが。
もともとは防水プラボックスごと百葉箱のなかに突っ込むつもりだったが思ったよりでかかったので外に出すことにした。なのでもっと小さいやつで良かったかもしれない…
まともな百葉箱は高いのでレーザーカッターによるそれっぽいキットを使った。
この中型ウェザーシールド。
梱包はこんな感じで、側面の鎧戸(戸ではないが)だけ組み立てられた状態で来た。
仮組みしようとしたら手前の板の片方の穴が3mm下にずれていて嵌まらなかった。
…ので、ナイフで削って嵌まるようにした。
仮組。
手前の取り外せるようになっている窓が、扉みたいになっていないので、取り外しはやや面倒かもしれない。あまり頻繁に開け閉めしたい場合には向かないと思う。
2x4材に固定できるように背面板に穴を開け、接着し塗装した(塗装と接着を交互にやって上手い具合にやろうとした)。塗装は白の水性塗料を刷毛で2重~3重に塗り重ねた(塗料がなくなったのでやめた)。
防水プラボックスの上方、2x4材にネジとナットで固定し、底に開けた穴からセンサーを中に入れ、センサーを針金で固定した。
ついでにケーブルをナイロンクランプで固定している。
蓋をして完成。
材料費
合計17,600円程度。
他に送料、工具類、固定用のネジ類、2x4材等などは書いてないが5千円はかかってるかもしれない。
百葉箱除けば1万円しないと考えると、いい感じかもしれない。
感想
要素要素の技術は大したことない(というか、誰かがしっかり舗装してくれているのでそれを辿るだけでいい)が、組み合わさるとなんかすごいことやってる気がしてくる。
温度センサの誤差が±0.5℃なので結構大きめ。もっと高精度のやつが使えればいいんだけど、防水プローブに入ったやつが見つからなかったのでどうすればいいのかよくわからない。直接雨が当たらなければ別に良さそうな気もするが。
ラズパイはLinuxなので楽だが、Wifiと電源がないところでは使えないので、設置場所が限られる。バッテリーで数ヶ月動くデータロガーが作れればいいんだけど。