M5Stickに水分センサを付けて洗濯物乾き具合をチェック
第1回:洗濯物の取り込みを教えてくれるスマートな洗濯バサミを作ろう!
こんにちは、ヨシケンです!
今回の連載では、小型のArduinoのM5Stick-Cシリーズを使って最先端洗濯バサミを作っていきます。第2回となる今回は、洗濯に適した状況か、M5Stickに温湿度センサを付けて洗濯指数を計算してみましょう。また、水分センサをつけて、洗濯物の乾き度合いを測れるようにしてみます。
今回の記事で必要な物一覧
今回のM5Stick-Cを使ったもの作りに必要な部品は以下のようになっています。
M5Stick-C
ESP32に小型ディスプレイを搭載したArduino互換機。ボタン、BLE、Wifiおよびモーションセンサなども始めから入っている。
水分センサ
接触物の水分量を計測
DHT11 温湿度センサ
温度と湿度を同時に計測できる安価なデジタルセンサ
今回の記事の流れ
1. 温湿度センサをつけて洗濯指数を計測
最先端洗濯バサミを作るにあたり、M5Stickに各種センサを取り付けて、外の環境を計測できるようにします。
まず、外気の気温と湿度を測って、洗濯に適した条件か見てみましょう。その際、よく天気予報などで出てくる洗濯指数も測れたら面白いと思います。ちなみに洗濯指数は各種計算方法があるそうですが、以下式により求められるようです。
{ 0.81 x 気温 + 0.01 x 湿度 x (0.99 x 気温 – 14.3) + 46.3 }
この洗濯指数が60から70以上だと洗濯物が乾く条件が高く、洗濯に適している天候と言えるようです。つまり、気温と湿度が分かれば計算できるという事で、M5Stickに温湿度センサをつけて、洗濯指数を出力してみようと思います。
温湿度センサは各種ありますが、温度も湿度も同時に測れるこちらのDHT11というセンサを使います。デジタルセンサで、安価なのでとても手軽に使えるセンサです。
下の図のように、M5Stickは上下に各種端子が並んでおり、裏面にピン配置が書かれています。数字は、ArduinoのGPIO(入出力ピン)番号と対応しています。上部は8本のピンがあり、ここに温湿度センサをつなぐようにします。
このDHT11では、右からGND、NA (未使用)、OUT、VDOの4本の端子が出ています。各端子とM5Stickを、以下表と写真のようにケーブルでつなぎます。
センサ側端子 (右から) | M5Stick側(側部) |
GND | GND (黒) |
NA | 未使用 (赤) |
OUT | GPIO0 (白) |
VDO | 3.3V (黄色) |
次にソフトウェアの設定をおこないます。このDHT11を簡単に使うためのライブラリがありますので、それを適用します。スケッチを書くためのArduino IDEを立ち上げて、そのメニューからスケッチ、ライブラリのインクルードを選びます。ここでこちらのサイトからライブラリをZip形式でダウンロードします。
https://github.com/adafruit/Adafruit_Sensor
ZIP形式ライブラリをインストールのメニューから、このZipファイルをインストールします。また、ライブラリを管理メニューから、DHT11を検索し、これもインストールします。
これでDHT11を使うためのソフトウェアとライブラリの準備ができたので、温湿度を計測するための簡単なスケッチを作成します。
[ M5Stick_Temp.ino ]
#include <M5StickC.h> #include <DHT.h> const int PIN_DHT = 0; DHT dht(PIN_DHT,DHT11); void setup() { M5.begin(); M5.Lcd.setRotation(3); M5.Lcd.setTextSize(2); dht.begin(); } void loop() { delay(3000); float humidity = dht.readHumidity(); float temperature = dht.readTemperature(); M5.Lcd.fillScreen(BLACK); M5.Lcd.setCursor(10, 0); //文字表示の左上位置を設定 M5.Lcd.setTextColor(WHITE); // (WHITE, BLACK, RED, GREEN, BLUE, YELLOW...) M5.Lcd.printf("Temp"); M5.Lcd.setCursor(10, 40); M5.Lcd.setTextColor(GREEN); M5.Lcd.print(" Humid:"); M5.Lcd.print(humidity,0); M5.Lcd.print("%"); M5.Lcd.setCursor(10, 60); M5.Lcd.setTextColor(RED); M5.Lcd.printf(" Temp:"); M5.Lcd.print(temperature,0); M5.Lcd.print("C"); }
このプログラムの最初で、M5Stackのライブラリと、先ほどインストールしたDHTライブラリを読み込みます。DHT11のOUTピンとしてGPIO0番につないだので、それを指定します。3秒毎にDHT11から湿度と温度を取得します。最後にM5Stick上に色などを変えて、各数値を表示します。
それではこのスケッチをM5Stackに流し込みます。
適用が成功すると、下の写真のように、湿度と温度を表示できるようになりました。
2. 水分センサの接続
では次に、洗濯物の乾き度合いを測るための水分センサを付けることにします
洗濯物の乾き度合いを測るのには、写真のようなGrove端子が付いた水分センサを使います。このセンサは電極上での水分量が多いほど抵抗値が下がり、これを電気信号で取得しています。
端子との接続は以下のようになっています。
センサ側端子 (右から) | M5Stick側 |
OUT | 33 (黄) |
NA | 未使用 (白) |
VCC | 3.3V (赤) |
GND | GND (黒) |
このセンサは以下写真のように、M5Stickの下側のGrove端子という4本が一体となったケーブルで接続します。このGrove端子では、各ケーブルの接続やGPIOを気にすることなく、単純につなぐだけで接続できるのでとても簡単ですね。
ハードウェアの接続ができたら、水分量計測のために、以下のようなスケッチを書いてみます。
[ M5Stick_Water.ino ]
#include <M5StickC.h> #define WATER_SENSOR 33 void setup() { Serial.begin (9600); pinMode(WATER_SENSOR, INPUT); M5.begin(); M5.Lcd.setRotation(3); M5.Lcd.setTextColor(BLUE); // (WHITE, BLACK, RED, GREEN, BLUE, YELLOW...) M5.Lcd.setTextSize(2); } void loop() { M5.Lcd.fillScreen(WHITE); M5.Lcd.setCursor(10, 10); //文字表示の左上位置を設定 M5.Lcd.printf("Water Sensor"); M5.Lcd.setCursor(10, 30); M5.Lcd.print(digitalRead(WATER_SENSOR)); if ( digitalRead(WATER_SENSOR) == 0 ) { M5.Lcd.printf(": WATER!"); } else { M5.Lcd.printf(": NO WATER"); } Serial.println(digitalRead(WATER_SENSOR)); delay(500); }
Grove端子でつないだGPIO33を、WATER_SENSOR という変数に設定します。では、このスケッチをM5Stickに書き込みます。
この水分センサは、水分を検知するとこのセンサ値が0になるので、この時“WATER!”という文字を出すようにしています。センサに何もついていない状態だと、センサの値は1を出力し、水分がないことを意味します。
ではセンサに少し水をつけてみます。上の写真の水色の部分に少し水滴がついているのが分かると思います。そうすると、センサは0を出力し、M5Stickに以下のように0: WATER! と表示されました。
これでGrove端子につながった水分センサで、湿っているかどうかを計測することができるようになりました。
3. 2つのセンサを付けて外で測ってみよう
M5Stickに水分センサと温湿度センサの設定ができたので、両方をつけて計測してみましょう。
温湿度センサと水分センサのスケッチを両方記述したスケッチを作ります。先ほどの洗濯指数の計算も入れて、表示させます。計算式はこのようになっています。
laundry_index = ( 0.81*temperature+0.01*humidity*(0.99*temperature-14.3)+46.3 )
以下のようなM5Stack_LaundryスケッチをM5Stickに書き込みます。
[ M5Stack_Laundry.ino ]
#include <M5StickC.h> #define WATER_SENSOR 33 #include <DHT.h> const int PIN_DHT = 0; DHT dht(PIN_DHT,DHT11); void setup() { Serial.begin (9600); pinMode(WATER_SENSOR, INPUT); dht.begin(); M5.begin(); M5.Lcd.setRotation(3); M5.Lcd.setTextSize(2); } void loop() { float humidity = dht.readHumidity(); float temperature = dht.readTemperature(); M5.Lcd.fillScreen(BLACK); M5.Lcd.setCursor(10, 0); //文字表示の左上位置を設定 M5.Lcd.setTextColor(WHITE); // (WHITE, BLACK, RED, GREEN, BLUE, YELLOW...) M5.Lcd.printf("Water Laundry"); M5.Lcd.setCursor(10, 20); M5.Lcd.setTextColor(BLUE); M5.Lcd.print(digitalRead(WATER_SENSOR)); if ( digitalRead(WATER_SENSOR) == 0 ) { M5.Lcd.printf(":WATER!"); } else { M5.Lcd.printf(":NO WATER"); } Serial.println(digitalRead(WATER_SENSOR)); M5.Lcd.setCursor(10, 40); M5.Lcd.setTextColor(GREEN); M5.Lcd.print("H:"); M5.Lcd.print(humidity,0); M5.Lcd.print("%"); M5.Lcd.setTextColor(RED); M5.Lcd.printf(" T:"); M5.Lcd.print(temperature,0); M5.Lcd.print("C"); float laundry_index = ( 0.81*temperature+0.01*humidity*(0.99*temperature-14.3)+46.3 ); M5.Lcd.setCursor(10, 60); M5.Lcd.setTextColor(YELLOW); M5.Lcd.printf("LAUNDRY: "); M5.Lcd.print(laundry_index,0); delay(1000); }
このスケッチをM5Stickに流し込んで、起動させましょう。まずはそのまま室内で計測します。
それでは洗濯バサミにつけて、外で使ってみましょう。
※太陽の光で見えづらいため、右側の写真は画像をはめ込んだイメージカットです。
見えづらいですが、まだ乾いていないタオルにつけると、水分を検知して濡れていることを表示しています。今日は気温も湿度も洗濯に適した日で、よく乾きそうですね!
4. まとめ
今回の連載ではM5Stickを使った最先端洗濯バサミを作り始めています。M5Stickに、水分センサや温湿度センサなどを接続して、外の状況、環境を計測できるようにしています。水分の計測はちゃんと反応しているようです。
次回はインターネットに接続して、お天気情報なども取得してみようと思います。急な天気の変化にも対応できる最先端な洗濯バサミにしていきたいと思います。
お楽しみに!
今回の連載の流れ
第1回:洗濯物の取り込みを教えてくれるスマートな洗濯バサミを作ろう!
第2回:M5Stickに水分センサを付けて洗濯物乾き具合をチェック(今回)
第3回:インターネットに接続して天気予報から取り込みタイミングをお知らせ!
第4回:省電力化して最先端スマート洗濯バサミの完成!