ECCH8:程式編寫在現實生活的應用

重點:傳感器數據、界定值與雜訊處理、擴充模組/函式庫、事件處理器與事件驅動程式(附 8 個 Check Point + 20 題偽代碼 → Python 練習)

8.1課題定位與學習目標

重點

  • 理解「程式與實物互動」:輸入來自傳感器(亦常稱感應器),輸出可控制裝置或顯示資訊。
  • 能以系統角度描述互動程式:清楚列出輸入、處理、輸出,以及觸發條件(事件)。
  • 能以簡單條件與狀態變量設計規則(例如:偏暗且有人 → 開燈)。
  • 能使用擴充模組/函式庫提供的應用程式界面(API),把硬件互動封裝成可呼叫的函式。

本章的核心,是把「現實情境」轉化為可實作的程式:你要先能夠清楚描述系統要做甚麼,然後把輸入、處理、輸出及觸發條件整理好,再落實成可讀的程式結構。對學生而言,最常見的難點並不是語法,而是如何把情境拆解成清晰的規則

因此,學習時應先用「一句話規則」練習,例如「偏暗而且有人→開燈」。當你能把規則拆成變量與條件,再逐步加入真實世界常見因素:讀數抖動、延時、手動優先、模式切換等,你的程式就會更像真實系統。

同時,本章會強調使用擴充模組/函式庫,因為真實世界的硬件互動往往已被封裝成易用的函式呼叫。你需要理解如何正確使用應用程式界面(API),並在出錯時懂得基本的排查與除錯(debug)方向。

甚麼是「創客文化」(Maker Culture)

「創客文化」是一種強調動手做(hands-on)、快速試作(prototype/原型)、反覆改良(iterate/迭代),以及分享交流(community sharing)的學習與創作文化。創客不一定是工程師或專家;重點在於把想法落地,透過材料、工具與程式,把「概念」變成「可運作的作品」,例如:自動澆水裝置、智能門鎖、溫濕度監測器、手作機械臂等。

創客文化常見特色包括:

連結本章:本章講的「感測器數據→界定值→事件→輸出控制」,正正就是創客把點子變成作品時最常用的系統思維。

Check Point 1:本章在做甚麼?

(載入中…)



        
      

8.2互動程式的系統模型:輸入-處理-輸出循環(IPO)與數據流程圖(DFD)

重點

  • 能用輸入-處理-輸出循環(Input-Process-Output (IPO) cycle)描述系統整體流程。
  • 能用數據流程圖(Data Flow Diagram (DFD))把「數據從哪裡來、經過甚麼處理、去到哪裡」畫清楚。
  • 知道 DFD 著重「數據流」,而流程圖(flowchart)著重「控制流程」。

當我們設計互動程式時,最重要不是先寫語法,而是先把系統拆解。輸入-處理-輸出循環(Input-Process-Output (IPO) cycle)提供了一個最直接的框架:外界給你甚麼(輸入)→ 你做甚麼判斷/計算(處理)→ 你回應甚麼(輸出)。只要能清楚列出三者,很多「寫到一半唔知點算」的情況就會大幅減少。

而數據流程圖(Data Flow Diagram (DFD))則幫你把「數據點樣流」畫出來。對傳感器系統而言,數據來源常是傳感器或使用者,數據接收器可以是顯示器或控制裝置。當你能用 DFD 表達清楚數據流,你就更容易決定程式中需要哪些變量、哪些函式,以及哪些地方需要做轉換(例如把 0–1023 轉成百分比)。

學習上可以先用文字版 DFD 練習:用一句句「A 的數據流入 B,再由 B 輸出到 C」描述;熟習後再畫圖。關鍵並不在畫得美不美,而在於數據流是否合理、是否足以支持你的程式設計

Check Point 2:IPO 分類

(載入中…)



        
      

8.3傳感器數據的基礎:讀數、界定值、雜訊與取樣

感測器的種類與功用(先認識類型,再進入數據處理)

感測器(Sensor)的作用是把現實世界的某種物理量或狀態,轉換成裝置可讀取的訊號(例如電壓、數字訊號),讓系統能「感知環境」。

