
平成最後の夏を乗り切るためにRaspberry Piで「暑くなったら自動でつく扇風機」を作りました
(この記事は無料で最後までお読みいただける投げ銭方式の記事です)
(この記事は個人ブログにて公開していた記事をnoteに転載したものです)
この記事は2018年5月時点の情報に基づいたものです。最新の情報と異なる可能性がありますのでご注意ください。
お久しぶりです。さく1です。まだ5月だというのに暑い日が続きますね。暑がりなぼくにとってはつらい季節になってきました。
みなさん部屋が暑いときはどうしますか?だいたいの方はエアコンをつけるか扇風機をつけるかだと思います。
でも、暑くてだるいなか、わざわざエアコンのリモコンを探したり扇風機のスイッチを入れに行ったり、動きたくないですよね?
かつて、どこかのだれかは言いました。「ドリルを買う人が本当に必要なのはドリルではなく穴である」と。
ぼくたちに必要なのは「涼しさで」あって、エアコンのリモコンを探したり扇風機のスイッチを入れることではありません。
そんな煩わしいことは機械にやらせましょう。
ということで、作りました!「暑くなったら自動でつく扇風機」を!
今回はその作り方を書きたいと思います。
1.必要機材の準備
まずは必要機材を揃えます。必要な機材は以下になります。
Raspberry Pi 3B一式
温度センサー(DHT11)
USBハブ
USB給電の扇風機
Raspberry Pi 3B一式
Raspberry Pi Zero系でなければ、2や3、3Bなどでも大丈夫だと思います。Zero系は後で使うhub-ctrlでUSBハブの操作ができないので今回の目的には使えません。
Raspberry Pi 3B一式
Raspberry Pi Zero系でなければ、2や3、3Bなどでも大丈夫だと思います。Zero系は後で使うhub-ctrlでUSBハブの操作ができないので今回の目的には使えません。
温度センサー(DHT11)
温度センサーはDHT11を使います。DHT11単体のものでもいいですが、Raspberry Piとの接続が面倒になるので基盤にはんだ付けされているDHT11温湿度センサーモジュールを使った方が楽ちんです。
また、DHT11温湿度センサーモジュールの他にもいろいろなセンサーやブレッドボードやLEDや抵抗、ジャンパーワイヤなどがセットになったKUMANのRaspberry Pi初心者セットもおすすめです。部品の使い方の説明はないので自分で調べる必要はありますが、ネットを調べればだいたいわかるのでいろいろ楽しめます。Amazonなどで売ってます。
特に今回は温度センサーとジャンパーワイヤが必要になるので、これを買っておけば間違いないと思います。
USBハブ
USBハブはバスパワー式のものにしましょう。セルフパワー式だとRaspberry Piから通電のコントロールができません。
また、USBハブによってはUSBハブの通電のコントロールをするhub-ctrlで正しく認識できないものがあるようです(条件は不明)。
例でいうと、サンワサプライのUSB-3HC315Wは今回試してみたところ期待した動作をしませんでした。
一方、バッファローのBSH5U05は期待した動作をしました。
条件が不明なのでなんともいえませんが、手元にUSBハブがある場合はそれで一度試してみて、ダメだったら購入も検討してみてください。
USB給電の扇風機
USBで給電できる扇風機で、スイッチをONのままにしておけるものなら何でも大丈夫です。
今回作ったものも、ダイソーで300円で買ったものです。
動作音がしたり角度がつけれないなど小回りが利かないので、ダイソーのものを無理に使う必要もないですが。一般的なUSB扇風機は1,000円くらいで買えるので長く使いたいならそちらの方がいいかもしれません。
2.温度センサー(DHT11)の導入
温度センサーは上記の通りDHT11を使用します。
で、温度センサーから受け取った信号をRaspberry Piで処理できる形に整える必要があるのですが、そんな仕様のよくわからない処理を作るのも大変です。
で、大変なことはだいたい先人がすでに解決してくれています。さらにいうとソースコードまで公開してくれていたりします。車輪の再発名はしなくていいんだね…ありがたや。
ということでそのソースコードを使わせてもらいましょう。そのコードはGit上に公開されているので、まずはgitをRaspberry Piにインストールします。
sudo apt-get install git
続いて、Git上から該当のソースコードを取得します。
git clone https://github.com/szazo/DHT11_Python.git
/home/pi/DHT11_Python というディレクトリにソースコード一式が格納されました。
取得したソースのうち、dht11_example.pyが実際にDHT11を使った処理の例になるので、これを参考に進めたいと思います。一旦こいつをコピー&ペーストして複製しておきましょう。名前は「dht11_auto_fan.py」にでもしますか。
で、肝心のDHT11の接続ですが、以下のようにします。dht11_example.pyではGPIO14を使うようになっているので、以下の通り接続するとdht11_example.pyは動かないはずなので注意です(温度センサー以外にもGPIOを使った部品をつけようと思っていたので、温度センサーのGPIOピンを寄せるために使用するピンを変えました)。
DHT11:Raspberry Pi3 B GPIOピン番号
GND:6番PIN(GND)
DATA:7番PIN(GPIO4)
VCC:2番PIN(5V)
3.USBハブ制御(hub-ctrl)の導入
続いて、USBハブの制御プログラムを導入します。
こちらも偉大な先人たちが残してくれたプログラムであるhub-ctrlを有効活用します。hub-ctrlはC言語で書かれたソースと、Pythonで書かれたソースが公開されているようです。今回はhub-ctrlの呼び出し元がPythonなので、Pythonのhub-ctrlを使いたいと思います(Cだとコンパイルもめんどうなので)。
以下コマンドでGitから該当のソースコードを取得します。
wget -O hub_ctrl.py "http://git.gniibe.org/gitweb/?p=gnuk/gnuk.git;a=blob_plain;f=tool/hub_ctrl.py;hb=HEAD"
取得したソースコードの実行権限を自分に付与します。
chmod u+x hub_ctrl.py
Pythonの実行に必要なライブラリなどを取得します(どうやらすでにいくつか入っているようですが)。
sudo apt-get install git build-essential python-dev python-smbus
sudo pip install --pre pyusb
ここまで来たら、Raspberry PiにのLAN側の左上のUSBポートにUSBハブを挿してみましょう。
で、USBハブが認識できているか確認します。
(下のキャプチャでは lsusb となっていますが、実際には sudo をつけてください)
sudo lsusb
どうやら認識できていないようです。1.必要機材の準備でも書きましたが、USBハブによってはうまく認識できないようですので、他のものに変えて再度確認してみましょう。
sudo lsusb
いくつか表示されましたね!認識できています!
ではUSBハブにUSB扇風機を挿して、電源をONにしてください。扇風機が動きますね。
その状態で、一度hub-ctrlでUSBハブへの通電をONにしてみます。
sudo /home/pi/DHT11_Python/hub_ctrl.py -h 2 -P 2 -p 1
(後々のプログラム作成のことを考えてhub_ctrl.pyをDHT11_Pythonディレクトリへ移動させておきました)
すでに通電されているので扇風機は動いたままになるはずです!(Pythonがエラー吐いてますが一旦スルーしましょう)
続いてUSBハブへの通電をOFFにしてみましょう。
sudo /home/pi/DHT11_Python/hub_ctrl.py -h 2 -P 2 -p 0
扇風機が止まったはずです!
うまくいかない場合は以下の点を確認してみてください。
・USBハブがうまく認識できていない。
・USBハブを挿す位置がちがう(Raspberry PiのLANポート側の上段のUSBポートに挿してください)
・Raspberry Pi Zero系を使っている(USBハブを認識できないのでhub-ctrlが使えません)
・hub_ctrl.pyを置いたディレクトリがちがう(キャプチャはありませんが、途中でDHT11_Pythonディレクトリへ移動しました)
・hub-ctrlを実行する際のパラメータがちがう(実行環境によって異なる可能性があります)。
4.プログラム作成
ハードウェア側の準備が整ったので、あとは温度センサーの入力値を判断してUSBハブへの通電をON/OFFするプログラムを作ればほぼ完成です。
先ほどdht11_example.pyをコピーして作ったファイル(dht11_auto_fan.py)を修正すればいけます。
例ですが、私の場合は以下のようなソースにしました。
import dht11
import time
import datetime
import subprocess
# initialize GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()
# read data using pin 14
instance = dht11.DHT11(pin=4)
fuckinHotTemp = 28
hubFlg = False
sleepSecond = 10
subprocess.call("/home/pi/DHT11_Python/hub_ctrl.py -h 2 -P 2 -p 0", shell=True)
while True:
result = instance.read()
if result.is_valid():
tmp = result.temperature
print(tmp)
if tmp >= fuckinHotTemp:
# USB-fan running
if hubFlg != True:
hubFlg = True
sleepSecond = 60
subprocess.call("/home/pi/DHT11_Python/hub_ctrl.py -h 2 -P 2 -p 1", shell=True)
else:
# USB-fan stop
if hubFlg != False:
hubFlg = False
sleepSecond = 10
subprocess.call("/home/pi/DHT11_Python/hub_ctrl.py -h 2 -P 2 -p 0", shell=True)
time.sleep(sleepSecond)
温度センサーで検知した温度がfuckinHotTempの値以上になったらUSBハブへの通電をONにし、下回ったらOFFにするようなプログラムです。fuckinHotTempの値は自由に設定してください。通電がONになったら60秒間はONのままにし、OFFにしたら10秒間OFFのままにするようにしました。涼しくなったのを検知するのが遅れるのはかまいませんが、暑いのはすぐに検知したいですから。
ちなみにfuckinHotTempのfuckinHotは某外国人の熱湯へのリアクションから来ています。。
で、このプログラムだと最初に一度USBハブへの通電をOFFにしてから温度センサーの温度を判断するようにしています。このため、Raspberry Piの起動時にこのプログラムを実行するようにしていると、このプログラムが自動実行されるまでの数秒間扇風機が動いてから一度停止し、暑い場合は10秒後に再度動くというような挙動になっています。
これはRaspberry Pi起動時のデフォルト状態がUSBハブへの通電がONであり、プログラムが実行された初回で通電ONにするとその後のプログラムの挙動がおかしくなるため、その回避策としての挙動になります。
(おかしな挙動として、USB通電がONになって数秒しか経っていないのにOFFになり、またONになっても数秒でOFFになる…を繰り返すというのがありました)
プログラムの詳しい説明は割愛しますが、もっといい書き方もあると思うので、もし作る方はリファクタリングするか一から書いて改善してみてください。
ではプログラムができたら、プログラムを実行して動作を確認してみましょう。
(相変わらず通電ONにした際のPythonのエラーが出続けますが、処理自体は継続できます。謎い…)
温度も検知できて、扇風機のON/OFFもできてますね!!
温度を上下させたいときは保冷剤を温度センサーにくっつけて冷やしたり、温度センサーを手で握って温めたりしてみてください。
5.起動時に自動実行されるよう設定
ではハードウェアもソフトウェアも準備が整ったので、最後に先ほど作成したプログラムがRaspberry Piの起動時に自動実行されるように設定しましょう。これを設定すれば、Raspberry Piの電源を入れただけでプログラムが動くので、わざわざRaspberry Piの画面からプログラムを実行する必要がなくなります。楽ちんです。
以下コマンドで、rc.localをテキストエディタで開きます。
sudo leafpad /ect/rc.local
表示されたテキストエディタに以下の内容を追記し、上書き保存します。追記する場所は「exit 0」より前にしましょう。また、もしプログラムの作成先を変えた場合は指定するパスそのパスに変えましょう。
sudo python /home/pi/DHT11_Python/dht11_auto_fan.py &
上書き保存したら一度Raspberry Piを再起動してみましょう。自動でプログラムが実行されているので、温度センサーを冷やしたり温めたりすると扇風機が消えたりついたりするはずです!!
当初の目的である「暑くなったら自動でつく扇風機」が作れました!!!
これで平成最後の夏も乗り切ることができそうです!!やったね!!!
参考サイト様
以下サイト様の情報を参考にして作業を進めました。ありがとうございました。
ここから先は
¥ 100
よろしければサポートお願いします!いただいたサポートは記事執筆の活動費に充てさせていただきます!