【自作IoT】スマートサーキュレータ|室内干し洗濯物の乾燥状態に合わせて自動ON/OFF機能を作ってみた

smart-circulatorRaspberry Pi
スポンサーリンク

今回は自作IoTということで、お家にあるごく普通の家電にちょっと手を加えて、いま流行のスマート家電にしちゃおうという企画です。

早速ですが、自作IoTネタ 第1段は「スマートサーキュレータ」 風量三段階切り替え、タイマー機能なしの格安送風機に少し手を加えて、部屋の状態をモニタしながら自動で動作を切り替えるインテリジェントなサーキュレータを作ってみたいと思います。

スポンサーリンク

スマートサーキュレータのコンセプト

まず今回製作するスマートサーキュレータのコンセプトを紹介します。

お家にある家電をネットワークに接続してスマート家電にしてくれるデバイスとしてSwitchBotという商品がAmazonで販売されており、サーキュレータを遠隔でON/OFFするだけであれば、SwitchBotスマートプラグを使えば簡単に実現できてしまいます。

なので今回は、SwitchBotでは実現できないような少し複雑な制御をSwitchBotよりも安価に実現することをコンセプトにスマートサーキュレータを作っていきたいと思います。

サーキュレータの制御仕様

smart-circulator_01

スマートサーキュレータの制御仕様は次のように考えました。

①洗濯物が干されていることを検知してサーキュレータを制御
洗濯物が干されているかどうかを超音波センサで検知して、干されているときだけサーキュレータをONする

②部屋の温湿度をモニタして洗濯物が乾いたか判断

smart-circulator_02

このグラフは我が家の室内干しをしている階段ホールの温湿度測定結果です。
22時頃に洗濯物を干して翌日の夕方に取り込むといったサイクルで洗濯物をまわしています。

この温湿度データを見ると洗濯物を干した22時頃に部屋の湿度が上昇し翌日にかけで徐々に湿度が低下しています。この結果から湿度が60%を下回れば洗濯物が乾いたと判断したいと思います。

ただ夏と冬では洗濯物の乾くスピードが異なるので、部屋の気温によって洗濯物が乾いたと判定する湿度を次のように切り替えることにします。

・気温 > 22℃ => 洗濯物乾燥判定湿度:60%RH
・気温 < 22℃ => 洗濯物乾燥判定湿度:50%RH

③サーキュレータ最低作動時間
サーキュレータを止めるタイミングは湿度によって判断しますが、サーキュレータの稼働時間があまりにも短いと、部分的に生乾きの洗濯物が出ることが考えられるので、サーキュレータの最低稼働時間を9時間とし、夜に洗濯物を干して翌日の朝までは少なくとも動作するようにしたいと思います。

コスト目標

 

smart-circulator_03r

部屋の湿度に応じてサーキュレータをON/OFFするだけであれば、SwitchBot温湿度計(2,000円)とSwitchBotスマートプラグ(2,500円)を使えば実現できるので、SwitchBotで実現する場合のコスト4,500円よりも安く、実現することを目標にしたいと思います。

スマートサーキュレータの材料紹介

先ほど考えたサーキュレータの制御仕様を実現する為に、今回購入したセンサや制御装置を紹介します。

RaspberryPi Pico

smart-circulator_04

今回、超音波センサと温湿度センサから情報を取得し、サーキュレータのON/OFFを切り替える制御デバイスとしてRaspberryPi Picoを使用します。

今までRaspberryPiと色々なセンサを組み合わせ、室内環境を測定して紹介する記事を書いていますが、その際に使用しているのはRaspberrPi 4というシリーズで、LinuxベースのOS上でプログラムを動作させるパソコンに近いデバイスでしたが、今回使用するRaspberryPi PicoはOSを搭載しておらずマイコンボードに近いデバイスになります。

写真を見て頂いて分かるようにサイズは非常に小さく、21×51.3×3.9mm 約3gとなっています。

この小型のデバイス上でMicroPythonというプログラムを動作させて、センサからの情報を取得したり出力を制御したりしていきます。

そしてこのデバイス、価格が550円と非常に安いので、今回のような自作IoTにはうってつけのデバイスになります。