以下是創客與智能家居最常見的感測器類型(可按課程需要挑選):

(A)環境類

(B)動作與位置類

(C)接觸與狀態類

(D)識別與資訊類

創客常用的輸出設備(Output Devices)

輸出設備負責「把系統決策呈現出來或執行動作」,讓裝置不只會感知,還能回應環境。常見包括:

甚麼是「可編程微控制器」(Programmable Microcontroller),為何需要它?

可編程微控制器是一種「可運行程式、專門控制硬件的微型電腦」。它通常負責:

為何需要微控制器?

常見例子:


重點

  • 理解讀數可能是模擬或數碼,並可能經模擬數碼轉換器(Analog Digital Converter (ADC))轉換。
  • 能設定界定值(threshold)把連續讀數轉成「事件」或「狀態」(例如偏暗/不偏暗)。
  • 知道雜訊會令讀數抖動,常用方法包括平滑/濾波、延遲判定、多次確認。
  • 懂得取樣頻率與時延(latency)的取捨:太快會受雜訊影響,太慢會反應遲鈍。

在真實世界,傳感器讀數很少會「完美」:光線會有陰影、反射與閃爍;人走動也不會每一秒都剛好觸發一次。若只用最直接的 if 判斷,系統很容易出現閃爍、誤報或反應慢等問題。因此,本節會把「界定值+抗雜訊」視為設計的基本功。

做法上,你可以把讀數先轉成較容易理解的量(例如百分比),再設定界定值。當你發現輸出不穩定,就要考慮讀數是否有雜訊、取樣是否太密或太疏。常見的簡化策略包括:用移動平均做平滑、要求連續多次達標才觸發、或設定「開燈界定值」與「關燈界定值」分開(滯後)。

最後,請記住:取樣與處理本身也會產生時延(latency)。在現實應用中,設計不是追求「越快越好」或「越穩越好」,而是要能解釋:為何你選這個取樣頻率、為何用這個界定值、為何要做這個平滑策略。

Check Point 3:讀數不穩定點算好?

(載入中…)



        
      

8.4使用擴充的編程模組或函式庫與實物互動

重點

  • 理解擴充模組/函式庫提供應用程式界面(API),把「讀取傳感器/控制裝置」封裝成函式。
  • 能讀懂常見 API 使用模式:初始化 → 讀取/設定 → 例外處理 → 釋放資源。
  • 遇到問題能有條理排查:接線/供電 → 通訊埠/位址 → 程式參數 → 除錯(debug)。

在現實應用中,傳感器與輸出裝置往往不是「用 print 就能控制」的;你需要透過擴充模組/函式庫提供的應用程式界面(API)進行互動。這種設計背後的想法是分工:底層負責讀取硬件、處理通訊與格式;上層負責你的規則與介面。對學生而言,重要的是能看懂 API 文件與基本用法,並把 API 放進清晰的程式架構中。

最常見的寫法是:一開始先初始化(例如設定通訊埠、模式),然後在循環或事件處理器內持續讀取數據,並根據界定值或規則控制輸出。當系統變得複雜時,請避免把所有 API 呼叫塞在同一段 if-else;應把「讀取」「決策」「輸出」分成函式,令程式更易讀,也更易除錯(debug)。

排查方面,建議由外到內:先確認接線與供電,再檢查通訊埠/位址設定,最後才檢查程式邏輯與界定值。這種排查順序能避免你在錯的方向浪費時間。

Check Point 4:擴充模組/函式庫使用

(載入中…)



        
      

8.5事件處理器與事件驅動程式:由『輪詢』到『即時觸發』

重點

  • 理解「事件」是觸發程式反應的信號(按鍵、超過界定值、計時到期)。
  • 知道事件處理器(Event handler)負責在事件發生時執行對應動作。
  • 能分辨事件驅動程式(Event-driven Program)與輪詢(polling)的差異與適用情境。
  • 設計時要留意:去抖、事件密度、時延、以及狀態管理。

互動程式的難點之一,是「系統不是一直做同一件事」,而是要在不同情況下作出反應。事件驅動程式(Event-driven Program)的思路,就是把「反應點」集中在事件上:按鍵被按下、讀數超過界定值、計時到期等,都可以視為事件。事件一出現,對應的事件處理器(Event handler)就會負責做出反應。

