課程簡介
這是 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) - 伺服主機架設
千里之行,始於足下
學習內容:
- 課程介紹
- 專案概述:開心農場 IoT 系統
- 學習目標與成果展示
- MQTT 架構
- MQTT 通訊協定介紹
- Publisher(發佈者)
- Subscriber(訂閱者)
- Broker(代理人)
- mosquitto 安裝
- MQTT Broker 安裝
- 服務啟動與測試
- 開發工具安裝
- MQTTLens 測試工具
- 連接測試
第二週 (05/17) - MQTT 程式設計
一日之所需,百工斯為備
學習內容:
- M2Mqtt 函式庫安裝
- .NET MQTT Client Library
- Visual Studio / Unity 專案設定
- 訂閱者程式設計
- 連接 MQTT Broker
- 訂閱主題(Topic)
- 接收訊息
- 發佈者程式設計
- 連接 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 感測器與輸出控制
積沙成塔,集腋成裘
學習內容:
- 感測器模組接線
- 溫度、濕度、壓力感測器接線
- 感測器函式庫安裝
- AnalogInput 程式設計
- 讀取類比輸入(感測器數據)
- 數據轉換與校正
- DigitalOutput 程式設計
- LED 控制(撒水器、加熱器)
- 蜂鳴器控制(警報)
- 加入判斷邏輯
- 溫度低於閾值 → 開啟加熱器
- 濕度低於閾值 → 開啟撒水器
- 壓力高於閾值 → 觸發警報
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 網路通訊
積土成山,風雨興焉;積水成淵,蛟龍生焉
學習內容:
- Ethernet 與 PubSubClient 函式庫
- Arduino Ethernet Shield 使用
- MQTT Client 函式庫
- Ethernet 程式設計
- 網路連線設定
- IP 位址配置
- PubSubClient 程式設計
- Arduino MQTT Client 實作
- 連接 mosquitto Broker
- 發佈感測器數據
- 功能測試
- 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 資料庫整合
滴水穿石,不是水多厲害,更不是石頭不厲害,而是時間太厲害
學習內容:
- WampServer 安裝
- Apache + MySQL + PHP 環境
- 建置 MySQL 資料表
- 感測器資料表
- 異常記錄表
- 連結 MySQL 資料庫
- C# / Unity 連接 MySQL
- 資料庫查詢
- 新增資料至資料庫
- 接收 MQTT 訊息
- 寫入資料庫
- 程式生命週期管理
- 關閉程式時中斷連線
資料表結構:
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) - 完整系統整合
種瓜得瓜,種豆得豆
學習內容:
- 建置 MySQL 資料表
- 完整的資料表結構
- 索引優化
- Server 連結資料庫
- MQTT Subscriber + MySQL
- 即時資料儲存
- 撒水和加熱記錄
- 訊息記錄(正常操作)
- 動作時間與持續時間
- 偷菜記錄
- 異常記錄(警報事件)
- 警報類型與處理
完整系統流程:
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)
學習成果
學生將學會:
- IoT 系統架構
- 邊緣運算概念
- 通訊協定選擇
- 系統整合設計
- Arduino 開發
- 感測器讀取
- 數位輸出控制
- 網路通訊
- MQTT 通訊
- MQTT 協定原理
- Publisher/Subscriber 模式
- Broker 部署與管理
- 資料庫應用
- MySQL 設計
- 資料持久化
- 資料查詢與分析
- 完整專案開發
- 需求分析
- 系統設計
- 實作與測試
- 問題排查
應用場景
開心農場專案可以擴展到:
- 🌱 智慧農業:溫室監控、精準灌溉
- 🏠 智慧家居:環境監控、自動化控制
- 🏭 工業 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 系統、實際硬體操作、資料庫整合