工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

スマートプラントIoT:ArduinoとAzureで作る接続型グリーンハウス

必要な部品と材料

部品数量備考
Seeed Base Shield V21Groveモジュール接続用
Seeed Grove - Relay1ポンプ制御用
Seeed Grove - Temperature Sensor1温度測定用
Arduino UNO1メインマイコン
Helium Starter Kit (LEGACY)1Helium Atom + Element + Arduinoブレークアウト

使用クラウドサービス・ツール

プロジェクト概要

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: コンポーネント準備

ステップ2: Arduino + Helium + センサーのセットアップ

  1. Helium Network DashboardでAtomを登録
  2. Element(アクセスポイント)を登録・有効化
  3. 全センサーとHelium AtomをBase Shieldに接続
  4. Arduinoスケッチを書き込み(Heliumライブラリ使用、チャネル名"Azure IoT App"でデータ送信)

ポンプは12V駆動のため、Arduinoの5Vでは直接駆動不可。電源ラインから12V/GNDを分岐し、リレーでスイッチングします。

ステップ3: Helium HubとAzure IoT Hubの連携

  1. AzureポータルでIoT Hub作成(Standard/Freeティア)
  2. 共有アクセスポリシー「RegistryReadWrite」の接続文字列(主キー)を取得
  3. テスト用デバイスをIoT Hubに登録
  4. Helium Dashboardで「Connection」作成、接続文字列を貼り付け(他項目自動入力)
  5. MQTTトピックが自動生成され、Helium Atom ↔ Azure IoT Hub間で双方向通信可能に
  6. Helium CLIでテスト送信可能:helium channel send 1 "Hello Azure"

ステップ4: Azure SQL Databaseの構築

  1. SQL Database作成(Basicティアで十分)
  2. クエリエディタでテーブル作成:
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
)
  1. 接続文字列を取得(後のFunction設定で使用)

ステップ5: Azure Function Appの作成

  1. Function App作成(消費プラン推奨)
  2. Application SettingsにSQL接続文字列「sqldb_connection」を追加
  3. IoT Hub (Event Hub) トリガー関数:受信メッセージをパースしSQLにINSERT
  4. HTTP トリガー関数 (GET /api/smartplant):最新データをJSONで返却(Androidアプリ用)
  5. 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直結の構成図を参照。

リポジトリ

GitHub: smart-plant-iot

製造プロセス

  1. スマートゴミ箱:自動廃棄物管理のためのセルラーIoTソリューション
  2. スマートバーテンダー:Raspberry Pi駆動の自作カクテルステーション
  3. 農業に革命を:IoTが効率と持続可能性をどう推進するか
  4. スマート データ:IoTとビッグデータの次なるフロンティアをナビゲート
  5. GEアプライアンス、アラバマ州ディケーターにスマート・Industry 4.0対応冷蔵庫プラント完成
  6. 未来のスマート病院:インテリジェントソフトウェアが果たす重要な役割
  7. スマートシティがIoT、マイクロサービス、ダッシュボードで効率的な資産管理を実現する方法
  8. IoT投資のROIを最大化する:実践ガイド
  9. 堅牢なIoTエコシステムで実現する最適化スマート倉庫の構築
  10. スマートデバイスを守る:IoT安全のためのベストプラクティス
  11. 最先端IoTイノベーションと実用事例を探る