超音波センサ HC-SR04

smart-circulator_05

洗濯物が干されているかの判定は、超音波センサ HC-SR04を使っておこないます。

センサモジュールについている2つの円筒のうち1つが超音波スピーカー、1つが超音波マイクとなっていて、スピーカーから発した超音波が対象物にあたり反射してきた音をマイクで検出する構成となっています。

スピーカーで音波を出してからマイクで音を検出するまでの時間差で対象物との距離を測定するセンサになります。

このセンサで、洗濯物がある場合は対象物との距離が短く、洗濯物がない場合は対象物との距離が長くなる違いを使い、洗濯物が干されているかを判定します。

このセンサの価格は612円になります。

温湿度センサ SHT31

smart-circulator_06

洗濯物が乾いたかの判定をする温湿度センサはSHT31を使用します。

このセンサの価格は1,216円になります。

以前、もう少し安い中国製の温湿度センサも使用したことがあり、精度も特に問題はありませんでしたが、温湿度情報をセンサから取得する通信の部分が独自の規格となっていて、プログラムが複雑になるので、今回はRaspberrPiに標準で搭載されているI2C通信を使って温湿度が取得できるセンサを選びました。

サーキュレータ ON/OFF用リレー

smart-circulator_07

サーキュレータの電源ON/OFFは、Amazonで購入したこちらのリレーを使用します。

RaspberryPiの出力電圧3.3Vで100Vの電源をON/OFF制御できるリレーを選びました。

価格は330円になります。

電気配線とケース

smart-circulator_08

今回製作する装置はコンセントとサーキュレータの電源プラグの間に設置して、サーキュレータの電源をON/OFF制御する予定なので、電気配線とコンセントプラグ、あとRaspberryPi Picoや各センサを納めるケースも準備しました。

購入部品の合計価格

部品価格ストア
RaspberryPi Pico550円マルツオンライン
HC-SR04612円マルツオンライン
SHT311,216円マルツオンライン
リレー330円Amazon
ケース660円マルツオンライン
コンセントプラグ107円Amazon
コンセント429円Amazon
電源ワイヤ370円Amazon
合計4,274円

コスト目標のSwtchBot 4,500円より安く部品を調達することができたので1つ目の目標はクリアです。

今回は温湿度センサに少し高価な部品を使用しましたが、500円程度で購入できるセンサもあるので、もう少しコストダウンをする余地はあると思います。

制御回路

次にRaspberryPi Picoと各センサ、リレーの接続につて紹介していきます。

smart-circulator_09

温湿度センサ SHT31

SHT31はI2C通信で温度と湿度の情報を取得するセンサなので、センサ側のシリアル通信端子(SCL,SDA)とRaspberryPiのSCL,SDA端子を接続します。

RaspberryPi Picoには複数のI2C通信端子がありますが、今回は基板への実装性とケースへ収納性を考慮して、RaspberryPi Picoの片面から全ての配線を接続できるよう、GP20とGP21端子のI2C通信端子を使用します。

またSCL,SDA端子以外にセンサへの電源供給用として、VCC端子へ3.3V、GND端子へGNDを接続します。

smart-circulator_10r

SHT31のデータシートには、SCLとSDAはオープンドレイン出力なので、プルアップ抵抗10kΩでレベル固定するように記載されていますが、今回購入したSHT31が実装されているDFRobotのテスト基板にはプルアップ抵抗が実装されているので、自分で製作する基板側ではプルアップ抵抗を省略します。

また、ALERTピンとnRESETピンは未使用の場合、フローティングを推奨と記載されているので、今回は未接続とします。

超音波センサ HC-SR04

HC-SR04はTrig端子に10μs以上のパルスを入力すると超音波を出力。出力した超音波が対象物に当り跳ね返ってきた音波がマイクで検出されるまでの時間をEcho端子にパルス出力します。

10μsのパルス出力とパルス時間の計測は、どちらもGP端子で実現できるので、今回はGP16,GP17端子を使用します。

またHC-SR04は、5V電源で動作しEcho端子も0-5Vのパルスが出力されます。RaspberryPiのGP端子は3.3Vの入出力となっていて、0-5Vのパルスを直接入力すると壊れる可能性があるので、1kΩと2kΩの抵抗で分圧してGP端子に入力します。

