---
# System prepended metadata

title: '第一課: 數位信號與開關控制'
tags: [Arduino]

---

#  Arduino課程綱要與工具對照表



| 節次 | 主題              | 教學目標                           | 內容重點 / 範例                                                      | 工具                                 |
| -- | --------------- | ------------------------------ | -------------------------------------------------------------- | ---------------------------------- |
| 1  | 認識開發板與基礎架構      | 了解 Arduino / ESP32 生態與程式架構     | 認識 Arduino UNO / ESP32-CAM；程式骨架 setup() / loop()；LED 閃爍與按鈕控制練習 | Arduino IDE、Tinkercad、draw.io（流程圖） |
| 2  | 感測與輸出控制         | 理解輸入（感測器）與輸出（LED / 蜂鳴器 / 伺服）概念 | 光敏電阻、Pulse Sensor、伺服馬達；讀取感測值 → 控制輸出裝置                          | Arduino IDE、Tinkercad、Fritzing     |
| 3  | 整合小範例           | 建立「輸入 → 處理 → 輸出」完整流程           | 光控 LED、按鈕控制蜂鳴器、心跳偵測燈；嘗試改變閾值與條件                                 | Arduino IDE、Tinkercad、AI 輔助程式（選用）  |
| 4  | 動力控制與擴充應用       | 學會使用繼電器與馬達控制外部設備               | 控制 DC 馬達、風扇、水泵等；了解繼電器接線與安全電壓概念                                 | Arduino IDE、Tinkercad、Fritzing     |
| 5  | 主題發想與設計規劃       | 學生能定義主題並設計 Prototype 架構        | 小組討論應用主題（如電動小船 / 遠距醫療）；畫流程圖與線路圖；分配工作                           | Miro / Jamboard、draw.io、Fritzing   |
| 6  | Prototype 製作與測試 | 製作可運作的原型並進行測試與除錯               | 整合感測器、蜂鳴器、繼電器、馬達或伺服；模擬情境測試與 Debug                              | Arduino IDE、Tinkercad、AI 輔助程式      |


# 1. 為什麼要學 Arduino ？

生活中許多智慧裝置都依靠「微控制器」運作，例如：

體溫偵測門、智慧手環、自動開燈裝置。

這些裝置的核心，其實就是「開發板 + 感測器 + 程式控制」。

我們要學會讓電腦「聽懂環境資料」並「作出反應」。