相對地,輪詢(polling)則是由程式主動、定期去檢查狀態。輪詢的好處是簡單、可預測;缺點是如果輪詢太慢就反應遲鈍,太快又可能浪費資源、受雜訊影響更大。很多真實系統會採用混合方式:即時事件用事件驅動,週期性工作用輪詢。

無論用哪種方式,狀態管理都非常重要。例如你有 AUTO/MANUAL 兩個模式,就應該用一個變量清楚記錄當前模式,並規定哪一種輸入優先(例如手動優先於自動)。同時,要注意「事件密度」與「去抖」:若事件太密或抖動太大,系統就會像「不停被打斷」,表現會不穩定。

Check Point 5:事件驅動 vs 輪詢

(載入中…)



        
      

8.6案例一:光傳感器智能照明(界定值+模式+延時)

重點

  • 能把情境需求寫成清晰規則:偏暗+有人 → 開燈;並加入延時關燈。
  • 能設計「AUTO/MANUAL」模式,避免自動規則覆蓋手動操作。
  • 懂得用「兩個界定值」或「多次確認」減少閃爍。
  • 能用偽代碼/Python 表達核心流程。

智能照明是一個很適合練習「把需求變成規則」的例子。最基本的版本只有一條規則:偏暗且有人就開燈。當你把它寫成 if 條件後,下一步就是把真實世界常見問題加回來:人可能短暫停下、光線可能有抖動、使用者可能要手動控制一段時間。這些都會令程式由「一句 if」變成「有狀態的系統」。

因此,在設計上建議你先把變量分成三類:感測類(light, motion)模式類(mode)時間類(lastMotionTime)。當你能清楚分辨每類變量的作用,程式就更容易維護,也更容易除錯(debug)。

最後,若你觀察到燈在臨界位置不停閃爍,不要急於亂改界定值;先思考是「環境基線不同」還是「雜訊抖動」造成。前者偏向調整界定值,後者則可用兩個界定值、平滑或多次確認處理。

輸入 mode(AUTO/MANUAL)
輸入 motion(0/1)
輸入 light(0–1023)

如果 mode = AUTO:
    如果 motion=1 且 light < threshold:
        輸出 開燈
    否則:
        輸出 關燈
否則(MANUAL):
    輸入 manualOn(0/1)
    如果 manualOn=1:輸出 開燈
    否則:輸出 關燈

Check Point 6:智能照明設計判斷(正確/錯誤)

(載入中…)



        
      

8.7案例二:加速度計動作偵測(多次確認+總加速度)

重點

  • 知道加速度計常見為三軸輸入(x、y、z)。
  • 能把三軸數據合成「總加速度」作較穩定判斷(例如用平方避免開根號)。
  • 懂得用多次確認、平滑或取樣頻率改善誤報與漏報。
  • 能用偽代碼/Python 表達「偵測搖晃」的核心流程。

加速度計動作偵測的難點,在於「動作」不是單一數值,而是一段時間內的變化。若你只看某一刻的某一軸,很容易因角度變化或雜訊而誤判。因此,常見做法是把三軸合成一個總量(例如總加速度平方),再用界定值作初步判斷,最後加上多次確認或平滑,提升穩定性。

在設計時,你要先回答兩個問題:第一,取樣間隔要多短才不會漏動作?第二,界定值應該設在甚麼水平才不會誤報?這兩個答案通常要靠「觀察數據」來調整:你可以記錄一小段讀數,看看正常狀態與搖晃狀態大概落在甚麼範圍,再決定 threshold。

另外要留意:平滑與多次確認會引入時延(latency)。若你追求即時警報,確認次數不要太多;若你追求穩定,確認次數可以增加。只要能解釋你的取捨,就是好的設計。

輸入 threshold2
輸入 n
count ← 0

重覆 n 次:
    輸入 ax, ay, az
    mag2 ← ax^2 + ay^2 + az^2
    如果 mag2 > threshold2:
        count ← count + 1

如果 count ≥ 3:
    輸出 搖晃
否則:
    輸出 正常