Vcc端子には5V電源、Gnd端子にはGNDを接続します。

リレー

今回使用したリレーは、DC+端子に5V、DC-端子にGNDを接続して、IN端子にGP端子から0-3.3Vの信号を入力することでリレーを制御することができます。

電源電圧は5Vですが、IN端子は電流で動作するようなので、3.3Vでも問題なく動作しました。

基板実装

smart-circulator_11

RaspberryPi Picoと温度センサ(SHT31)はユニバーサル基板へ実装、超音波センサ(HC-SR04)はケースの外側に取り付けるので、基板からワイヤー接続できるよう基板上ではピンヘッダに接続しておきます。

リレーも同様にワイヤー接続するので必要な端子をピンヘッダに接続しておきます。

smart-circulator_12制御基板表面

smart-circulator_13制御基板裏面

実際に製作した制御基板がこちらの写真になります。

先ほど記載した設計図より実際に使用したユニバーサル基板が2列ほど小さかったので、ワイヤを配線する面積が狭く、少し窮屈になりましたが、導通チェックで配線のショートなどはなかったので、今回はこれでいきたいと思います。

プログラム

プログラムは完全に素人なので、プログラムの構成やアルゴリズムのできが良いかどうかも分かりませんが、いちよう狙った通りの動作はしているので参考に紹介させて頂きます。

プログラムの構成

今回、2つのセンサと1つの出力(リレー)を制御するために、以下のようなプログラムの構成としています。

□関数
・温湿度センサから温度と湿度の情報を取得する関数
・超音波センサで対象物との距離を測定する関数
・超音波センサで測定した距離から洗濯物の有無を判定する関数
・リレーをONする関数
・リレーをOFFする関数

□メイン
洗濯物の有無をチェック
サーキュレータONからの経過時間計測
一定時間経過後の温度・湿度から洗濯物の乾燥状態を確認
乾燥していると判断すればサーキュレータOFF

以降、1つ1つの関数とメインのループを具体的に紹介してきます

温湿度センサから温度と湿度の情報を取得する関数

smart-circulator_14

1行目:RaspberryPi PicoでI/Oピンを使用する為のピンオブジェクトをインスタンスしています

4行目:温湿度センサ(SHT31)と通信する為のIDを変数に設定しています
※SHT31はICのADDR端子にLowを入力すると0x44,Highを入力すると0x45となり、今回は0x45で使用しているので、プログラム側もデバイスの設定に合わせたIDを指定します

5,6行目:I2C通信に使用するSDA,SCLにGP20とGP21を指定します

7行目:SHT31からデータを取得する為のメッセージをbufに準備しています
設定するメッセージは以下SHT31のデータシートを参照して準備します
消費電流や検出精度の違いで何種類かの測定モードが選べるようになっていて、今回はシングル測定モードのRepeatability:High, Clock stretching:enableでデータを取得します

smart-circulator_15

8行目:5,6行目で設定したピンを使って、周波数:400kHzでI2C通信をする準備をしています
※SHT31はデータシートより最大1000kHzでの通信ができるので、それ以下の周波数を指定します

11行目:事前に準備したデータ取得メッセージ(buf)をI2C通信で対象のID(I2C_ADDR)に送信します

12行目:SHT31からの返信を6byte分読み取りdata変数に格納します
※読み取ったデータは、上の図(データシート)に記載の通り、上位2byteが温度データ、CRCを挟んで、4byte目と5byte目が湿度データになります

15行目:1byte目のデータを8bitシフトして2byte目のデータと結合します

16行目:結合したデータを摂氏に変換します
※取得したデータを物理値(摂氏や湿度)へ換算する式は下記のようにデータシートに記載されています

smart-circulator_16

18行目:4byte目のデータを8bitシフトして5byte目のデータと結合します

19行目:結合したデータを湿度に変換します

21行目:取得したデータを物理値に換算した値を関数の呼び出し元に返します

超音波センサで対象物との距離を測定する関数

smart-circulator_17r

1行目:RaspberryPi PicoでI/Oピンを使用する為のピンオブジェクトをインスタンスしています

