Raspberryでエアコンを自動運転する(その1)


こ のページでエアコン用ユニバーサルマルチリモコン各社共通 1000種対応の改造方法を紹介しました。
最新のエアコンには温度計が内蔵されていて、温度が一定以上(一定以下)になると、
自動的に電源が切れるものがありますが、我が家のエアコンは1995年製の旧式なので、
そんな機能はありません。

そこで、今回は、 パソコンで制御するエアコンの作り方 i2cの温度計を使って室温を監視し、温度が一定以上(一定以下)になると
自動的にエアコンの電源をON/OFFしてみます。

使用する温度計はBMP085で す。
BMP085は温度だけでなく、大気圧を取得することができます。
BMP085のデータシートはこ こからダウンロードできます。

なお、今回このページを作成するに当たり、以下のページを大いに参考にさせていただきました。ありがとうございます。
RaspberryPi に温度センサーを接続してみた
上記のページではPythonのサンプルプログラムが紹介されていますが、Pythonはあまり詳しくないので、今回はC言語でプログラムを作り ます。

【STEP1】配線

以下の表のとおりにブレッドボード上で配線を行います。

5V *NotUse*
3.3V Pin# 1 pr 17
GND Pin# 6 or 25
SDA Pin# 3
SCL Pin# 5
XCLR *NotUse*
ECC *NotUse*

ブレッドボード
全体

【STEP2】モジュールの組み込み

raspi-blacklist.conf のi2cをコメントアウトします。
pi@raspberrypi ~ $ sudo vi /etc/modprobe.d/raspi-blacklist.conf
blacklist spi-bcm2708
#blacklist i2c-bcm2708 → コメントアウト

modules にi2cを追加します。
pi@raspberrypi ~ $ sudo vi /etc/modules
snd-bcm2835
i2c-dev → 追加

「i2c-tools」をインストールします。
pi@raspberrypi ~ $ sudo apt-get install i2c-tools

準備が終わったら一旦再起動します。

【STEP3】接続の確認

以下のコマンドでBMP085の接続を確認します。
pi@raspberrypi ~ $ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- 77

【STEP4】ソースのダウンロードとコンパイル

パソコンで制御するエアコンの作り方 WiringPiがインストールされていないときは、WiringPiをインストールします。
pi@raspberrypi ~ $ sudo apt-get install git-core
pi@raspberrypi ~ $ git clone git://git.drogon.net/wiringPi
Cloning into 'wiringPi'...
remote: Counting objects: 675, done.
remote: Compressing objects: 100% (617/617), done.
remote: Total 675 (delta 490), reused 95 (delta 58)
Receiving objects: 100% (675/675), 250.06 KiB | 144 KiB/s, done.
Resolving deltas: 100% (490/490), done.
pi@raspberrypi ~ $ cd wiringPi/
pi@raspberrypi ~/wiringPi $ ./build

次にここからソースファイル一式をダウンロードしてください。
ダウンロードが終わったらファイルを展開します。
pi@raspberrypi ~ $ tar zxvf BMP085.tar.gz

新しく「BMP085」という名前のディレクトが作成され、その中に以下のファイルが展開されますのでmakeしてください。
pi@raspberrypi ~ $ cd BMP085
pi@raspberrypi ~/BMP085 $ ls -l
total 32
-rwxr-xr-x 1 pi pi 1408 Oct 10 07:07 air-con2.sh
-rw-r--r-- 1 pi pi  705 Oct 10 07:07 led.c
-rw-r--r-- 1 pi pi  149 Oct 10 07:08 Makefile
-rw-r--r-- 1 pi pi 6988 Sep 16  2013 readBMP085.c
-rw-r--r-- 1 pi pi 5322 Sep 16  2013 smbus.c
-rw-r--r-- 1 pi pi 2422 Sep 16  2013 smbus.h

pi@raspberrypi ~/BMP085 $ make
cc -o readBMP085 ./smbus.c ./readBMP085.c -lm
cc -o led led.c -lwiringPi

makeで失敗する場合は、「libi2c-dev」がインストールされていないことを確認してください。
pi@raspberrypi ~ $ dpkg --list | grep libi2c-dev

「libi2c-dev」がインストールされているときは、これを削除してください。
pi@raspberrypi ~ $ sudo apt-get --purge remove libi2c-dev

※windowsPCでファイルをダウンロード、展開し、展開後のファイルをscpで Raspberry Piに転送すると、ファイルのアクセス権限が変わってしまいます。
※必ず展開前のファイル(BMP085.tar.gz)をscpでRaspberry Piに転送し、Raspberry Pi側で展開してください。

makeが終わったら、以下のコマンドを実行して温度、大気圧、標高が表示されることを確認します。
pi@raspberrypi ~/BMP085 $ sudo ./readBMP085
Temperature     85.3 *F
Temperature     29.6 *C
Pressure        1001.35 hPa
Altitude        452.8 Feet
Altitude        138.0 M

※Altitude(標高)は大気圧から以下の計算で求めた近似値なので正確ではありません。
   float A = pressure/101794.58; → pressureが大気圧
   float B = 1/5.25588;
   float C = pow(A,B);
   C = 1 - C;
   C = C / 0.0000225577;

なお、smbus.c/smbus.hはこ ちらでも公開されています。
リンクが分かりずらいですが
 Here are the two files:
の下のボールド文字がリンクになっています。

readBMP085.cのオリジナル(testBMP085.c)はJohn Burnsさんが以下のページで公開されています。
http://www.john.geek.nz/2013/02/update-bosch-bmp085-source-raspberry-pi/
シェルから実行したときに扱いやすい様に、オリジナルから、以下の起動オプションを追加しています。
pi@raspberrypi ~/BMP085 $ sudo ./readBMP085 -T
296  → 10倍した摂氏温度
pi@raspberrypi ~/BMP085 $ sudo ./readBMP085 -P
100132 → 100倍した大気圧
pi@raspberrypi ~/BMP085 $ sudo ./readBMP085 -A
137 → 標高

【STEP5】CRONへの組み込み

cronを使って定期的に温度を監視し、一定の温度以上(以下)になったら パソコンで制御するエアコンの作り方 エアコンの電源を入れます。
エアコンの電源を入れる上限温度、下限温度を指定します。
温度については適当に変更してください。
pi@raspberrypi ~/BMP085 $ nano air-con2.sh
#!/bin/bash
HighTemp=280  → 室温がこれ以上(28度以上)ならエアコンを入れる
LowTemp=150  → 室温がこれ以下(15度以下)ならエアコンを入れる

暖房/冷房の切り替え、設定温度は事前にエアコンをハンドで操作して指定しておきます。
以下のコマンドでcrontabを修正し、「/home/pi/BMP085/air-con2.sh」を定期的に実行するようにします。
「pi@raspberrypi ~/BMP085 $ crontab -e

crontabの書き方は、こ のページなどを参考にしてください。
ちなみに私は、毎日2時から7時の間の寝ている間に、5分間隔で室温のチェックをしています。
*/5 2-7 * * * /home/pi/BMP085/air2-con.sh


【STEP6】実際の温度推移

下のグラフがある日の2時から7時までの温度推移です。
29度を超えるとエアコンが働いて温度が下がっているのが分かります。
温度グラフ
蒸し暑い日などは以下のように温度が激しく上下しますが、29度を大きく超えことはありません。
温度グラフ
エアコンが付けっ放しになることもないので、お休みタイマーよりもはるかに快適です。
あまりに快適なので、結局24時間、このやり方でエアコンを制御することにしました。
次のページで紹介します。