# 第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物聯網應用第十四章 – 尤濬哲(夜市小霸王) 編著