---
# System prepended metadata

title: '第二課:類比訊號控制'
tags: [Arduino]

---

# 感測與輸出控制


## 類比訊號 & PWM 控制
生活中很多量是連續的，例如光線強弱、溫度、聲音等，這些訊號都屬於類比訊號（Analog Signal）。Arduino 可以讀取類比訊號，並利用 PWM（Pulse Width Modulation）模擬類比輸出控制 LED 或馬達。

### 1. 類比訊號概念

數位訊號（Digital Signal）：只有 HIGH / LOW（1 / 0）兩種狀態

類比訊號（Analog Signal）：連續值，可在一定範圍內變化（例如 0~1023）

| 感測器類型 | 類比訊號範圍 | 應用           |
| ----- | ------ | ------------ |
| 光敏電阻  | 0~1023 | 光線感應、LED亮度控制 |
| 電位器   | 0~1023 | 調整旋轉角度、音量控制  |
| 溫度感測器 | 0~1023 | 溫度測量、風扇控制    |

內部轉換原理圖
![image](https://hackmd.io/_uploads/rJGhBzVZbg.png)


### 2. 讀取類比訊號（analogRead）

Arduino 提供 analogRead(pin) 指令讀取類比電壓，回傳值 0~1023（對應 0~5V）。
```C++=
int sensorPin = A0; // 類比腳位
int sensorValue = 0;

void setup() {
  Serial.begin(9600); // 開啟序列埠
}

void loop() {
  sensorValue = analogRead(sensorPin);
  Serial.println(sensorValue); // 印出 0~1023
  delay(500);
}
```
濕度感應器為範例
![image](https://hackmd.io/_uploads/Bk98F53Axg.png)
VCC=>3.3V
GND=>GND
SIG=>A0

模擬器數值 
![image](https://hackmd.io/_uploads/r1t2F5h0ge.png)



### 3. 類比輸出（PWM 模擬）
Arduino 無法直接輸出連續電壓，但可以用 PWM（Pulse Width Modulation） 模擬類比電壓。

指令：analogWrite(pin, value)

value 範圍：0~255

腳位會快速切換高低電位 → 平均電壓改變 → LED 亮度或馬達速度改變

佔空比 (Duty Cycle),訊號 HIGH 佔比,輸出的平均電壓
20%,20%,5V×0.2=1V
50%,50%,5V×0.5=2.5V
80%,80%,5V×0.8=4V

範例：LED 漸亮與漸暗
```C++=
int ledPin = 9;
int brightness = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  for(brightness = 0; brightness <= 255; brightness++){
    analogWrite(ledPin, brightness);
    delay(10);
  }
  for(brightness = 255; brightness >= 0; brightness--){
    analogWrite(ledPin, brightness);
    delay(10);
  }
}
```
![image](https://hackmd.io/_uploads/B1iyocnCeg.png)

### 4. 結合感測器與 PWM
將感測器讀值映射到 PWM 控制 LED 亮度：
```C++=
int sensorPin = A0;
int ledPin = 9;
int sensorValue = 0;
int ledBrightness = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  sensorValue = analogRead(sensorPin);                  // 0~1023
  ledBrightness = map(sensorValue, 0, 1023, 0, 255);   // 映射到 PWM
  analogWrite(ledPin, ledBrightness);                  // 控制 LED
  Serial.println(ledBrightness);
  delay(100);
}

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


應用：自動調整 LED 亮度、溫度控制風扇、環境光感應裝置
### 5. 小技巧

類比輸入腳位：A0~A5（UNO）

PWM 輸出腳位會有 ~ 標示，例如 3,5,6,9,10,11

使用 map() 將不同範圍轉換，方便控制 LED / 馬達

## 延伸思考

將 LED 與感測器結合，可做自動亮度調整

將溫度感測器與馬達結合，可做簡單溫控系統

## 上下拉電阻補充說明
![image](https://hackmd.io/_uploads/BJtnHg3l-g.png)
上拉電阻=>開關斷開時有少量的正電流入主板，保持電壓穩定不彈跳
下拉電阻=>開關斷開時接地維持負極訊號，接通後少量正極流入主板
想著開關接處不良是怎麼回是?

參考範例: 
https://wokwi.com/arduino

## Eric簡單認識Arduino: 

第一課 arduino認識數位信號與開關
https://hackmd.io/@godgods/SkaUwHi6xe
第二課 arduino認識類比信號與讀取與寫入
https://hackmd.io/@godgods/SJbpxvn0gg
第三課 arduino LCD函式控制
https://hackmd.io/@godgods/ryxXL7skWe
第四課 arduion 小電控制大電繼電器與馬達擴充版
https://hackmd.io/u4q_ACo6Rx-L3JLqQ-ok5Q
第五課 arduino 簡單通訊藍芽與Wifi