4,5行目:TrigとEcho端子に接続するGP端子の端子番号を変数に設定しています

7行目:TrigPinにTRIG変数に指定したGP端子番号の端子を出力端子として設定しています

8行目:EchoPinにECHO変数に指定したGP端子番号の端子を入力端子として設定しています

12行目:TrigPinにHighを出力します

13行目:10μsウエイトします

14行目:TrigPinにLowを出力します
※12~14行目のプログラムでTrigPin(GP17番ピン)に10μsのパルスを出力しています

16行目:EchoPinの入力値が0(Low)の間、16~17行目をループします

17行目:echo_riseレジスタに呼出し時点での稼働時間をマイクロ秒単位で代入します

18行目:EchoPinの入力値が1(High)の間、18~19行目をループします

19行目:echo_fallレジスタに呼出し時点での稼働時間をマイクロ秒単位で代入します
※16~19行目のプログラムでEchoPin(GP16番ピン)入力されるパルスをモニタし、パルスが立ち上がったタイミングの時間がecho_rise変数に、その後パルスが立ち下がったタイミングの時間がecho_fall変数に残るようにしています
次の21行目のプログラムでecho_fall – echo_riseを計算すると入力されたパルスのHigh時間を求めることができます

21行目:echo_fall – echo_riseをpulse_width変数に代入しています

22行明:21行目で求めたpulse_width×0.0343 / 2を計算しdistance変数に代入しています
※echo端子に入力されたパルス幅は超音波を出力してから、対象物に当たり跳ね返ってきた超音波を検出するまでの時間なので、音速343m/秒=0.0343cm/μsを掛け、往復分の時間なので2で割り、対象物との距離をcmに換算しています

23行目:換算した距離の情報を関数の呼び出し元に返します

残り3つの関数

以下3つの関数は規模が小さいのでまとめて説明します

・超音波センサで測定した距離から洗濯物の有無を判定する関数
・リレーをONする関数
・リレーをOFFする関数

smart-circulator_18r

1行目:RaspberryPi PicoでI/Oピンを使用する為のピンオブジェクトをインスタンスしています

4行目:リレーのIN端子に接続するGP端子の端子番号を変数に設定しています

5行目:RelContPinに先ほど変数に指定したGP端子番号の端子を出力端子として設定しいます

9行目:先ほど説明した超音波センサで対象物との距離を測定する関数から距離情報を取得しdistance変数に代入しています

10~13行目:先ほどdistance変数に代入した距離がTERGET_DISTANCEより短ければ、呼び出し元にTrueを返し、長ければFalseを返します
※TERGET_DISTANCE変数に、あらかじめ洗濯物との距離を入力しておき、測定した対象物との距離が設定した距離より短ければ洗濯物あり、長ければ洗濯物なしと判定してTrue/Flaseを返しています

17行目:RelContPinにHighを設定しリレーをONします

21行目:RelContPinにLowを設定しリレーをOFFします

メインループ

smart-circulator_19r

4~9行目:メインで使用する変数に初期値を代入しています

10行目:10~46行目を永久にループします
※45行目にスリープ関数が設定してありINTERVAL時間(実際に使用する場合は60秒)ごとにループ内のプログラムを1回実行しています

13~23行目:洗濯物の有無を判定する関数から洗濯物有無の情報を取得し、10回連続(1分に1回プログラムが実行されるので10回連続=10分間)洗濯物を検出した場合は、laundryFlagにTrueを代入して洗濯物があると判断、逆に10回連続で洗濯物がなしと判定した場合はlaundryFlagにFlaseを代入して洗濯物がないと判断する
※人が前を通過しただけで、洗濯物ありと判定しないように、10回連続=10分間洗濯物を検出して初めて洗濯物ありと判定する

26~43行目:洗濯物ありと判断した場合は、27~40行目のプログラムを実行、洗濯物なしと判断した場合は、42,43行目のプログラム(リレーOFFしてスタート時間に0を設定)を実行する

