Arduino UNOとRaspberry Piでスマート自動ガーデンシステムを構築
必要なパーツと用品
| Arduino UNO | ×1 |
| Raspberry Pi 2 Model B(他のモデルでも可) | ×1 |
| Raspberry Pi カメラモジュール | ×1 |
| Arduino Ethernet Shield 2 | ×1 |
| リレー(汎用) | ×1 |
| ワイヤーケーブル | ×1 |
| フォトレジスタ(光センサー) | ×1 |
| 水ポンプ | ×1 |
| ファン(PC用流用) | ×1 |
| 汎用NPNトランジスタ | ×1 |
| MicroSDカード(16GB、タイムラプス用) | ×1 |
アプリとオンラインサービス
| Arduino IDE |
| Raspberry Pi Raspbian |
| win32diskimager |
| PuTTY |
| myDevices Cayenne |
このプロジェクトについて
これは私の自動ガーデン第2弾プロジェクトですが、今回はすべてCayenneで制御するため、はるかに簡単になりました。また、植物の成長をタイムラプス動画で記録するためにRaspberry Piを追加しました。
Arduinoのセットアップ
ガーデンを監視するためにいくつかのデバイスを使用します。開始前に、EthernetシールドをArduinoに接続することを忘れないでください。
接続
土壌水分センサー:
植物が水を必要としているかチェックします。
- VCC: 5V
- GND: GND
- A0: A1
ファン:
温度が高くなりすぎたら作動、または新鮮な空気を送るために使用。
- 抵抗からピン3へ配線
- ファンのGNDをトランジスタの中央ピン(コレクタ)へ
- ファンの+をリレー(中央ピン)へ、トランジスタの最後のピン(エミッタ)をGNDへ
- ダイオードをトランジスタ中央ピンとGNDの間に接続
水ポンプ:
土壌水分センサーと連動して作動。
- +をリレー中央ピンへ、GNDを電源のGNDへ
フォトレジスタ(オプション):
室内の光量が十分か測定します。
- 一方を抵抗とともにA0へ、もう一方を5Vへ
照明:
- アノード(+)をリレーへ、もう一方を電源のGNDへ
湿度/温度センサー:
Cayenneで正しく動作させるにはコードが必要です。
- VCC: 3.3V
- GND: GND
- DAT: デジタルピン8
水位センサー:
- VCC: 5V
- GND: GND
- SIG: A2
最終組み立て
Fritzingに4チャネルリレーのパーツがなかったため、グラフィックでは2個のリレーを使用しています。実際は1個の12V電源で、プラスとマイナスの線を分岐し、プラス側から3本のワイヤーをハンダ付けして各リレーに接続しています。すべてが同時に動作するわけではないので1つの電源で十分です。
Arduino用に5V電源を使用。リレー接続:
- VCC: 5V
- GND: GND
- IN1: ピン2 - 照明ON
- IN2: ピン5 - 水ポンプON
- IN3: 未使用
- IN4: ピン4 - ファンON
Cayenneのセットアップ
Cayenneの設定方法を見てみましょう。非常に簡単です。
- まずこちらでアカウント作成
- EthernetシールドをRJ45ケーブルで接続
- 以下はCayenne接続用コードと湿度/温度センサー設定用コード
このコードはW5100シールド用です。他のEthernet/WiFiシールド用コードはCayenneサイトで入手可能です。アカウント作成後に取得できるトークンを忘れずに追加してください。
#include "DHT.h"
//#define CAYENNE_DEBUG // デバッグ表示有効化
#define CAYENNE_PRINT Serial // これをコメントアウトするとプリント無効化、メモリ節約
#include // または適切なシールド用ライブラリ
#define DHTPIN 8
#define DHTTYPE DHT22
#define VIRT_TEMP V1
#define VIRT_HUM V2
char token[] = "your_token";
DHT dht(DHTPIN, DHTTYPE);
unsigned long prev_DHT_refresh, interval_DHT_refresh = 1000;
void setup() {
Serial.begin(9600);
Cayenne.begin(token);
dht.begin();
}
void loop() {
Cayenne.run();
getDhtValues();
}
void getDhtValues() {
unsigned long now = millis();
if (now - prev_DHT_refresh > interval_DHT_refresh) {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (!isnan(h) && !isnan(t)) {
Cayenne.virtualWrite(VIRT_HUM, h);
Cayenne.celsiusWrite(VIRT_TEMP, t);
}
prev_DHT_refresh = now;
}
}
Cayenneでのデバイス登録
Arduino側はほぼ完了。今度は簡単な部分:Cayenneにすべてのデバイスを追加します。
デバイス追加 → カスタムウィジェット
好みのウィジェットタイプを選択。湿度と水位にはチャート、その他は値表示を使用。湿度/温度センサーはバーチャルピンを使用:
- 温度: Vpin1
- 湿度: VPin2
その他のデバイスはバーチャルピンではなく、接続されているピンに対応するアナログピンを選択。アクチュエータ(照明/ファン/水ポンプ)も同様に、Arduinoのリレー接続ピンを選択。
イベントとトリガー
ダッシュボードができたらトリガーを設定:
- 水ポンプ: 土壌水分が乾燥しすぎたらポンプON。開始用と停止用の2つのトリガーを設定。
- 水位: 値が高い=水不足。メールアラートを送信。
- イベント: 朝に照明ON、夜に照明OFF、ファンON/OFFの計4つをスケジュール設定。
Raspberry Piのセットアップ
植物の成長をタイムラプス撮影します。
必要な3つのソフトウェア:
- Raspbian
- Win32DiskImager(SDカードにイメージ書き込み)
- PuTTY(SSHでリモート接続)
Win32DiskImager:
- 「Device」でSDカードを選択(通常デフォルトでOK)
- フォルダアイコンをクリックし、ダウンロードしたRaspbian Jessieイメージを選択
- 「Write」クリックで完了。SDカードをRaspberry Piに挿入
PuTTY:
- Raspberry PiにLANケーブル接続
- Raspberry PiのIPアドレスを特定(ルーター管理画面で確認、またはモニター/キーボード接続で
ifconfig実行) - PuTTYにIPアドレス入力(例:192.168.0.3)して接続
- 信頼確認で「はい」
- ログイン:
pi, パスワード:raspberry
Raspberry Piが起動したら、以下のコマンドでアップデート:
sudo apt-get update
sudo apt-get upgrade
VNC(リモートデスクトップ):
モニターがない場合はVNCでリモート操作:
sudo apt-get install tightvncserver
vncserver :1
PCにVNC Viewerをインストールし、IP:1(例:192.168.0.3:1)で接続。
Cayenne: CayenneでもRaspberry Piをリモート制御可能。インストール:
wget https://cayenne.mydevices.com/dl/rpi_03wl1tt4nt.sh
sudo bash rpi_03wl1tt4nt.sh -v
タイムラプス撮影
カメラを有効化:
sudo raspi-config
「Enable Camera」を選択。画像保存用フォルダ作成:
cd /home/pi/Desktop
mkdir timelapse
Webカメラ(またはPiカメラ)接続後、1時間ごとに撮影するスクリプト作成:
cd /home/pi/Desktop
nano timelapse.sh
以下を貼り付け:
SAVEDIR=/home/pi/Desktop/timelapse/
while [ true ]; do
filename=-$(date -u +"%d%m%Y_%H%M-%S").jpg
/opt/vc/bin/raspistill -o $SAVEDIR/$filename
sleep 3600;
done
実行権限付与:
chmod +x timelapse.sh
結論
チュートリアルは長くなりましたが、やることはシンプル:いくつかのデバイスを接続し、プラットフォームを設定するだけです。写真では配線がごちゃごちゃしています。ワイヤーが長すぎました。植物が育ちきったらタイムラプスの結果を公開予定です。
アドバイス:
Ethernetシールドで「DHCP fail」エラーが出ることがあります。Arduinoフォーラムで解決策を見つけました:ランダムな場所に100Ω抵抗を2本ハンダ付けして、読者を困らせましょう(冗談です。実際の対処法はフォーラム参照)。
コードスニペット
コードスニペット #1 (Arduino)
#include "DHT.h"
//#define CAYENNE_DEBUG
#define CAYENNE_PRINT Serial
#include
#define DHTPIN 8
#define DHTTYPE DHT22
#define VIRT_TEMP V1
#define VIRT_HUM V2
char token[] = "your_token";
DHT dht(DHTPIN, DHTTYPE);
unsigned long prev_DHT_refresh, interval_DHT_refresh = 1000;
void setup() {
Serial.begin(9600);
Cayenne.begin(token);
dht.begin();
}
void loop() {
Cayenne.run();
getDhtValues();
}
void getDhtValues() {
unsigned long now = millis();
if (now - prev_DHT_refresh > interval_DHT_refresh) {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (!isnan(h) && !isnan(t)) {
Cayenne.virtualWrite(VIRT_HUM, h);
Cayenne.celsiusWrite(VIRT_TEMP, t);
}
prev_DHT_refresh = now;
}
}
コードスニペット #9 (Shell)
SAVEDIR=/home/pi/Desktop/timelapse/
while [ true ]; do
filename=-$(date -u +"%d%m%Y_%H%M-%S").jpg
/opt/vc/bin/raspistill -o $SAVEDIR/$filename
sleep 3600;
done
製造プロセス
- LIRCでプロフェッショナルなRaspberry Piユニバーサルリモコンを構築
- Raspberry PiでRFをDCに変換: エンベロープ検波器の構築とトラブルシューティング
- Cycle Chaser: Raspberry Piで自転車をナイトタイムライトショーに変身
- Raspberry Piベースの泥棒検知器を構築 - ステップバイステップガイド
- Raspberry Pi、MCP9808、InfluxDB、Grafanaで作る家庭温度モニター
- Raspberry Piで構築するホームオートメーションシステム:リモート制御対応
- Raspberry PiとWebダッシュボードで作る自動植物水やりシステム
- MrRobot: Ubuntu Mobile で操作する Rapiro ロボット – 音声、タッチ、シェイクインタラクション
- DIY Wall-E 風 Raspberry Pi CD ボックスロボット
- Bluetooth 制御 Raspberry Pi ロボットに音声フィードバックを追加して構築
- Arduino & Raspberry Pi でインターネット制御ビデオストリーミングロボットを構築