8.1課題定位與學習目標
重點
- 理解「程式與實物互動」:輸入來自傳感器(亦常稱感應器),輸出可控制裝置或顯示資訊。
- 能以系統角度描述互動程式:清楚列出輸入、處理、輸出,以及觸發條件(事件)。
- 能以簡單條件與狀態變量設計規則(例如:偏暗且有人 → 開燈)。
- 能使用擴充模組/函式庫提供的應用程式界面(API),把硬件互動封裝成可呼叫的函式。
「程式編寫在現實生活的應用」強調程式不是只在螢幕內運算,而是接收真實世界的輸入(例如光度、動作、聲音),再作出輸出(例如開燈、發出提示音、在畫面顯示狀態),令系統能在現實情境中運作。
在課題中,常見的輸入來自傳感器,輸出可以是執行器(例如燈、馬達)或資訊輸出(畫面/文字)。
- 釐清目標:系統想解決甚麼問題?(例如節能、提示、保安)
- 列出輸入:需要哪些數據?(光、動作、語音文字)
- 設計處理規則:界定值、條件、狀態、計時(例如延時關燈)
- 決定輸出:控制甚麼裝置?顯示甚麼訊息?
- 考慮事件:哪些情況會觸發處理?(按鍵、超過界定值、計時到期)
規則:「偏暗而且有人」就開燈;否則關燈。
程式化時可變成:
- 輸入:
light(光傳感器讀數)、motion(有人/無人) - 處理:
if light < threshold and motion == 1 - 輸出:開燈/關燈
關鍵是把「一句話」拆成可檢查的變量與條件。
互動程式(本章主線)重點在於:輸入會隨時間改變、要處理雜訊與時延、要設計事件觸發與狀態管理。
純計算程式重點在於:算法(algorithm)正確性、數據結構、效率等(也重要,但不是本章核心)。
- 把讀數當作永遠準確:忽略雜訊,令輸出不停閃爍。
- 沒有定義輸出行為:同一條件下,應該「保持狀態」還是「重設」?
- 忘記狀態:例如有手動模式時,仍讓自動規則覆蓋手動輸出。
實際系統通常以「分層」方式工作:
- 上層:你的程式(邏輯規則、介面)
- 中層:擴充模組/函式庫(提供應用程式界面(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)著重「控制流程」。
輸入-處理-輸出循環(IPO)是一種快速整理方法:把系統拆成「輸入」「處理」「輸出」,避免一開始就跳入寫程式。
數據流程圖(DFD)用圖像表示「數據如何流動」:從數據來源(例如傳感器)流到處理程序,再流到數據接收器(data sink,例如顯示器/裝置)。
- 找出外部實體:使用者、傳感器、外部系統。
- 找出處理程序:比較界定值、計算平均、判斷動作。
- 找出數據流:讀數、事件、狀態訊息。
- 找出輸出:開燈訊號、警報訊息、畫面顯示。
提示:DFD 著重「數據」;如果你寫到「如果…就…」很多,可能你其實在寫流程圖。
外部實體:光傳感器、動作傳感器、燈
處理程序:(1)讀取傳感器 →(2)判斷是否偏暗且有人 →(3)輸出控制訊號
數據流:光度讀數、有人/無人 → 決策 → 開燈/關燈
- DFD(數據流程圖):看數據流向與資料交換。
- 流程圖(flowchart):看步驟次序與分支/迴圈。
- 方塊圖(block diagram):看系統由哪些大模組組成(較高層)。
同一個系統可以有多種圖,但要先想清楚「你要表達甚麼」。
- 輸入不限於鍵盤:傳感器讀數、按鍵事件都屬輸入。
- 輸出不限於螢幕:控制燈、馬達、蜂鳴器亦是輸出。
- DFD 不是畫得越多箭嘴越好:應該每一條箭嘴都代表一種有意義的數據。
一個大型系統的 DFD 可用「分層」方式表示:
- Level 0(Context Diagram):把整個系統當成一個大處理程序,只畫外部實體與主要數據流。
- Level 1:把大處理程序拆成多個子處理程序(例如:讀取、濾波、決策、輸出)。
分層的好處是:高層清楚、低層可深入細節,但不會一開始就畫到混亂。
當我們設計互動程式時,最重要不是先寫語法,而是先把系統拆解。輸入-處理-輸出循環(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)環境類
- 溫度感測器:量度溫度,用於冷氣控制、暖氣保護、設備過熱警報
- 濕度感測器:量度空氣濕度,用於抽濕/加濕、霉菌風險提醒
- 光線感測器(LDR/光度):偵測亮度,自動開燈、窗簾調光
- 氣體/煙霧感測器:偵測煤氣、煙霧、揮發性氣體,用於安全警報
- 空氣質素(PM2.5/CO₂):監測空氣狀況,觸發換氣/淨化
(B)動作與位置類
- 紅外線人體感測器(PIR):偵測人體移動,用於自動照明、防盜
- 超聲波距離感測器:量度距離,用於避障、測水位、車位提示
- 加速度計/陀螺儀:偵測震動與姿態,用於跌倒偵測、手勢控制
- 磁簧開關(門窗感測):判斷門窗開合狀態,用於防盜與自動化
(C)接觸與狀態類
- 按鍵/觸碰感測器:人機輸入,控制模式切換
- 壓力/重量感測器:量度壓力或重量,用於座位入座偵測、秤重
- 水位/漏水感測器:偵測漏水,用於廁所/水管安全提醒
- 土壤濕度感測器:植物灌溉判斷(創客常用)
(D)識別與資訊類
- RFID/NFC:身份辨識與門禁
- GPS(若涉及戶外):定位追蹤(較少用於室內家居,但可作延伸)
創客常用的輸出設備(Output Devices)
輸出設備負責「把系統決策呈現出來或執行動作」,讓裝置不只會感知,還能回應環境。常見包括:
- LED 指示燈/RGB 燈條:狀態顯示、氣氛燈、警報提示
- 蜂鳴器(Buzzer)/喇叭:提示音、警報、語音輸出(可配合 TTS)
- 顯示屏(LCD/OLED):顯示數值、狀態、選單
- 繼電器(Relay):以低電壓控制高電壓電器(例如燈、風扇)
- 伺服馬達(Servo):精準角度控制(門鎖、窗簾)
- 直流馬達(DC motor):連續轉動(風扇、抽氣)
- 步進馬達(Stepper motor):精準步距控制(窗簾、定位機構)
- 電磁閥/水泵:自動供水、灌溉
- 加熱片/製冷模組(進階):溫控系統的執行端
甚麼是「可編程微控制器」(Programmable Microcontroller),為何需要它?
可編程微控制器是一種「可運行程式、專門控制硬件的微型電腦」。它通常負責:
- 讀取感測器數據
- 根據條件作出判斷(if/else、迴圈、計時)
- 控制輸出設備(燈、馬達、繼電器等)
- (進階)透過網絡與手機/雲端溝通
為何需要微控制器?
- 把硬件連起來:感測器與輸出裝置需要一個「大腦」協調
- 即時反應:例如有人進門立刻開燈、煤氣超標立即警報
- 自動化控制:設定規則或排程,減少人手操作
- 可擴充:可加更多感測器、更多功能、更多連網能力
常見例子:
- Arduino 系列:入門友善,適合學校教學與簡單控制
- micro:bit:教育向,容易上手,感測與顯示整合度高
- ESP32/ESP8266:常用於 IoT(Wi‑Fi/藍牙)智能家居
- Raspberry Pi:嚴格說更像微型電腦,適合做多媒體、影像、較複雜 AI 應用
重點
- 理解讀數可能是模擬或數碼,並可能經模擬數碼轉換器(Analog Digital Converter (ADC))轉換。
- 能設定界定值(threshold)把連續讀數轉成「事件」或「狀態」(例如偏暗/不偏暗)。
- 知道雜訊會令讀數抖動,常用方法包括平滑/濾波、延遲判定、多次確認。
- 懂得取樣頻率與時延(latency)的取捨:太快會受雜訊影響,太慢會反應遲鈍。
- 讀數:傳感器量度到的數值(例如 0–1023)。
- 界定值(threshold):用來把讀數分成兩類(例如偏暗/偏亮)。
- 雜訊:不希望出現的波動,令讀數在短時間內上下跳動。
- 取樣:以固定時間間隔讀取一次讀數(例如每 0.5 秒讀一次)。
真實世界多數是連續變化(模擬),但程式往往要做離散決策(開/關、是/否)。常見方法是:
- 讀取數值(可能經模擬數碼轉換器(Analog Digital Converter (ADC)))
- 必要時先做轉換(例如 0–1023 → 0–100%)
- 用界定值把數值分類
- 加入「抗雜訊」策略,避免一跳動就改變輸出
若只用單界定值:
如果 light < threshold:
開燈
否則:
關燈
當 light 在界定值附近抖動時,燈就會不停閃爍。改善之一是「多次確認」:
如果連續 3 次 light < threshold:
開燈
做法簡單,但能有效減少誤觸發。
- 調整界定值:環境基線改變時最直接,但未必解決抖動。
- 平滑/濾波:適合處理高頻雜訊,但可能引入時延。
- 延遲判定/多次確認:對付尖峰很有效,但反應會慢少少。
實際系統常會混合使用。
- 忽略「讀數跳動」:導致輸出不停改變。
- 界定值設定不合理:例如太貼近常態值,令系統長期在邊界震盪。
- 只追求「反應快」:取樣太密,反而更易受雜訊影響。
不少傳感器輸出是模擬電壓,電腦/微控制器需要透過模擬數碼轉換器(Analog Digital Converter (ADC))把電壓轉成整數讀數。
解像度(resolution)可理解為「分得幾細」:例如 10-bit ADC 會把量程分成 210=1024 個等級(0–1023)。
解像度越高,理論上可分得越細;但雜訊、電源穩定性、感測器本身誤差,都會影響實際效果。
平滑/濾波通常要「看多一點點數據」才可以算平均或趨勢,所以會引入時延(latency):
- 例如移動平均要等到收集 3 次讀數,才算到一個平均值。
- 時延太大會令系統反應慢;時延太小又可能仍然抖動。
設計時要在「穩定」與「反應」之間取平衡。
在真實世界,傳感器讀數很少會「完美」:光線會有陰影、反射與閃爍;人走動也不會每一秒都剛好觸發一次。若只用最直接的 if 判斷,系統很容易出現閃爍、誤報或反應慢等問題。因此,本節會把「界定值+抗雜訊」視為設計的基本功。
做法上,你可以把讀數先轉成較容易理解的量(例如百分比),再設定界定值。當你發現輸出不穩定,就要考慮讀數是否有雜訊、取樣是否太密或太疏。常見的簡化策略包括:用移動平均做平滑、要求連續多次達標才觸發、或設定「開燈界定值」與「關燈界定值」分開(滯後)。
最後,請記住:取樣與處理本身也會產生時延(latency)。在現實應用中,設計不是追求「越快越好」或「越穩越好」,而是要能解釋:為何你選這個取樣頻率、為何用這個界定值、為何要做這個平滑策略。
Check Point 3:讀數不穩定點算好?
(載入中…)
8.4使用擴充的編程模組或函式庫與實物互動
重點
- 理解擴充模組/函式庫提供應用程式界面(API),把「讀取傳感器/控制裝置」封裝成函式。
- 能讀懂常見 API 使用模式:初始化 → 讀取/設定 → 例外處理 → 釋放資源。
- 遇到問題能有條理排查:接線/供電 → 通訊埠/位址 → 程式參數 → 除錯(debug)。
擴充模組/函式庫是一組已寫好的程式碼,讓你不用由零開始處理硬件細節。
它通常會提供一個或多個應用程式界面(application program interface (API)),例如:
sensor.read():讀取傳感器讀數light.on()/light.off():控制輸出裝置
- 初始化:設定通訊埠、位址、模式、取樣率等。
- 讀取/控制:在主迴圈或事件處理器中呼叫 API。
- 處理例外:讀不到數據、超時、格式錯誤等。
- 釋放資源:需要時停止裝置、關閉連線。
提示:即使你看不到底層,仍要明白「何時初始化」「何時讀取」及「出錯點算」這些設計決定。
初始化 lightSensor
初始化 lamp
重覆:
light ← lightSensor.read()
如果 light < threshold:
lamp.on()
否則:
lamp.off()
# 注意:此為概念示例(以函式庫 API 表示)
light = lightSensor.read()
if light < threshold:
lamp.on()
else:
lamp.off()- 用函式庫:上手快,集中處理邏輯;但遇到特別硬件或要改低層行為時較受限制。
- 自己寫底層:可完全控制,但要處理更多硬件與通訊細節,開發成本高。
在學習階段,多數情況先用函式庫建立系統思維與程式架構。
- 忘記初始化就直接讀取。
- 通訊埠或位址設定錯,仍以為是程式邏輯錯。
- 忽略回傳值範圍(例如 0–1023 或 0–1.0),導致界定值比較失準。
一個典型互動系統可分成幾層:
- 應用層(你的程式):寫規則、處理事件。
- 函式庫層:提供 API,處理常見格式轉換與錯誤處理。
- 驅動程式(driver):與硬件溝通,控制通訊埠、寄存器等。
- 韌體(firmware):在嵌入式系統(embedded system)內控制硬件行為。
- 硬件層:傳感器本體、模擬數碼轉換器(ADC)、匯流排等。
你呼叫一個 read(),下層可能做了「發送讀取命令 → 等待回應 → 進行校驗 → 轉成數值」等多步。
- 匯流排(bus):多個裝置共享通道(例如 I²C),需要位址(address)分辨裝置。
- 緩衝區(buffer):暫存收發數據;緩衝區滿/空都可能造成讀取異常。
- 時延(latency):裝置回應需要時間;若程式等得太短就當作失敗。
因此排查時,不應只看程式邏輯;接線、供電、通訊埠設定、甚至訊號交換(handshaking)也可能是關鍵。
在現實應用中,傳感器與輸出裝置往往不是「用 print 就能控制」的;你需要透過擴充模組/函式庫提供的應用程式界面(API)進行互動。這種設計背後的想法是分工:底層負責讀取硬件、處理通訊與格式;上層負責你的規則與介面。對學生而言,重要的是能看懂 API 文件與基本用法,並把 API 放進清晰的程式架構中。
最常見的寫法是:一開始先初始化(例如設定通訊埠、模式),然後在循環或事件處理器內持續讀取數據,並根據界定值或規則控制輸出。當系統變得複雜時,請避免把所有 API 呼叫塞在同一段 if-else;應把「讀取」「決策」「輸出」分成函式,令程式更易讀,也更易除錯(debug)。
排查方面,建議由外到內:先確認接線與供電,再檢查通訊埠/位址設定,最後才檢查程式邏輯與界定值。這種排查順序能避免你在錯的方向浪費時間。
Check Point 4:擴充模組/函式庫使用
(載入中…)
8.5事件處理器與事件驅動程式:由『輪詢』到『即時觸發』
重點
- 理解「事件」是觸發程式反應的信號(按鍵、超過界定值、計時到期)。
- 知道事件處理器(Event handler)負責在事件發生時執行對應動作。
- 能分辨事件驅動程式(Event-driven Program)與輪詢(polling)的差異與適用情境。
- 設計時要留意:去抖、事件密度、時延、以及狀態管理。
- 事件:一個「值得反應」的狀態改變(例如按下按鈕)。
- 事件處理器(Event handler):事件發生時執行的程式片段(通常是一個函式)。
- 事件驅動程式(Event-driven Program):以事件作為主要觸發機制的程式架構。
- 輪詢(polling):程式以固定時間間隔主動檢查狀態是否改變。
輪詢像「每隔一陣就問一次」:
每 0.5 秒:
讀取傳感器
如有變化就處理
事件驅動像「有事先叫你」:
當按鈕被按下:
執行事件處理器
當讀數連續 3 次超標:
觸發警報
兩者都可達到效果,但在時延、資源消耗與程式結構上各有取捨。
不少系統會採用混合方式:
- 按鍵(事件)→ 立即切換 AUTO/MANUAL
- 定時(輪詢)→ 每秒更新一次畫面顯示
混合方式能兼顧即時性與穩定更新。
- 事件驅動:按鍵、超標觸發、需要即時反應的情況。
- 輪詢:固定間隔記錄、定時更新畫面、週期性工作。
- 混合:同時有「即時事件」與「週期性工作」時。
- 按鍵彈跳(bounce)造成一次按下變多次事件。
- 讀數抖動造成界定值附近不停觸發。
- 事件處理器做太多工作,導致整個系統卡住。
解法通常是:去抖、多次確認、把重工作放到背景循環處理。
在部分硬件平台,事件可以由中斷請求(Interrupt Request (IRQ))觸發,系統會暫停手上工作,先執行中斷處理程式(interrupt handler)去回應事件。
這可帶來更低時延,但亦需要更小心:中斷處理程式通常要很短、很快,避免影響系統其他部份。
即使是事件驅動,事件也可能先排入「事件佇列」,再由主迴圈逐個處理。若事件太多或處理太慢,就會造成:
- 時延(latency)上升:反應越來越慢。
- 緩衝區(buffer)積壓:甚至溢出或丟失事件。
因此,設計事件處理器時要避免做過多計算,並適當限制觸發頻率。
互動程式的難點之一,是「系統不是一直做同一件事」,而是要在不同情況下作出反應。事件驅動程式(Event-driven Program)的思路,就是把「反應點」集中在事件上:按鍵被按下、讀數超過界定值、計時到期等,都可以視為事件。事件一出現,對應的事件處理器(Event handler)就會負責做出反應。
相對地,輪詢(polling)則是由程式主動、定期去檢查狀態。輪詢的好處是簡單、可預測;缺點是如果輪詢太慢就反應遲鈍,太快又可能浪費資源、受雜訊影響更大。很多真實系統會採用混合方式:即時事件用事件驅動,週期性工作用輪詢。
無論用哪種方式,狀態管理都非常重要。例如你有 AUTO/MANUAL 兩個模式,就應該用一個變量清楚記錄當前模式,並規定哪一種輸入優先(例如手動優先於自動)。同時,要注意「事件密度」與「去抖」:若事件太密或抖動太大,系統就會像「不停被打斷」,表現會不穩定。
Check Point 5:事件驅動 vs 輪詢
(載入中…)
8.6案例一:光傳感器智能照明(界定值+模式+延時)
重點
- 能把情境需求寫成清晰規則:偏暗+有人 → 開燈;並加入延時關燈。
- 能設計「AUTO/MANUAL」模式,避免自動規則覆蓋手動操作。
- 懂得用「兩個界定值」或「多次確認」減少閃爍。
- 能用偽代碼/Python 表達核心流程。
智能照明的目標通常包括:
- 需要時自動開燈(方便、保安)。
- 無需要時自動關燈(節能)。
- 避免閃爍與誤判(用得舒服)。
light:光傳感器讀數(用界定值判斷偏暗/偏亮)。motion:動作/有人(可視為事件或狀態)。mode:AUTO 或 MANUAL(決定是否執行自動規則)。
當 mode=AUTO 時,系統用規則決定燈;當 mode=MANUAL 時,燈狀態由使用者控制,系統不應強行改動。
# 變量
mode ← AUTO
lamp ← OFF
lastMotionTime ← -infinity
當偵測到動作:
lastMotionTime ← 現在時間
重覆(每 0.5 秒):
light ← 讀取光傳感器
isDark ← (light < threshold)
如果 mode = AUTO:
如果 isDark 且 (現在時間 - lastMotionTime ≤ delay):
lamp ← ON
否則:
lamp ← OFF
這段偽代碼把「延時」寫成時間差判斷,概念清晰。
單界定值:light < threshold 就開燈,否則關燈,容易在邊界抖動。
兩個界定值:例如 light < low 才開燈,light > high 才關燈,可減少來回切換。
- MANUAL 模式下仍然執行 AUTO 規則,令使用者覺得「我明明關咗燈又自己開返」。
- 延時設計錯:每次循環都把
lastMotionTime更新,導致永遠不關燈。 - 沒有處理抖動:讀數在界定值附近就不停閃爍。
常見光敏元件(例如 LDR)會隨光度改變電阻,配合電阻形成分壓電路,輸出一個隨光度變化的電壓。
系統再用模擬數碼轉換器(Analog Digital Converter (ADC))把電壓轉成 0–1023 之類的數值。
因此「讀數變大代表更光/更暗」要視乎接法;設計界定值前要先做簡單量度與校準。
智能照明是一個很適合練習「把需求變成規則」的例子。最基本的版本只有一條規則:偏暗且有人就開燈。當你把它寫成 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:輸出 開燈
否則:輸出 關燈
# 這段 Python 以「輸入」模擬傳感器/按鍵,方便練習邏輯
mode = input().strip().upper()
motion = int(input())
light = int(input())
threshold = 500
if mode == "AUTO":
if motion == 1 and light < threshold:
print("開燈")
else:
print("關燈")
else:
manualOn = int(input())
print("開燈" if manualOn == 1 else "關燈")Check Point 6:智能照明設計判斷(正確/錯誤)
(載入中…)
8.7案例二:加速度計動作偵測(多次確認+總加速度)
重點
- 知道加速度計常見為三軸輸入(x、y、z)。
- 能把三軸數據合成「總加速度」作較穩定判斷(例如用平方避免開根號)。
- 懂得用多次確認、平滑或取樣頻率改善誤報與漏報。
- 能用偽代碼/Python 表達「偵測搖晃」的核心流程。
加速度計用來量度物件在不同方向上的加速度變化。常見為三軸(x、y、z),反映不同方向的變動。
在應用上,我們常用它來偵測:搖晃、跌落、轉向、步行節奏等。
把三軸合成一個量:
mag2 ← ax^2 + ay^2 + az^2
然後用界定值比較:
如果 mag2 > threshold2:
記為一次「超標」
使用平方的好處是:不需要開根號,計算更簡單,也適合界定值比較。
count ← 0
重覆讀取 n 次:
計算 mag2
如果 mag2 > threshold2:
count ← count + 1
如果 count ≥ 3:
輸出「搖晃」
否則:
輸出「正常」
這樣可減少單一尖峰造成的誤報。
- 單一軸:容易受方向/角度影響,可能誤判。
- 總加速度:綜合三軸資訊,通常更穩定,但可能失去方向資訊。
- 取樣太疏:漏掉短暫動作(例如快速搖一下)。
- 界定值太低:輕微動作也被當成搖晃。
- 沒有平滑:雜訊造成超標次數被放大。
不少加速度計屬 MEMS(微機電系統)。可用簡化模型理解:內部有微小「質量」與「彈簧」,加速度改變時質量相對位移,電容/電阻改變,再被電路轉成數值。
這個模型提醒我們:讀數本身有誤差與噪聲,所以需要平滑、多次確認等策略。
加速度計動作偵測的難點,在於「動作」不是單一數值,而是一段時間內的變化。若你只看某一刻的某一軸,很容易因角度變化或雜訊而誤判。因此,常見做法是把三軸合成一個總量(例如總加速度平方),再用界定值作初步判斷,最後加上多次確認或平滑,提升穩定性。
在設計時,你要先回答兩個問題:第一,取樣間隔要多短才不會漏動作?第二,界定值應該設在甚麼水平才不會誤報?這兩個答案通常要靠「觀察數據」來調整:你可以記錄一小段讀數,看看正常狀態與搖晃狀態大概落在甚麼範圍,再決定 threshold。
另外要留意:平滑與多次確認會引入時延(latency)。若你追求即時警報,確認次數不要太多;若你追求穩定,確認次數可以增加。只要能解釋你的取捨,就是好的設計。
輸入 threshold2
輸入 n
count ← 0
重覆 n 次:
輸入 ax, ay, az
mag2 ← ax^2 + ay^2 + az^2
如果 mag2 > threshold2:
count ← count + 1
如果 count ≥ 3:
輸出 搖晃
否則:
輸出 正常
# 這段 Python 以輸入模擬加速度計三軸數據
threshold2 = int(input())
n = int(input())
count = 0
for _ in range(n):
ax = int(input())
ay = int(input())
az = int(input())
mag2 = ax*ax + ay*ay + az*az
if mag2 > threshold2:
count += 1
print("搖晃" if count >= 3 else "正常")Check Point 7:加速度計動作偵測(正確/錯誤)
(載入中…)
8.8案例三:語音識別互動與綜合專題(多輸入+優先次序)
重點
- 把語音識別視為「把聲音輸入轉成文字」的模組,再做指令解析(command parsing)。
- 能設計多輸入時的優先次序(例如語音/按鍵優先於自動規則)。
- 能用狀態變量與事件序列描述系統反應(例如 ON/OFF/TOGGLE)。
- 能提出一個小型綜合專題:輸入(光+動作+語音)→ 處理(規則+抗雜訊)→ 輸出(控制+提示)。
在本章的角度,語音識別可以理解成一個「輸入模組」:
- 輸入:聲音(語音)
- 輸出:文字(例如「開始」「停止」「開燈」)
程式再把文字視為事件或指令,進行處理。
典型做法:
- 取得語音文字
text - 判斷包含關鍵詞:例如「開始/停止」
- 映射成控制指令:START/STOP/UNKNOWN
- 與自動規則協調:例如「語音 OFF」應覆蓋自動「偏暗+有人」
輸入 voice(ON/OFF/NONE)
輸入 motion(0/1)
輸入 isDark(0/1)
如果 voice = ON:
開燈
否則如果 voice = OFF:
關燈
否則:
如果 motion=1 且 isDark=1:
開燈
否則:
關燈
這種「優先次序」寫清楚後,系統行為會更可預測。
- 語音:自然、方便,但可能受環境噪音影響,需要處理誤識別。
- 按鍵:可靠、明確,但需要使用者接觸或靠近。
在設計上,兩者都可以成為事件;差別在於誤差來源不同。
- 太鬆:見到一個「開」字就當作開燈,容易誤判。
- 太緊:一定要完全一致才接受,使用者體驗差。
- 沒有 UNKNOWN:遇到不明指令時沒有合理回應。
不少語音識別系統背後會用到人工智能(Artificial Intelligence (AI))模型,把聲音特徵映射成文字。對本章而言,你不一定要掌握模型訓練細節,但可以理解:
- 語音識別有機會出錯(誤識別/漏識別)。
- 系統設計需要容錯:例如提供重複確認、顯示識別結果給使用者確認。
- 若使用雲端服務,亦要留意私隱與資料傳送。
語音識別互動的重點,是把語音輸入「轉成程式可處理的事件」。在學習階段,你可以先把語音識別結果當作一行文字輸入,專注練習「指令解析」:例如文字包含「開始」就視為 START,包含「停止」就視為 STOP。當你能正確把文字映射成指令,就可以把它當作事件,放入事件驅動的架構中。
當系統有多個輸入來源(光、動作、語音、按鍵)時,最常見的混亂來自「誰優先」。因此,你應該先寫出優先次序,例如:手動(語音/按鍵)優先於自動;緊急停止優先於任何其他指令。只要優先次序清晰,程式就容易寫,也容易測試。
最後,你可以把本章三個案例融合成一個小型專題:例如「語音可開/關系統;AUTO 模式下偏暗且有人就開燈;若偵測到大幅搖晃則觸發警報」。重點不在於硬件有多複雜,而在於你能否用 IPO、DFD、事件與狀態,把整個系統描述清楚並實作出來。
智能家居中最少 15 個可發展的科技/功能例子
以下列出 15 個以上例子,讓你可直接挑選用作教材案例或專題題目:
- 智能照明:人來自動開燈、按光暗自動調節
- 智能窗簾:按時間/日照自動開合
- 智能門鎖:密碼、指紋、RFID、手機解鎖
- 門窗防盜監測:門窗被開啟即通知
- 室內溫濕度自動控制:觸發冷氣、風扇、抽濕機
- 空氣質素監測與淨化:PM2.5/CO₂ 過高自動換氣
- 漏水偵測與緊急通知:廚房/廁所漏水即警報
- 煤氣/煙霧警報系統:超標即響警報並推送手機
- 智能灌溉:土壤濕度不足自動澆水
- 能源管理:監測用電量、尖峰時間自動調整耗電設備
- 智能插座:遠端開關、定時、功率監控
- 智能安防攝像(進階):移動偵測、陌生人識別
- 老人/跌倒偵測:加速度+AI 判斷異常行為
- 智能門鈴:有人按門鈴拍照/錄影並通知
- 室內噪音監測:超過閾值提醒/自動調整音量
- 智能情境模式:回家模式、睡眠模式、離家模式一鍵啟動
- 語音控制與助理整合:用語音控制燈光與電器
甚麼是物聯網(IoT)、人工智能(AI)、智慧生活?為何重要?
物聯網(Internet of Things, IoT)
物聯網是指大量裝置透過網絡互相連接,能收集數據、交換資訊、遠端控制。在智能家居中,IoT 令「感測器 → 微控制器 → 手機/雲端 → 執行裝置」形成完整閉環。
人工智能(AI)
人工智能可讓系統不只「按規則做」,而是能從數據中學習與推斷,例如:
- 分辨是否真的有人(降低誤報)
- 從生活習慣自動調整溫度與燈光
- 以影像辨識判斷陌生人、寵物、包裹到達
智慧生活(Smart Living)
智慧生活是把 IoT、AI 與自動化整合到日常生活中,提升:
- 安全:防盜、防火、漏水預警
- 舒適:自動調節環境
- 效率:省時省力、遠端控制
- 節能:減少浪費、優化用電
- 照護:老人、小孩、特殊需要人士的監測與支援
為何這些重要?
因為現代城市與家庭面對「安全風險、能源成本、人口老化、生活節奏快」等問題,IoT 與 AI 提供可擴展的解決方案;同時它亦是未來科技與職業技能的重要基礎(硬件、程式、數據、網絡安全與倫理等)。
挑戰練習(20 題):偽代碼 ↔ Python(可直接在頁內執行)
使用方法:展開每題後,先讀偽代碼,再完成 Python 程式;按「Run 程式」可執行,按「核對答案」可用隱藏測試檢查輸出。
Check Point 8:選擇合適的傳感器/輸入方法
(載入中…)