Raspberry Piで部屋の気温をモニタリンクさせてみた
Raspberry Piの電子工作入門キット買ってみた: EeePCの軌跡の記事でも書いたとおり、Raspberry Piの初心者向け電子工作キットを買ったんですが。
その中に温度センサーが入っているんですよね。
これで室温モニターを作ってみたくて、LEDからいきなり温度センサーまでステップアップしてみました。
例によって、以下の記事を参照しました。
Raspberry Piで温度センサー。部屋の気温を取得しよう - Raspberry Pi 電子工作
が、ちょっとはしょり気味で分かりにくい部分があったので、ちょっと補足しつつ書きます。
長文のため、”回路編”と”プログラム編”に分けました。
■ 回路編
まずは上のリンクを参考に回路を作ります。
ちょっと分かりにくいですね。ICと温度センサーは極性があるので注意が必要です。
ICは天辺に書かれている文字で上下を判別。こんな感じにささってればOKです。
温度センサー(トランジスタっぽいやつ)とコンデンサーも挿します。
あとは回路図どおり線を差し込んでいったんですが・・・
Raspberry Pi → 基板用の線は足りるんですが、基板→基板の線が一本足りないことが発覚。
というわけで、リード線の端っこをむいてよじっただけのを突っ込んでみましたが。
ささりました。
結論から言うと、これでうまく動きました。
半田付けが絡むとこうは行きませんね。見た目はちょっといまいちですが、本当に簡単に組めます。
あとはRaspberry PiをmicroUSBにつないで起動。
これを制御するプログラムを組みます。
■ プログラム編
この温度センサーの情報を取得するためのコードはRubyを使うので、これをインストールします。
sudo apt-get install ruby1.9.1-dev
Rubyのバージョンが1.8以前だと動かないので、1.9以上を使います(私はここでスタックしました)。
もしうまくインストールできない場合はあらかじめ
sudo apt-get update
をしてから上のコマンドを実行するとうまくいくようです。
さらに、Rubyで”pi_piper”というのを使います。これをRubyのライブラリを取得する”gem”というやつでインストールします。
sudo gem install pi_piper
しばらくすると帰ってくるので、これで準備完了。
元リンクにも温度を取得するためのコードがかかれてますが、ちょっと改造しました。
時刻と、小数点以下一桁までの温度を表示させるため、こんな風に変えてみました。
エディターで”temp.rb”というファイルを作ります。中身は以下。
require 'pi_piper'
loop do
value = 0
PiPiper::Spi.begin do |spi|
raw = spi.write [0b01101000,0]
value = ((raw[0]<<8) + raw[1]) & 0x03FF
end
volt = (value * 3300.0)/1024.0
degree = (volt - 500.0)/10.0+2.0
t = Time.now.to_i
puts sprintf( "%10i,%10.1f",t,degree)
sleep(1)
end
”t”という変数は現在時刻、”degree”は気温を表してます。
”degree = ~ ”の最後に”+2.0”を足しておりますが、単純に室温計の温度と、この温度センサーが返してくる値がちょうど2.0度ずれていたため、足しただけです。
”puts sprintf( ~ ”のところで、時刻と気温を並べて表示させます。
”sleep(1)”のところでは表示時間を変えられます。1秒おきに出す場合は上の通りでOK。
最終的に1分おき(60秒おき)に出したかったので、私はここをあとで”sleep(60)”に変えてます。
このコードをRubyで実行します。
sudo ruby temp.rb
するとこんな表示が出ます。
1秒おきに”時刻 , 気温”が表示されます。
”時刻”があんまり時間に見えませんが、これはLinux内のdate値をシリアル値で表示しているため。
具体的に言うと、1970年1月1日午前0時0分からの時間(秒)です。もう13億秒経ってるんですね。
ついでにいうと、Raspberry Piはそのままだと世界標準時(日本時間 - 9時間)なので、注意が必要。日本時間に変える方法はあるようですが、面倒なので後で直します。
元リンクではRaspberry PiにWebサーバーを立ち上げて、ブラウザ上に温度グラフを表示させてますが、私の目的は時刻、温度のcsvファイルが作れればいいので、このコードを使ってcsvファイルを作ります。
Rubyを実行するときに、こういう風に打ち込みます。
sudo ruby temp.rb > test.csv &
するとバックグラウンドで温度モニターが始まります。
あとはしばらくほおっておくと、”test.csv”ファイルに時刻、温度の値が入ってきます。
さて、これをPCに持ってきてExcelで処理させたいんですが・・・どうやって持ってくるの?
私はRaspberry PiにFTPサーバーをいれて、FTP経由でゲットすることにしました。
参考サイトは以下。
Raspberry Pi / Vsftpd(FTPサーバー): IT備忘録
なお、上のサイトのように”sudo ufw allow 12”を実行すると「そんなコマンドはねぇ!」ってラズちゃんに怒られますが、そのときは”sudo apt-get install ufw”を実行してから上のコマンドを実行します。
PC用のFTPクライアントを使ってもよかったんですが、寒くて布団の中から操作したかったので、iOS用FTPクライアントを使いました。
iTunes の App Store で配信中の iPhone、iPod touch、iPad 用 FTPManager Free
これを使ってDropboxにcsvファイルを置いて、PC上に送りました。
なお、接続設定でFTPのプロトコルのところを”SFTP”にしておかないと接続できません。
で、なんとかcsvファイルをゲットできました。
Excelに読み込ませて、時刻のシリアル値を日時形式に変換します。
ちょっと厄介なんですが、UNIX系の時刻のシリアル値は1970/1/1 0:00からの秒数。
Excelでの時刻のシリアル値は1900/1/1 0:00からの日数なんですよね。
そこで
=(A1+9*3600)/3600/24+25569
という関数を作成し、UNIX → Excel用に変換します。
(A1のところは、UNIX系シリアル値の時刻の入ったセル)
なお、標準時刻を日本時間に補正(+9*3600)、1970年1月1日のExcel上のシリアル値(+25569)をくわえてます。
シリアル値そのままでは人間には一体何のことだか分からないので、Excelのセルの書式を以下のように変えます。
これで日時の表示に変わってるはずです。一応時刻が正しそうかチェックしてください。
このデータを使ってグラフを書かせてみました。
Raspberry PiでこのRubyコードを実行したのは夜11時過ぎ。翌日の午後7時ごろまで計測。
計測開始直後にエアコンを切ったため、翌朝まではどんどん気温が下がってますね。
その後室温は上昇。エアコンをつけたり、曇りだったのが昼にかけて一時晴れたりしたため気温が変動しています。
値は±0.5度程度ぶれてます。おかげでグラフはぎざぎざしてます。まあ許容範囲レベルの誤差かと。
室温の変化を見たかったのと、二階の気温がどうなってるのかを知りたい時に使えますね。
いずれは、ある気温(10度以下 or 35度以上)になったら警告メールを出せるようにしたいところ。
やっぱり電子工作面白いですね。なんだかわくわくします。これをきっかけにはまりそう。
せっかくなんで、いろいろ応用してみたいと思います。
« Intelの超小型コンピュータ”Edison”の詳細が判明 | トップページ | MS Office互換で無料・高速なWebアプリ”TeamLab” »
「Raspberry Pi・Arduino・電子工作」カテゴリの記事
- 名古屋 大須へ行ってきました(2024.04.28)
- Raspberry Pi 5用電源購入(2024.04.19)
- Interface 2024年5月号はRaspberry Pi 5特集(2024.03.26)
- Raspberry Pi 5とPCがつながらなかった理由は「プライバシーセパレーター機能」のせいでした(2024.03.12)
- Raspberry Pi 5に日本語LLM(ELYZA-Japanese-Llama-2-7b-fast-Instruct)を入れてみた(2024.03.10)
コメント
« Intelの超小型コンピュータ”Edison”の詳細が判明 | トップページ | MS Office互換で無料・高速なWebアプリ”TeamLab” »
さっそく電子工作の発表ですね♪
小生Rubyにはまだ手を出していませんが
割と簡単そうなので
やってみねば!と感じたしだいです。
温度センサーが上手く出来れば、それだけでも十分活用できることがあると思います。
照度センサーも入っていると書かれていたようで
それもあれば、またいろいろと。楽しい夢が広がるはずです。
投稿: enutea | 2014年1月12日 (日) 01時25分
こんにちは、enuteaさん。
私もRubyのコードをいじるのは初めてで、しかもほとんど分からないまま見よう見まねでコードをいじっているという状況です。もうちょっと勉強しないといけませんね。
この温度センサー用回路をちょっといじるだけで照度センサー用も作れるみたいです。要は温度・照度各センサーが出すアナログ信号を真ん中のアナログ-デジタル変換ICを介してRaspberry Piに受け渡すという回路なため、ほとんど同じ事をやってるようです。
そのデータを受けて何をするかはRaspberry Piの役割で、アイデア次第ではいろいろ面白いものが作れそうです。
投稿: arkouji | 2014年1月12日 (日) 09時14分