課程簡介

這是 2017 年在實踐大學開設的「聯網感測實作」課程,透過開心農場 IoT 專案學習完整的物聯網系統開發,從感測器、Arduino、MQTT 通訊到資料庫儲存。

課程特色

目標: 開發一個完整的智慧農場監控系統

專案主題:開心農場

  • 從 Arduino 擷取感測器資料傳送至 Server
  • 當溫度過低時開燈加熱
  • 當濕度過低時撒水
  • 當壓力過高時觸發防盜警報(菜被偷了!)
  • 警報時蜂鳴器響起並將狀態傳送至 Server

技術棧:

Arduino + 感測器 → MQTT Client → mosquitto Broker → MQTT Subscriber → MySQL Database

系統架構

完整的 IoT 架構

┌────────────────────────────────────┐
│     Arduino + 感測器 (Edge 端)      │
│                                    │
│  - 溫度感測器                       │
│  - 濕度感測器                       │
│  - 壓力感測器                       │
│  - LED 燈(撒水器、加熱器)          │
│  - 蜂鳴器(警報)                   │
│  - Arduino Ethernet Shield         │
│                                    │
│  → MQTT Client (Publisher)         │
└──────────────┬─────────────────────┘
               │ MQTT Protocol
               │ (Publish: sensor/data)
               ↓
┌────────────────────────────────────┐
│   mosquitto Broker (Server 端)     │
│                                    │
│  MQTT 訊息代理人                    │
│  - 接收來自 Arduino 的訊息          │
│  - 轉發給所有訂閱者                 │
└──────────────┬─────────────────────┘
               │ MQTT Protocol
               │ (Subscribe: sensor/data)
               ↓
┌────────────────────────────────────┐
│  PC Application (Subscriber 端)    │
│                                    │
│  C# / Unity + M2Mqtt               │
│  - 接收感測器資料                   │
│  - 顯示即時狀態                     │
│  - 儲存到 MySQL 資料庫              │
│  - 記錄異常事件                     │
│                                    │
│  MySQL Database:                   │
│  ├── 感測器資料記錄                 │
│  └── 異常事件記錄                   │
└────────────────────────────────────┘

設備需求

硬體設備

  • Arduino Uno:微控制器主板
  • 感測器模組
    • 溫度感測器
    • 濕度感測器
    • 壓力感測器
  • LED 燈 × 2:模擬撒水器和加熱器
  • 蜂鳴器:警報裝置
  • Arduino Ethernet Shield:網路通訊
  • 麵包板 + 線材:電路連接
  • 筆電:模擬伺服主機

軟體工具

  • Arduino IDE:Arduino 程式開發
  • mosquitto:MQTT Broker
  • MQTTLens:MQTT 測試工具(Chrome 擴充套件)
  • WampServer:Web Server + MySQL + PHP
  • Visual Studio / Unity:Client 端程式開發
  • M2Mqtt:.NET MQTT 函式庫

課程大綱

第一週 (05/10) - 伺服主機架設

千里之行,始於足下

學習內容:

  1. 課程介紹
    • 專案概述:開心農場 IoT 系統
    • 學習目標與成果展示
  2. MQTT 架構
    • MQTT 通訊協定介紹
    • Publisher(發佈者)
    • Subscriber(訂閱者)
    • Broker(代理人)
  3. mosquitto 安裝
    • MQTT Broker 安裝
    • 服務啟動與測試
  4. 開發工具安裝
    • MQTTLens 測試工具
    • 連接測試

第二週 (05/17) - MQTT 程式設計

一日之所需,百工斯為備

學習內容:

  1. M2Mqtt 函式庫安裝
    • .NET MQTT Client Library
    • Visual Studio / Unity 專案設定
  2. 訂閱者程式設計
    • 連接 MQTT Broker
    • 訂閱主題(Topic)
    • 接收訊息
  3. 發佈者程式設計
    • 連接 MQTT Broker
    • 發佈訊息至主題

程式範例:

// MQTT Subscriber
MqttClient client = new MqttClient("broker_address");
client.Connect("client_id");
client.Subscribe(new string[] { "sensor/data" }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE });
client.MqttMsgPublishReceived += client_MqttMsgPublishReceived;

// MQTT Publisher
MqttClient client = new MqttClient("broker_address");
client.Connect("client_id");
client.Publish("sensor/data", Encoding.UTF8.GetBytes("message"));

第三週 (05/24) - Arduino 感測器與輸出控制

積沙成塔,集腋成裘

學習內容:

  1. 感測器模組接線
    • 溫度、濕度、壓力感測器接線
    • 感測器函式庫安裝
  2. AnalogInput 程式設計
    • 讀取類比輸入(感測器數據)
    • 數據轉換與校正
  3. DigitalOutput 程式設計
    • LED 控制(撒水器、加熱器)
    • 蜂鳴器控制(警報)
  4. 加入判斷邏輯
    • 溫度低於閾值 → 開啟加熱器
    • 濕度低於閾值 → 開啟撒水器
    • 壓力高於閾值 → 觸發警報

Arduino 程式範例:

// 讀取感測器
int temperature = analogRead(A0);
int humidity = analogRead(A1);
int pressure = analogRead(A2);

// 判斷並控制
if (temperature < threshold_temp) {
    digitalWrite(LED_HEATER, HIGH);  // 開啟加熱器
}
if (humidity < threshold_humidity) {
    digitalWrite(LED_SPRINKLER, HIGH);  // 開啟撒水器
}
if (pressure > threshold_pressure) {
    digitalWrite(BUZZER, HIGH);  // 觸發警報
}