![image](https://hackmd.io/_uploads/B1t710EAlx.png)



# 2. 常見的類別

| 類型                  | 特色                | 適合用途          |
| ------------------- | ----------------- | ------------- |
| **Arduino UNO**     | 初學者最常用；腳位明確、穩定度高  | 感測器實驗、簡易自動化裝置 |
| **Arduino Nano**    | 體積小、功能與 UNO 類似    | 穿戴裝置、小型專題     |
| **Arduino Mega**    | 腳位多、適合大型專案        | 多感測器整合、機械手臂控制 |
| **ESP32 / ESP8266** | 內建 Wi-Fi / 藍牙；可連網 | 物聯網、遠端監控、影像傳輸 |
| **micro:bit**       | 圖像化介面簡單易懂         | 國中入門課程、邏輯訓練   |
| **Raspberry Pi**    | 是電腦非微控器，能跑完整系統    | AI、影像辨識、伺服應用  |

Arduino UNO
![image](https://hackmd.io/_uploads/SJq6jaEAxx.png)
Arduino Nano
![image](https://hackmd.io/_uploads/rywznpVRgg.png)
ESP32
![image](https://hackmd.io/_uploads/ryQHmANCxx.png)


# 3. 前置準備
## 安裝軟體  
下載網址: https://www.arduino.cc/en/software/
![image](https://hackmd.io/_uploads/B1V0J0VAll.png)
![image](https://hackmd.io/_uploads/rkAeg0EAxg.png)


# 4.認識介面
![image](https://hackmd.io/_uploads/rkwRz0N0ex.png)

內建LED燈閃爍亮燈
```C++=
void setup() {
  pinMode(13, OUTPUT);  // LED 腳位設定為輸出
}

void loop() {
  digitalWrite(13, HIGH);  // LED 亮
  delay(500);              // 暫停 0.5 秒
  digitalWrite(13, LOW);   // LED 熄
  delay(500);              // 暫停 0.5 秒
}
```
正確沒問題
![image](https://hackmd.io/_uploads/SyEM80ERgl.png)
錯誤訊息
![image](https://hackmd.io/_uploads/ByvHIRNRxg.png)

# 5. 模擬電路
進入thinkcad
![image](https://hackmd.io/_uploads/r1qaIANRle.png)

![image](https://hackmd.io/_uploads/rJ64vCNAee.png)

拖拉出元件
![image](https://hackmd.io/_uploads/B1RbdA40le.png)
打開coding
![image](https://hackmd.io/_uploads/HyeAdRVRlg.png)
貼上程式 按下模擬看看是否成功運行
![image](https://hackmd.io/_uploads/HkK8YRVAlg.png)
成功運行LED燈會閃爍
![image](https://hackmd.io/_uploads/HkzhK0N0ee.png)

完成電路模擬確認沒問題後可以實際進行接線測試

## 設計LED燈線路
![image](https://hackmd.io/_uploads/B1vETCVAgx.png)
程式碼
```C++=
void setup() {
  pinMode(4, OUTPUT);  // LED 腳位設定為輸出
}

void loop() 
{
  digitalWrite(4, HIGH);  // LED 亮
  delay(1000);              // 暫停 0.5 秒
  digitalWrite(4, LOW);   // LED 熄
  delay(1000);              // 暫停 0.5 秒
}
```
## 讀取與寫入

晶片基本運作架構

![image](https://hackmd.io/_uploads/H1wKNCSRge.png)

輸入訊號
１．數位輸入（Digital Input）
２．類比輸入（Analog Input）
３．通訊型輸入（Serial / Communication Input）
４．進階訊號（特定用途）參考元件文檔

輸出訊號
１．數位輸出（Digital Output）
２．類比輸出（Analog Output，PWM 模擬）
３．通訊輸出（Serial / Communication Output）

## 數位訊號寫入
```C++=
void setup() {
  pinMode(13, OUTPUT);  // LED 腳位設定為輸出
}

void loop() {
  digitalWrite(13, HIGH);  // LED 亮
  delay(500);              // 暫停 0.5 秒
  digitalWrite(13, LOW);   // LED 熄
  delay(500);              // 暫停 0.5 秒
}
```
## 加入迴圈

### 範例 1：LED 閃爍（使用 loop()）
```C++=
void setup() {
  pinMode(13, OUTPUT);   // LED 腳位
}

void loop() {
  digitalWrite(13, HIGH); // LED 亮
  delay(500);             // 暫停 0.5 秒
  digitalWrite(13, LOW);  // LED 熄
  delay(500);             // 暫停 0.5 秒
}
```
電阻公式
![image](https://hackmd.io/_uploads/HJ5EmNUAxl.png)

 ### 範例 2 列印出訊號
```C++=
void setup() {
  Serial.begin(9600);   // 啟動序列埠
}

void loop() {
  for(int i = 1; i <= 5; i++) {
    Serial.println(i);  // 印出 1~5
    delay(500);         // 每 0.5 秒印一次
  }
  delay(2000);          // 迴圈結束後停 2 秒再重複
}
```
![image](https://hackmd.io/_uploads/BkiqHQD0lx.png)
![image](https://hackmd.io/_uploads/rkStS7w0el.png)

 ### 範例 3 按鈕控制 LED
 ```C++=
void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  for(int i = 0; i < 3; i++) {    // 重複 3 次
    digitalWrite(13, HIGH);
    delay(300);
    digitalWrite(13, LOW);
    delay(300);
  }
  delay(1000);                     // 閃 3 次後停 1 秒
}
```


## 讀取訊號範例
### 範例一：按著開關 顯示燈號　

```C++=
void setup() {
  pinMode(4, INPUT_PULLUP);   // 啟用內建上拉電阻
  pinMode(9, OUTPUT);         // LED 腳位
}

void loop() {
  int sw = digitalRead(4);    // 讀取按鈕狀態

  if (sw == LOW) {            // 按下（接地）→ 亮
    digitalWrite(9, HIGH);
  } else {                    // 放開 → 滅
    digitalWrite(9, LOW);
  }
}
```
![image](https://hackmd.io/_uploads/rJRh-NLCge.png)


### 範住二: 開關切換

```C++=
int ledState = LOW;
int lastButtonState = HIGH;

void setup() {
  pinMode(4, INPUT_PULLUP);
  pinMode(9, OUTPUT);
}

void loop() {

  if (digitalRead(4) == LOW and lastButtonState == HIGH) {
    delay(50); // 簡單防抖
    ledState = !ledState;
    digitalWrite(9, ledState);
  }

  lastButtonState = digitalRead(4);// 回復原本state
}

```
| 時間    | 按鈕實際狀態 | 4號腳位狀態 | lastButtonState | 判斷結果          |
| ----- | ------ | ------- | --------------- | ------------- |
| 第一次讀取 | HIGH   | HIGH    | HIGH            | 沒變化           |
| 按下瞬間  | LOW    | LOW     | HIGH            | ✅ 偵測到「狀態改變」   |
| 按住中   | LOW    | LOW     | LOW             | 無變化，不重複觸發     |
| 放開瞬間  | HIGH   | HIGH    | LOW             | 狀態改變，但不切換 LED |
| 下一輪   | HIGH   | HIGH    | HIGH            | 穩定            |

### 範例三:類比訊號開關切換
```cpp=
int currentSpeed = 0;
int lastButtonState = HIGH;

void setup() {
  pinMode(4, INPUT_PULLUP);
  pinMode(9, OUTPUT);
  analogWrite(9, 0); 
}

void loop() {
  int buttonState = digitalRead(4);

  if (buttonState == LOW && lastButtonState == HIGH) {    
    delay(50); 
    
    if (currentSpeed == 0) {
      currentSpeed = 127; 
    } else {
      currentSpeed = 0;
    }
    
    analogWrite(9, currentSpeed);
  }

  lastButtonState = buttonState;
}
```

### 回家作業 試著按下開關讓LED按下一顆按鈕後依序閃爍 
![image](https://hackmd.io/_uploads/Sy8g0bDAxe.png)

常見指令
| 指令名稱           | 功能                          |
| -------------- | --------------------------- |
| pinMode()      | 設定腳位為輸入或輸出                  |
| digitalRead()  | 讀取按鈕或腳位電位 HIGH / LOW        |
| digitalWrite() | 設定腳位輸出 HIGH / LOW，控制 LED 亮滅 |
| delay()        | 暫停程式執行指定毫秒，可用於 LED 閃爍或防抖    |

# 6.燒入檔案
## 選擇正確的板子
![image](https://hackmd.io/_uploads/BkmJmQwRgl.png)
## 確認序列埠有正確連接
![image](https://hackmd.io/_uploads/Sk-zQXDCge.png)
## 韌體更新
![image](https://hackmd.io/_uploads/rJPB7QvAlg.png)





第一課 arduino認識數位信號與開關
https://hackmd.io/@godgods/SkaUwHi6xe
第二課 arduino認識類比信號與讀取與寫入
https://hackmd.io/@godgods/SJbpxvn0gg
第三課 arduino LCD函式控制
https://hackmd.io/@godgods/ryxXL7skWe
第四課 arduion 小電控制大電繼電器與馬達擴充版
https://hackmd.io/@godgods/HJllN2n0xg
