皆さんのお宅に観葉植物はありますか? 「以前はあったけど枯らしてしまった」という方も多いのではないでしょうか?
植物の健康を維持するには水やりが大切です。
でも結構面倒ですね。毎日水をやるのも良くないという意見もあり適度に間隔をあけようと思っても「あれっ? この前はいつ水をあげたっけ?」となりがちです。
そんな時は観葉植物の鉢の土にどれくらい湿度があるか把握できれば適切な水やりのタイミングがつかめそうです。
そこで今回はArduinoに土壌水分センサを組み合わせて、観葉植物の鉢の土の湿度を測定してみます。
使用する土壌水分センサはシンプルな構造なのでこれから電子工作を学んでいこうという方にもちょうど良いデバイスでしょう。
目次
1. Arduinoで土の水分を計るには?
Arduinoと土壌水分センサを組み合わせれば、土に含まれる水分量を手軽に計れます。
土壌水分センサには「プローブ」と呼ばれる2本の電極があり、この電極を観葉植物の鉢の土に差し込むとプローブは抵抗のように作用します。
乾いた土はあまり電気を通さないため抵抗値は高くなります。
水分が与えられて土の湿度が上がると、徐々に電流が流れるようになり2本のプローブ間の抵抗値が下がります。
この様子をArduinoのA/D変換で観察すると電圧が高くなることがわかります。電圧の変化をスケッチで計測すると「土がどの程度乾燥しているか?」を判断できます。
本記事では土の乾燥具合に応じてLEDの明るさを変化させます。LEDが暗くなってきたら水やりのタイミングです。
2. 準備
以下のものを用意してください。
Arduino Uno
Arduino IDE
土壌水分センサ
LED
1本(色は何でも可)
抵抗
330Ω(LEDの破損防止用)
ブレッドボード
土壌水分センサにはさまざまなタイプの製品がありますが、土の乾燥度合いを測定する仕組みに大きな違いはありません。
しかしプローブ部分の材質には注意しましょう。材質によっては非常にさびやすいものがあり測定結果に影響が出ます。
土壌水分センサを選定する際はプローブがさびにくい材質のものをお勧めします。もしくは定期的に交換できる低価格なものを選択するのも良いでしょう。
上記に加えてブレッドボード用のジャンパワイヤ、USBケーブルが必要です。
作成した電子工作を実際に観葉植物に取り付ける際には、Arduinoボードに電源を供給する電源アダプターや電子工作全体が水で濡れないようにするケースも用意してください。
3. スケッチ
以下がスケッチ全体です。スケッチのあとに解説が続きます。
int sensorPin = A0; int moistureLevel ; int LED = 6; int sensorValue = 0; void setup() { Serial.begin(9600); } void loop() { sensorValue = analogRead(sensorPin); moistureLevel = map(sensorValue,0,550,0,255); Serial.println(sensorValue); delay(1000); analogWrite(LED, moistureLevel); }
ポイントを説明します。
最初の部分は変数を定義しています。
int sensorPin = A0; int moistureLevel ; int LED = 6; int sensorValue = 0;
変数sensorPinは土壌水分センサを取り付けるArduinoボードのピン番号です。
次のmoistureLevelは「土に含まれる水分量」を記録するための変数で、土壌水分センサから読み取った値をLEDの明るさに変換した値を格納します。
変数LEDはLEDを接続するArduinoボードのピン番号です。今回は6番ピンを使用します。
最後の変数sensorValueにはA/D変換から読み取った土壌水分センサの値が格納されます。
以下はsetup()関数です。
void setup() { Serial.begin(9600); }
setup()関数ではシリアルモニターの初期化のみ行います。土壌水分センサの値をシリアルモニターに送るために必要です。
以下はloop()関数の抜粋です。
sensorValue = analogRead(sensorPin); moistureLevel = map(sensorValue,0,550,0,255; Serial.println(sensorValue); delay(1000); analogWrite(LED, moistureLevel);
1行目は土壌水分センサの値の読み取りです。土壌水分センサの値はArduinoボードのA/D変換を通してスケッチに0から1023(1024段階)の整数値として送られます。
2行目はA/D変換の値をLEDの明るさに合わせて0から255までの値に変換します。A/D変換の値は0から1023なので本来は
moistureLevel = map(sensorValue,0,1023,0,255);
としますが(第3引数を「1023」)、使用した土壌水分センサの出力は最大でも550程度だったので、0から550までの値をLEDの明るさの0から255にmap()関数を使って変換します。
土壌水分センサの値は、その下のSerial.println()でシリアルモニターに送られます。map()関数に指定する値はシリアルモニターを見ながら決定してください。
続くdelay()関数でプログラムの実行を一時的に停止します。現在の設定値は1000ミリ秒(1秒)なので、概ねこの間隔でセンサを読み取りLEDの明るさを調整します。ただし一般的に土壌水分センサの値はそれほど頻繁に変化しません。ここの数字は使用するセンサに合わせて大きくした方が良いでしょう。
最後の行はLEDに、明るさに応じた電圧(PWM信号)を出力しています。
4. 配線
以下のように配線を行います。土壌水分センサは製品によって端子が異なる場合があるので、マニュアルを参照してください。
- ArduinoボードのGNDピンとブレッドボードの電源ライン[-]を接続
- ArduioボードのVccピンとブレッドボードの電源ライン[+]を接続
- 土壌水分センサのGNDピンとブレッドボードの電源ライン[-]を接続
- 土壌水分センサのVccピンとブレッドボードの電源ライン[+]を接続
- 土壌水分センサのSIGピンとArduinoボードのA0ピンを接続
- LEDのアノード(長い方)とArduinoボードの6番ピンを接続
- LEDのカソード(短い方)と抵抗(330Ω)の一端を接続
- 抵抗のもう一端とブレッドボードの電源ライン[-]を接続
以上で完了です。
土壌水分センサを観葉植物の鉢の土に挿してください。Arduino IDEのシリアルモニター上に1秒ごとに数字が表示されるはずです。
土壌水分センサを挿す位置を変えてみたり、鉢に水を与えたりした時にシリアルモニターに表示される数字が変化すれば成功です。数字に合わせてLEDの明るさが変わることも確認します。
本記事で使用した土壌水分センサの出力は最大で550(水を与えた状態)でした。シリアルモニターを確認しながら
moistureLevel = map(sensorValue,0,550,0,255);
の値を調整してください。
5. まとめ
今回は土壌水分センサについて説明しました。土壌水分センサは土の湿度を測定しますが、その仕組みはプローブ間の抵抗を測定するだけのシンプルなものです。
オームの法則を学習すれば原理も容易に理解できるでしょう。
電子機器の設計は複雑に感じるかも知れませんが、実はこういった簡単な仕組みの組み合わせがほとんどです。
まずはこういったシンプルなセンサ取り扱い方法を学ぶことで電子工作の基本をしっかりとマスターしていきましょう。