第四週 (05/31) - Arduino 網路通訊

積土成山,風雨興焉;積水成淵,蛟龍生焉

學習內容:

  1. Ethernet 與 PubSubClient 函式庫
    • Arduino Ethernet Shield 使用
    • MQTT Client 函式庫
  2. Ethernet 程式設計
    • 網路連線設定
    • IP 位址配置
  3. PubSubClient 程式設計
    • Arduino MQTT Client 實作
    • 連接 mosquitto Broker
    • 發佈感測器數據
  4. 功能測試
    • Arduino → mosquitto → MQTTLens
    • 完整訊息傳遞測試

Arduino MQTT 程式範例:

#include <Ethernet.h>
#include <PubSubClient.h>

EthernetClient ethClient;
PubSubClient client(ethClient);

void setup() {
    // 網路設定
    Ethernet.begin(mac, ip);

    // MQTT 設定
    client.setServer(mqtt_server, 1883);
    client.connect("arduino_client");
}

void loop() {
    // 讀取感測器
    int temp = analogRead(A0);

    // 發佈訊息
    String payload = "temp:" + String(temp);
    client.publish("sensor/data", payload.c_str());

    delay(5000);
}

第五週 (06/07) - MySQL 資料庫整合

滴水穿石,不是水多厲害,更不是石頭不厲害,而是時間太厲害

學習內容:

  1. WampServer 安裝
    • Apache + MySQL + PHP 環境
  2. 建置 MySQL 資料表
    • 感測器資料表
    • 異常記錄表
  3. 連結 MySQL 資料庫
    • C# / Unity 連接 MySQL
    • 資料庫查詢
  4. 新增資料至資料庫
    • 接收 MQTT 訊息
    • 寫入資料庫
  5. 程式生命週期管理
    • 關閉程式時中斷連線

資料表結構:

CREATE TABLE sensor_data (
    id INT AUTO_INCREMENT PRIMARY KEY,
    timestamp DATETIME,
    temperature FLOAT,
    humidity FLOAT,
    pressure FLOAT
);

CREATE TABLE alarm_logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    timestamp DATETIME,
    alarm_type VARCHAR(50),
    sensor_value FLOAT,
    description TEXT
);

第六週 (06/14) - 完整系統整合

種瓜得瓜,種豆得豆

學習內容:

  1. 建置 MySQL 資料表
    • 完整的資料表結構
    • 索引優化
  2. Server 連結資料庫
    • MQTT Subscriber + MySQL
    • 即時資料儲存
  3. 撒水和加熱記錄
    • 訊息記錄(正常操作)
    • 動作時間與持續時間
  4. 偷菜記錄
    • 異常記錄(警報事件)
    • 警報類型與處理

完整系統流程:

Arduino 感測器
→ MQTT Publish (sensor/data)
→ mosquitto Broker
→ MQTT Subscribe
→ 判斷閾值
→ 儲存 MySQL
→ 顯示介面更新

技術亮點

1. MQTT 輕量級通訊

為什麼選擇 MQTT?

  • ✅ 輕量級協定(低頻寬、低功耗)
  • ✅ 發佈/訂閱模式(解耦合)
  • ✅ QoS 服務品質保證
  • ✅ 適合 IoT 應用

MQTT 架構:

  • Publisher(Arduino):發佈感測器數據
  • Broker(mosquitto):訊息代理與轉發
  • Subscriber(PC Application):接收並處理數據

2. Arduino 感測器整合

多感測器協同工作:

  • 溫度感測器 → 控制加熱器
  • 濕度感測器 → 控制撒水器
  • 壓力感測器 → 觸發防盜警報

即時反饋控制:

感測 → 判斷 → 控制 → 警報 → 記錄

3. 資料持久化

MySQL 資料庫儲存:

  • 歷史數據查詢
  • 趨勢分析
  • 異常事件追蹤

4. 完整的 IoT 系統

邊緣裝置雲端服務的完整流程:

Edge (Arduino) → Gateway (Ethernet) → Broker (MQTT) → Application (C#) → Database (MySQL)

學習成果

學生將學會:

  1. IoT 系統架構
    • 邊緣運算概念
    • 通訊協定選擇
    • 系統整合設計
  2. Arduino 開發
    • 感測器讀取
    • 數位輸出控制
    • 網路通訊
  3. MQTT 通訊
    • MQTT 協定原理
    • Publisher/Subscriber 模式
    • Broker 部署與管理
  4. 資料庫應用
    • MySQL 設計
    • 資料持久化
    • 資料查詢與分析
  5. 完整專案開發
    • 需求分析
    • 系統設計
    • 實作與測試
    • 問題排查

應用場景

開心農場專案可以擴展到:

  • 🌱 智慧農業:溫室監控、精準灌溉
  • 🏠 智慧家居:環境監控、自動化控制
  • 🏭 工業 4.0:設備監控、預測性維護
  • 🌡️ 環境監測:空氣品質、氣象站
  • 🔒 安全監控:入侵偵測、警報系統

專案資源

完整教學網站: https://yazelin.github.io/usc2017nsp/

GitHub 開源專案: https://github.com/yazelin/usc2017nsp

Arduino Library: Arduino 函式庫下載

開發工具:

相關課程:


課程資訊

  • 學校:實踐大學
  • 課程名稱:聯網感測實作
  • 授課時間:2017 年 5 月 - 6 月(共 6 週)
  • 授課教師:Yaze Lin
  • 專案主題:開心農場 IoT 監控系統
  • 技術棧:Arduino + MQTT + C# + MySQL
  • 特色:完整的 IoT 系統、實際硬體操作、資料庫整合