Check Point 7:加速度計動作偵測(正確/錯誤)

(載入中…)



        
      

8.8案例三:語音識別互動與綜合專題(多輸入+優先次序)

重點

  • 把語音識別視為「把聲音輸入轉成文字」的模組,再做指令解析(command parsing)。
  • 能設計多輸入時的優先次序(例如語音/按鍵優先於自動規則)。
  • 能用狀態變量與事件序列描述系統反應(例如 ON/OFF/TOGGLE)。
  • 能提出一個小型綜合專題:輸入(光+動作+語音)→ 處理(規則+抗雜訊)→ 輸出(控制+提示)。

語音識別互動的重點,是把語音輸入「轉成程式可處理的事件」。在學習階段,你可以先把語音識別結果當作一行文字輸入,專注練習「指令解析」:例如文字包含「開始」就視為 START,包含「停止」就視為 STOP。當你能正確把文字映射成指令,就可以把它當作事件,放入事件驅動的架構中。

當系統有多個輸入來源(光、動作、語音、按鍵)時,最常見的混亂來自「誰優先」。因此,你應該先寫出優先次序,例如:手動(語音/按鍵)優先於自動;緊急停止優先於任何其他指令。只要優先次序清晰,程式就容易寫,也容易測試。

最後,你可以把本章三個案例融合成一個小型專題:例如「語音可開/關系統;AUTO 模式下偏暗且有人就開燈;若偵測到大幅搖晃則觸發警報」。重點不在於硬件有多複雜,而在於你能否用 IPO、DFD、事件與狀態,把整個系統描述清楚並實作出來。

智能家居中最少 15 個可發展的科技/功能例子

以下列出 15 個以上例子,讓你可直接挑選用作教材案例或專題題目:

  1. 智能照明:人來自動開燈、按光暗自動調節
  2. 智能窗簾:按時間/日照自動開合
  3. 智能門鎖:密碼、指紋、RFID、手機解鎖
  4. 門窗防盜監測:門窗被開啟即通知
  5. 室內溫濕度自動控制:觸發冷氣、風扇、抽濕機
  6. 空氣質素監測與淨化:PM2.5/CO₂ 過高自動換氣
  7. 漏水偵測與緊急通知:廚房/廁所漏水即警報
  8. 煤氣/煙霧警報系統:超標即響警報並推送手機
  9. 智能灌溉:土壤濕度不足自動澆水
  10. 能源管理:監測用電量、尖峰時間自動調整耗電設備
  11. 智能插座:遠端開關、定時、功率監控
  12. 智能安防攝像(進階):移動偵測、陌生人識別
  13. 老人/跌倒偵測:加速度+AI 判斷異常行為
  14. 智能門鈴:有人按門鈴拍照/錄影並通知
  15. 室內噪音監測:超過閾值提醒/自動調整音量
  16. 智能情境模式:回家模式、睡眠模式、離家模式一鍵啟動
  17. 語音控制與助理整合:用語音控制燈光與電器

甚麼是物聯網(IoT)、人工智能(AI)、智慧生活?為何重要?

物聯網(Internet of Things, IoT)

物聯網是指大量裝置透過網絡互相連接,能收集數據、交換資訊、遠端控制。在智能家居中,IoT 令「感測器 → 微控制器 → 手機/雲端 → 執行裝置」形成完整閉環。

人工智能(AI)

人工智能可讓系統不只「按規則做」,而是能從數據中學習與推斷,例如:

智慧生活(Smart Living)

智慧生活是把 IoT、AI 與自動化整合到日常生活中,提升:

為何這些重要?

因為現代城市與家庭面對「安全風險、能源成本、人口老化、生活節奏快」等問題,IoT 與 AI 提供可擴展的解決方案;同時它亦是未來科技與職業技能的重要基礎(硬件、程式、數據、網絡安全與倫理等)。

挑戰練習(20 題):偽代碼 ↔ Python(可直接在頁內執行)

使用方法:展開每題後,先讀偽代碼,再完成 Python 程式;按「Run 程式」可執行,按「核對答案」可用隱藏測試檢查輸出。

Check Point 8:選擇合適的傳感器/輸入方法

(載入中…)