27~30行目:スタート時間が記録されていない場合(初めて洗濯物ありと判定したタイミング)は、スタート時間に今の稼働時間を代入、既にスタート時間が記録されている場合は、スタート時間から9時間(32400秒)経過しているか確認し、9時間経過していない場合はリレーのONを継続、9時間以上経過している場合は、32~40行目のプログラムを実行する

32~40行目:温度と湿度の情報を取得し、温度が22℃以上の場合は湿度閾値を60%RHに設定、22℃以下の場合は湿度閾値を50%RHに設定する。取得した湿度が設定した湿度閾値を下回っていたらリレーをOFFしてサーキュレータを止めます。湿度閾値を上回っている場合は、リレーをONしサーキュレータの動作を継続します

完成品

smart-circulator_21

こちらが完成品です。

本体から出ているプラグを通常のコンセントに接続、本体に付いているコンセントにサーキュレータのプラグを接続して、中に入っているリレーでサーキュレータの電源をON/OFFコントロールします。

smart-circulator_22r

 

こんな感じで、サーキュレータの隣に設置し、洗濯物の方向に超音波センサを向けて使用ます。

smart-circulator_20

ケースの中は、制御基板とリレー、あと手前の白いキューブ状の物は制御基板に電源を供給するACアダプタです。家に余っていたiPhone用の充電器を使いました。

ケースの左側がサーキュレータに接続するコンセントで、卓上埋め込みコンセントをネジで本体に固定しています。

ケースの上面についている超音波センサは角度が自由に変えられるよう、レゴブロックで角度をつけたいときに使うジョイント部品を間に挟んで本体に固定しています。

動作確認

smart-circulator_23

最後に動作確認です。

実際に使用する際は、製作したケース単体にサーキュレータを接続して使いますが、狙い通りの動作をしているか確認する為、動作確認の際はパソコンを接続しセンサで取得しているデータをモニタしながら動作を確認したいと思います。

smart-circulator_24

こちらが動作確認結果です。

まず洗濯物を10回連続で検出してサーキュレータをONする部分ですが、10回検出するまでに何回か洗濯物を検出できず、カウンターが下がっている部分があります。

ただトータル15回(15分)以内には、洗濯物が干されたと判断しサーキュレータをONできていて、ほぼ仕様通りの動作なのでOKとします。

そして洗濯物を検出してから9時間後に温度と湿度のモニターが始まっており、ここは仕様通りの動作となっています。

測定した温度は27℃と22℃以上なので、洗濯物が乾いたと判定する湿度は60%RHになります。

温湿度の計測を始めてから湿度が60%RHを下回った時点でサーキュレータをOFFしており、ここも仕様通りの動作ができていることが確認できました。

但し、湿度が少しづつ下がってきて60%RHを下回る際、60%前後を行き来するタイミングがあり、サーキュレータがON/OFFを繰り返すような動作をしているので、湿度の閾値にヒスを付けた方がよさそうです。

また1度湿度が60%RHを下回った後も、部屋の湿度が上昇するとサーキュレータを再度ONしていることが分かります。

多少プログラムの修正をした方が良い部分もありますが、概ね狙い通りの動作をしており、なかなか良いできではないかと自分では大満足しています。

まとめ

今回は自作IoTということで、洗濯物の乾燥状態を自動で検知してON/OFFするスマートサーキュレータを製作してみました。

今まで24時間稼働だったサーキュレータが、この装置のおかげで12~18時間くらいの稼働時間となり3~5割は電気代を節約できるようになったと思います。

ただサーキュレータの消費電力はそんなに大きくないので、製作費の\4,274円を回収するには、それなりの期間使用する必要があり製作費を回収する前に壊れないか少し心配ですが、つくるのは楽しかったですし、考えた通りにできて、かなり自己満足しているので、製作して良かったと思っています。

ちなみに流行でIoTという言葉を使いましたが、Iotは“Internet of Things”の略で、今までインターネットにつながっていなかったモノをつなげていくことを意味しています。今回製作した制御装置はインターネットに繋がるわけではないので、IoTというよりスマート家電といったほうが正確かもしれないですね。

今回紹介したスマートサーキュレータ以外にもRaspberryPiを使ってお家の環境測定をした記事なども書いているので、よかったらリンク先の記事も読んでみて下さい。

コメント

タイトルとURLをコピーしました