---
# System prepended metadata

title: 第04週- IoT 類比及基本指令
tags: [IoT]

---

# 第04週- IoT 類比及基本指令
###### tags: `ESP32` `IoT` `基本指令` `類比` 
在了解 ESP32 數位基本指令之後，學習較為生動貼近生活的類比訊號以及相關指令。

---

## 類比訊號
### 真實世界的樣貌
連續變化Sin型波：強弱、明暗、冷熱、快慢、深淺、高低音、大小力…
### ESP32 同時擁有 DAC 和 ADC (Analog to Digital Converter) 功能
1. 輸入：ADC 將類比電壓(Analog voltage)轉換成數位位階(Digital level)
> - 還記得有兩大組嗎？

2. 輸出：DAC 將數位數字(Digital number) 轉換成類比電壓(Analog voltage)
>- 但只有 8-bit (2的8次方) 的品質，別冀望有Hi-Fi的聲音品質
>- 只有兩腳位：GPIO25 (DAC channel1), GPIO26 (DAC channel2)
### 數位如何輸出成類比?
1. 方波
>- tone(pin, frequency, duration)

2. PWM
>- analogWrite(pin, value)

## PWM 技術：
微處理器無法直接輸出類比訊號，而PWM技術使得這種轉換變成普遍且方便。
1. 利用數位腳位發送一定頻率的方波，即輸出高電位和低電位，交替持續一段時間。
2. 週期(Period, T)是固定
3. 輸出高電位的時間一般稱為“脈衝寬度”(Pulse width)
4. 佔空比是脈衝持續時間或脈衝寬度（PW）佔波形總週期（T）的百分比
5. PWM 佔空比越長，輸出功率就越高
![](https://hackmd.io/_uploads/S1iRorZKh.png)

## Arduino IDE 程式語言 PWM
在 Arduino IDE 2.0.4 安裝 ESP32 AnalogWrite 程式庫
1) 點選程式庫(Library mgr)
2) 鍵入蒐尋關鍵字 esp32 analogWrite
3) 選擇 ERROPiX 版本安裝
4) 已安裝
![](https://hackmd.io/_uploads/S18iprZF3.png)


## Arduino IDE 程式語言 PWM
analogWrite(pin, value)
>- pin: 輸出腳位，任何 ADC，不限於 DAC
>- value: 0~255, (2^8 -1, 為 8-bit 解析度)

:::success
例題4-1: [[漸亮]](https://wokwi.com/projects/359787283092237313)

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


## Arduino IDE 程式語 for 迴圈
for (initialization; condition; increment) { // statement(s); }
>- ex: for (int i = 0; i < 256; i++) {
             analogWrite(ledpin, i); delay(20); } 
>- 呼吸燈：燈光亮滅節奏如呼吸

:::success
例題4-2: [[呼吸燈]](https://wokwi.com/projects/359798704289445889)
![](https://hackmd.io/_uploads/HJ_bbIWY3.png)
:::


## 閃爍快慢可調的燈號
1. analogRead(pin)
2. 配合旋鈕可變電阻

:::success
例題4-3: [[可調變亮滅時間_1]](https://wokwi.com/projects/359796209803292673)

例題4-4: [[可調變亮滅時間_2]](https://wokwi.com/projects/359797284807792641)

例題4-5: [[輸出感測值]](https://wokwi.com/projects/359797732610616321)

![](https://hackmd.io/_uploads/Sk25GL-Yn.png)

:::

## 來點聲音
1. 安裝程式庫 ESP32Servo (參照安裝 ESP32 analogWrite 步驟)
2. tone(pin, frequency, duration)
>- tone(18, 262, 2000): GPIO#18, 262Hz, 2000ms

:::success
例題4-6: [[蜂鳴器_單長音]](https://wokwi.com/projects/359857482119474177)

![](https://hackmd.io/_uploads/Byda78-K2.png)
:::

## 閃爍快慢可調的燈號和可變的聲音
:::success
例題4-7: [[蜂鳴器_單長音sine波]](https://wokwi.com/projects/359811080007868417)

例題4-8: [[蜂鳴器_連續sine波]](https://wokwi.com/projects/359857614322893825)

![](https://hackmd.io/_uploads/HkPkH8-Yh.png)

:::


## 使用 analog output (DAC) 輸出聲音
使用 dacWrite(pin, value) 函數做輸出：
1. 第一個參數給定 pin
>- 對應的 pin 不用特別宣告他的型態
>- 通常是 DAC1，DAC2

2. 第二個參數給定要輸出的值
>- 值範圍是 0~255

:::success
例題4-9: [[蜂鳴器_for迴圈，變調]](https://wokwi.com/projects/359858891400423425)

![](https://hackmd.io/_uploads/ryazuLZt2.png)
![](https://hackmd.io/_uploads/B187OUWt3.png)


:::








:::info
:wink: 來點挑戰吧
1. 控制RGB LED變成紫色 (參考課本54頁的資料)
2. 加個按鈕來發聲和消音
3. 如何使用 Wokwi 的模擬器，加上邏輯分析儀(Logic Analyzer)，以 Pulseview 觀看波型。參考影片
4. 若已熟悉光敏電阻、人體偵測器，請設計一個自動浴室燈光開關：
- 浴室內有人、昏暗(夜間) ：開燈，並持續3分鐘
- 浴室內有人、明亮(白天) ：無
- 浴室內無人、昏暗(夜間) ：無
- 浴室內無人、明亮(白天) ：無
:::


---

## 林水忠老的銜接課程
1. [課程銜接說明](https://hackmd.io/@smile2307/By_aIxil2)
2. [觸控電子琴影片](https://https://drive.google.com/file/d/1s5A8gJ9G4kcNoO3_QlU9zKMfuFusbzhR/view)

---

## 參考資料
>1）IOT物聯網應用第十四章 – 尤濬哲(夜市小霸王) 編著