--- tags: HW(HomeWork) Guide --- # 0323 課程 Code + HW(HomeWork) Guide - 注意: 有==黃標==的都是你要寫作業一定要看懂的地方。 ## 電路圖 - 電路圖: ![](https://i.imgur.com/waM8irf.png =75%x) - 實際電路圖: ![](https://i.imgur.com/EZVpfxV.png =75%x) ### 電路解析 - 上述電路圖是一個==接了一個三色 LED (稱為 RGB LED) 的電路==,並利用光敏電阻去對==個別對 R、G、B==的強度做控制。 - 上面的三個光敏電阻,利用光線改變光敏電阻值,但實際上==測得的適接地電阻==的電壓。 - 每一個光敏電阻串聯電阻的電路,測到的都是 R2 的電壓,等效於: ![](https://i.imgur.com/kg9EfIu.png =55%x) - RGB LED = 三個 LED ==放進一個 LED 殼子裡面== - ![](https://i.imgur.com/2uWz5AH.png) - 你可以看到其實 RGB LED 電路圖等價於: - ![](https://i.imgur.com/PxiXzKN.png =35%x) - 上面寫的 `common` 在你們的範例裡面就是接到 GND(0V) 上。 - 而 RGB LED 可以發出不同的顏色光是藉由==調整 R、G、B 三色 LED 的亮度調出來的== - 實物範例: ![](https://i.imgur.com/QtgKCcg.png =55%x) - 光線色相圖: ![](https://i.imgur.com/xVEj19d.png =45%x) ## Code: ```arduino= // // Arduino Starter Kit projects // // Created by Claudio Carnino // Modified by Josh Chang // Copyright © 2021 Futurenest. All rights reserved. // // 數位輸出腳位 enum digitalOutput { LedRed = 11, LedGreen = 10, LedBlue = 9, }; // 類比輸入腳位 enum analogInput { AiRed = A0, AiGreen = A1, AiBlue = A2, }; // 正規化後(0-255)輸出至 PWM 的對應 RGB 數值 int outputRedValue = 0; int outputGreenValue = 0; int outputBlueValue = 0; // 類比輸入的 RGB 大小相對讀值(0-1024) int inputRedValue = 0; int inputGreenValue = 0; int inputBlueValue = 0; void setup() { // 設定串列埠傳輸速率,單位:鮑率(Baud rate) Serial.begin(9600); // 設定數位輸出對應腳位 pinMode(LedRed, OUTPUT); pinMode(LedGreen, OUTPUT); pinMode(LedBlue, OUTPUT); } void loop() { // 透過類比輸入從光敏電阻電路讀取電壓值 inputRedValue = analogRead(AiRed); delay(5); inputGreenValue = analogRead(AiGreen); delay(5); inputBlueValue = analogRead(AiBlue); // 將輸入(0-1024)正規化成 PWM 值(0-255) outputRedValue = inputRedValue / 4; outputGreenValue = inputGreenValue / 4; outputBlueValue = inputBlueValue / 4; // 將 PWM 值輸出至對應 RGB LED 腳位 analogWrite(LedRed, outputRedValue); analogWrite(LedGreen, outputGreenValue); analogWrite(LedBlue, outputBlueValue); // 顯示數值在串列監視器 Serial.print("Input: "); Serial.print("R: "); Serial.print(inputRedValue); Serial.print(", G: "); Serial.print(inputGreenValue); Serial.print(", B: "); Serial.print(inputBlueValue); Serial.print(" # "); Serial.print("Output: "); Serial.print("R: "); Serial.print(outputRedValue); Serial.print(", G: "); Serial.print(outputGreenValue); Serial.print(", B: "); Serial.print(outputBlueValue); Serial.println("\n"); } ``` ### 局部 Code 詳解 - ==等號的意思是 "把右邊的東西給左邊" 喔==,並不是指==左右相等== - `Apple = 1` 是指把 `1` 這個==資料==丟給 `Apple` - 所以不會出現 `1 = Apple` 這種寫法,因為 `1` 是數字,數字==跟變數不一樣,是==不能被分配資料==的 - 觀察以下接腳==來判斷哪一個光敏電阻的 Analog Pin 是對應哪一個 LED== ```C= AiRed = A0, AiGreen = A1, AiBlue = A2, ``` - 以下三個變數讀取了實際的光敏電阻值, `analogRead` 讀取了 `AiRed` 引腳的數值後==丟給了 `inputRedValue` 當作給 LED 的輸入== ```C= inputRedValue = analogRead(AiRed); delay(5); inputGreenValue = analogRead(AiGreen); delay(5); inputBlueValue = analogRead(AiBlue); ``` - 以下三個變數實際地控制了紅、綠、藍的發光程度 ```C= int outputRedValue; int outputGreenValue; int outputBlueValue; ``` - 而上述的==outputValue 則被給了 inputvalue/4 的數值== ```C= outputRedValue = inputRedValue / 4; outputGreenValue = inputGreenValue / 4; outputBlueValue = inputBlueValue / 4; ``` ## 作業內容 ### 第一題 請把 RGB LED 燈亮出==紅、綠、藍、黃、紫==的五種顏色,利用==光敏電阻的強弱==調製出來,並把該色 LED 截圖下來貼在[作業區](https://hackmd.io/@smsh-program/1050323_hw) - Hint: 觀察色相度來==判斷三色 LED 的強弱關係== - 截圖要附上自己的名字,利用註解按鈕寫上自己的 `<學號>_<名字>`: - ![](https://i.imgur.com/2oetTDQ.png) - 截圖範例: - ![](https://i.imgur.com/ulC9Rur.png) - 也就是說,這張作業總共會==需要擷取五張圖片== ### 第二題 我們知道 ==ADC== (在 slide p20~p22) 可以測得某個電阻上的電壓,那麼: ```C= outputRedValue = inputRedValue / 4; outputGreenValue = inputGreenValue / 4; outputBlueValue = inputBlueValue / 4; ``` - 請問在上述的 Code 中,為什麼要 `/4` ? - Hint: 跟==RGB 的顏色有關==、但更嚴格的說法是==跟 PWM 的參數性質==有關 - 這是開放式問題,寫出你自己的觀察想法。老師到時候批改會寫一份 "比較工程" 卻又讓人相對能理解的答案。 ### 第三題 請回答以下小題: - 對於本次課程的負擔,如果 0~10 以滿分十分來當作受不了的標準, 請說一下你會打幾分? - 承上題,請問原因是? - 上到現在為止,你希望未來的課程對哪一個知識做補述? - 有沒有想對老師說的話、建議、抱怨? - ~~可以是髒話或靠杯沒關係,我會當小秘密~~ - 問題的性質請保證在**最基本的善良風俗標準內**。