# 感測與輸出控制 ## 類比訊號 & 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