スマートプラントIoT:ArduinoとAzureで作る接続型グリーンハウス
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Seeed Base Shield V2 | 1 | Groveモジュール接続用 |
| Seeed Grove - Relay | 1 | ポンプ制御用 |
| Seeed Grove - Temperature Sensor | 1 | 温度測定用 |
| Arduino UNO | 1 | メインマイコン |
| Helium Starter Kit (LEGACY) | 1 | Helium Atom + Element + Arduinoブレークアウト |
使用クラウドサービス・ツール
- Microsoft Azure(IoT Hub, SQL Database, Functions)
- Microsoft Visual Studio 2015
プロジェクト概要
2019年中国-US Young Maker Competition向けに更新されたプロジェクトです。園芸を手間なく楽しめるよう、植物のセンサーデータをAzure IoT Hub経由でクラウドに送信し、Azure FunctionsでAzure SQL Databaseに蓄積。さらに自動・リモート両方で給水制御を行うエンドツーエンドのIoTシステムを構築します。
システム全体像
[植物センサー] → [Arduino + Helium Atom] → [Helium Element/Access Point]
→ [Helium Hub] → [Azure IoT Hub] → [Event Hub] → [Azure Function] → [Azure SQL]
↓
[HTTP Trigger Function] → [Android App / Web UI]
↑
[リモート給水コマンド] → [Helium] → [Arduino] → [Relay] → [Pump]
ステップ1: コンポーネント準備
- Arduino UNO + Seeed Grove Base Shield
- Helium Atom + Helium Element(セルラー版なら電源投入のみ)+ Arduinoブレークアウト
- センサー:温湿度(TH02)、土壌湿度、UVライト
- Grove OLEDディスプレイ(現地表示用)
- ペリスタルティックポンプ(12V駆動)+ リレー制御
ステップ2: Arduino + Helium + センサーのセットアップ
- Helium Network DashboardでAtomを登録
- Element(アクセスポイント)を登録・有効化
- 全センサーとHelium AtomをBase Shieldに接続
- Arduinoスケッチを書き込み(Heliumライブラリ使用、チャネル名"Azure IoT App"でデータ送信)
ポンプは12V駆動のため、Arduinoの5Vでは直接駆動不可。電源ラインから12V/GNDを分岐し、リレーでスイッチングします。
ステップ3: Helium HubとAzure IoT Hubの連携
- AzureポータルでIoT Hub作成(Standard/Freeティア)
- 共有アクセスポリシー「RegistryReadWrite」の接続文字列(主キー)を取得
- テスト用デバイスをIoT Hubに登録
- Helium Dashboardで「Connection」作成、接続文字列を貼り付け(他項目自動入力)
- MQTTトピックが自動生成され、Helium Atom ↔ Azure IoT Hub間で双方向通信可能に
- Helium CLIでテスト送信可能:
helium channel send 1 "Hello Azure"
ステップ4: Azure SQL Databaseの構築
- SQL Database作成(Basicティアで十分)
- クエリエディタでテーブル作成:
CREATE TABLE SmartPlant (
id bigint IDENTITY(1,1) NOT NULL,
Temperature int NOT NULL,
Humidity int NOT NULL,
Moisture int NOT NULL,
UVLight int NOT NULL,
DateCreated datetime DEFAULT CURRENT_TIMESTAMP
)
- 接続文字列を取得(後のFunction設定で使用)
ステップ5: Azure Function Appの作成
- Function App作成(消費プラン推奨)
- Application SettingsにSQL接続文字列「sqldb_connection」を追加
- IoT Hub (Event Hub) トリガー関数:受信メッセージをパースしSQLにINSERT
- HTTP トリガー関数 (GET /api/smartplant):最新データをJSONで返却(Androidアプリ用)
- HTTP トリガー関数 (ショートカット):クエリパラメータで直接INSERT(テスト用)
IoT Hubトリガー関数(C#)抜粋
public static async Task Run(string myIoTHubMessage, TraceWriter log) {
var map = myIoTHubMessage.Split('&')
.Select(x => x.Split('='))
.ToDictionary(x => x[0], x => x[1]);
String Temperature = map["Temperature"];
String Humidity = map["Humidity"];
String Moisture = map["Moisture"];
String UVLight = map["UVLight"];
var str = ConfigurationManager.ConnectionStrings["sqldb_connection"].ConnectionString;
using (SqlConnection conn = new SqlConnection(str)) {
conn.Open();
var text = "INSERT INTO dbo.SmartPlant (Temperature, Humidity, Moisture, UVLight) VALUES ("
+ Temperature + ", " + Humidity + ", " + Moisture + ", " + UVLight + ");";
using (SqlCommand cmd = new SqlCommand(text, conn)) {
var rows = await cmd.ExecuteNonQueryAsync();
log.Info($"{rows} rows were updated");
}
}
}
ステップ6: UI(Androidアプリ)
4つのセンサー値を60秒間隔で表示、リモート給水ボタンを備えたシンプルなAndroidアプリで監視・操作可能。
おまけ: Alexa連携
音声で植物状態確認・給水指示が可能(実装詳細は省略)。
Arduinoスケッチ(完全版)
#include "Arduino.h"
#include "Board.h"
#include "Helium.h"
#include "HeliumUtil.h"
#include <TH02_dev.h>
#include "Wire.h"
#include <SeeedGrayOLED.h>
#include <avr/pgmspace.h>
#define CHANNEL_NAME "Azure IoT App"
Helium helium(&atom_serial);
Channel channel(&helium);
int relay = 5;
void setDisplayToOriginalState() {
SeeedGrayOled.init(SSD1327);
}
void setup() {
Serial.begin(9600);
pinMode(relay, OUTPUT);
delay(150);
TH02.begin();
delay(100);
Serial.println("TH02_dev is available.\n");
helium.begin(HELIUM_BAUD_RATE);
helium_connect(&helium);
channel_create(&channel, CHANNEL_NAME);
Wire.begin();
}
void loop() {
// センサー読み取り(32回平均でノイズ低減)
int moisture = 0;
for (int i = 0; i < 32; i++) moisture += analogRead(A0);
int uvlight = 0;
for (int i = 0; i < 32; i++) uvlight += analogRead(A1);
float temper = TH02.ReadTemperature();
float humidity = TH02.ReadHumidity();
// Helium形式でデータ送信
String dataString = "Moisture=" + String(moisture) + "&UVLight=" + String(uvlight)
+ "&Temperature=" + String(temper) + "&Humidity=" + String(humidity);
char data[dataString.length()];
dataString.toCharArray(data, dataString.length());
channel_send(&channel, CHANNEL_NAME, data, strlen(data));
Serial.println(data);
// OLED表示
setDisplayToOriginalState();
SeeedGrayOled.clearDisplay();
SeeedGrayOled.setNormalDisplay();
SeeedGrayOled.setVerticalMode();
SeeedGrayOled.setTextXY(0, 0);
SeeedGrayOled.putString(("Moisture: " + String(moisture)).c_str());
SeeedGrayOled.setTextXY(2, 0);
SeeedGrayOled.putString(("UVLight: " + String(uvlight)).c_str());
SeeedGrayOled.setTextXY(4, 0);
SeeedGrayOled.putString((String(temper) + " C").c_str());
SeeedGrayOled.setTextXY(6, 0);
SeeedGrayOled.putString(("Humid: " + String(humidity)).c_str());
// 自動給水判定(湿度閾値未満で5秒給水)
if (moisture < 100) {
digitalWrite(relay, HIGH);
delay(5000);
digitalWrite(relay, LOW);
}
delay(60000); // 60秒待機
}
回路図
HeliumアーキテクチャによるIoTデバイス→Azure IoT Hub直結の構成図を参照。
リポジトリ
製造プロセス
- スマートゴミ箱:自動廃棄物管理のためのセルラーIoTソリューション
- スマートバーテンダー:Raspberry Pi駆動の自作カクテルステーション
- 農業に革命を:IoTが効率と持続可能性をどう推進するか
- スマート データ:IoTとビッグデータの次なるフロンティアをナビゲート
- GEアプライアンス、アラバマ州ディケーターにスマート・Industry 4.0対応冷蔵庫プラント完成
- 未来のスマート病院:インテリジェントソフトウェアが果たす重要な役割
- スマートシティがIoT、マイクロサービス、ダッシュボードで効率的な資産管理を実現する方法
- IoT投資のROIを最大化する:実践ガイド
- 堅牢なIoTエコシステムで実現する最適化スマート倉庫の構築
- スマートデバイスを守る:IoT安全のためのベストプラクティス
- 最先端IoTイノベーションと実用事例を探る