--- tags: HW(HomeWork) Guide --- # 0414 課程 Code + Homework Guide - 注意: 有==黃標==的都是你要寫作業一定要看懂的地方。 ## 電路圖 - Tilt Switch (滾珠開關) circuit: - ![](https://i.imgur.com/7sKmxZj.png) - 滾珠開關的==板子==上的電路長的是這樣,==但跟下方寫著 fig.2 的電路有所落差== - ![](https://i.imgur.com/rbCfx7t.png) - 註: LED 只有數位 `2,3,4` 有用到,上圖圖片上總共有六個 LED,除 `2,3,4` 號腳以外的 LED 線路都不需要去接。 ### 電路詳解 * ==注意: 如果對電路 "功能" 不瞭解,務必要回去看== [20210407](https://docs.google.com/presentation/d/1qfixynjidyY5BX5fPmHdslZrSCJGHQD3IY2CrU5FxWI/edit#slide=id.p),以及 [20210317](https://docs.google.com/presentation/d/1UJ1lO8UpF8flb_QOaHVcjepT2g6-ZeVhCEm5BgVoVxI/edit#slide=id.gc86fc1bf1b_1_77) Slide。 * 每一個 LED 都被==一個數位輸出控制== - 所以看到了六個 LED,這意味著有==六個接腳是要當作輸出接腳==的。 - 這次的電路很像 [0317](https://docs.google.com/presentation/d/1UJ1lO8UpF8flb_QOaHVcjepT2g6-ZeVhCEm5BgVoVxI/edit#slide=id.p) Slide 講的內容,只是多接了幾個 LED。 * `VCC` 指的是==電源==,所以接到 Arduino 上就會是 5V。 * 觀察上面的 Tilt switch, 什麼東西會接5V? * 在 Arduino 實體模組上,==看到藍、白、黑三色底座的金屬 Pin 旁邊有 G、V、S== * 而 G = GND * V = Vcc = ==5V== * S = Signal = ==你模組上面的 Pin== * ![](https://i.imgur.com/aNwQuBq.png) ## Code ```C= // // Arduino Starter Kit projects // // Created by Josh Chang // Copyright © 2021 Futurenest. All rights reserved. // // 8-1 熟悉滾珠開關 // 宣告滾珠開關的引腳 const int pinIdTiltSwitch = 7; // 一個陣列來定義 LED 對應的數位 pins const int LEDsPinIds[] = { 3, 4, 5 }; // 總共 LED 的 pin 數目 const int numLEDsPinIds = 3; // 宣告變數 int tiltSwitchState = 0; // 目標要點亮的 LED,預設從 pin 3 開始,依序點亮。 int indexNextLEDToSwitchOn = 0; // 初始化 void setup() { // 設定序列埠傳輸速率 Serial.begin(9600); // 設定 LED 為輸出: 3, 4, 5 對應 G, Y, R pinMode(LEDsPinIds[0], OUTPUT); pinMode(LEDsPinIds[1], OUTPUT); pinMode(LEDsPinIds[2], OUTPUT); } // 重複執行 void loop() { // 讀取滾珠開關狀態(數位 pins,預設方向為輸入) tiltSwitchState = digitalRead(pinIdTiltSwitch); // 監控 1 Serial.print("開關狀態: "); Serial.println(tiltSwitchState); if (tiltSwitchState == 1) { if (indexNextLEDToSwitchOn < 3) { // 監控 2-1 Serial.print("點亮 LED: "); Serial.println(LEDsPinIds[indexNextLEDToSwitchOn]); digitalWrite(LEDsPinIds[indexNextLEDToSwitchOn], HIGH); indexNextLEDToSwitchOn = indexNextLEDToSwitchOn + 1; delay(1000); } else { // 監控 2-2 Serial.println("LED 已全亮,等待 Reset..."); } } else { digitalWrite(LEDsPinIds[0], LOW); digitalWrite(LEDsPinIds[1], LOW); digitalWrite(LEDsPinIds[2], LOW); // 將下一個要點亮的 LED 重新設為 pin 3 indexNextLEDToSwitchOn = 0; } delay(250); } ``` ### Code 詳解 - 由於這一次可能需要各位自己手動改 Code,因此會幾乎逐行解釋 - `void setup`, `void loop` - setup 的 `{}` 裡面的陳述只會跑一次 - loop 的 `{}` 則是會從上到下 -> 回到 loop 的開頭 -> 繼續從上到下.....loop - `pinIdTiltSwitch = 7` 決定了滾珠開關的 `digital_output` - 在 `LEDsPinIds[] = { 3, 4, 5 };` 這種寫法,我們會將 `LEDsPinIds` 叫做==陣列== - `{.....}` 在大括號裡面的內容是數據資料 - 而 `LEDsPinIds[1]` 等於 3, `LEDsPinIds[2]` 等於 4, `LEDsPinIds[3]` 等於 5 - `[1]`, `[2]`, `[3]` 指的是位置,也就是==在 "某個陣列" 裡面的第一個、第二個、第三個元素== - 所以 `LEDsPinIds[3]` 指到了 "第三個元素",因此如果我們 `Serial.print(LEDsPinIds[3])`, 則會得到 `5` 這個回應。 - 而我們會把 `[<INPUT_NUMBER>]` 的 `<INPUT_NUMBER>` 這個變數,==稱為 index== - `Serial.begin(9600);` 決定了傳輸速度 - 這有一個專有名詞: [鮑率 (baud rate)](https://zh.wikipedia.org/wiki/%E6%B3%A2%E7%89%B9%E7%8E%87)傳輸速度有很多種組合。 - ==不理解數字不影響作答==,但要確認==這個數字是否跟 Arduino IDE 的序列視窗數字相同==,因為兩個溝通的物件速度不一致就不能溝通。 - 在馬路走路的人能跟時速四十公里的公車司機聊天嗎? - `Serial.begin(<INPUT>);` ,此 `<INPUT>` 必須要跟圖片的這個數字一致: ![](https://i.imgur.com/1ssjKpw.png) - `Serial.println` 決定了傳輸下一行的內容 - `pinMode(LEDsPinIds[0], OUTPUT);` 是將 3 號引腳設置為 Output - 所以 `pinMode` 是==設定哪個引腳要輸入 / 輸出== - "為什麼是 3 號" 的原因,請看上面。 - `if (<Condition>) { statement...} else {....}` 指的是滿足 `(<Condition>)` 條件,則會跑 `{statement}` 的內容,若==沒有滿足,則跑 else 的內容== - 可以嘗試將以下 Code 扔進 tinkercad 的模擬區跑跑看: ```arduino= a = 123 void setup() { Serial.begin(9600) } if (a != 123) { Serial.println("Hello") } else { Serial.println("Wrong") } ``` - `indexNextLEDToSwitchOn = indexNextLEDToSwitchOn + 1;` - 因為 `=` 是==右邊的東西丟給左邊==,而==不是數學上的等於==,因此左右兩邊可以存在相同的變數。 - 而如果我們想在 ==condition 裡面表示數學上的等於==,==我們會改用 `==` 雙等號來表示== - 如果一開始 `indexNextLEDToSwitchOn` 是 9487,則跑完 `indexNextLEDToSwitchOn = indexNextLEDToSwitchOn + 1;`,==則 `indexNextLEDToSwitchOn` 就會變成 9488== - 所以,由於 ==`void loop` 會跑無數次==,那 `indexNextLEDToSwitchOn = indexNextLEDToSwitchOn + 1;` 會發生什麼事? - 在這種時候 `if...else..` 負責了什麼==非常重要、避免 "算太多" 的事==? - 且 `digitalWrite(LEDsPinIds[indexNextLEDToSwitchOn], HIGH);` 會發生什麼? - Extra: ==關於註解==: - 我們在寫 Code 的時候,有時候會有==暫時用不到的程式==,此時我們就會需要註解==告訴電腦 / 系統暫時把某段敘述當作沒看到== - `//` 雙槓後面的內容都會被當註解 - `/* */`,在星星符號裡面的也會被當註解 ```arduino= int a = 9487 //this can be seen //int a = 94888888 /* yajdlasdnaslfndglkjfdngjk;sng;sdfngfg 我是註解YEABEEEEE */ ``` - ==註解慣用的快捷鍵是 `Ctrl + /`== ## 作業內容 ### 問題一 - 拍下你接好的電路。 * 偷懶上傳法: 使用手機拍下 -> 利用 Line Keep / Messenger 傳給自己 -> 複製那張照片 -> 直接拖曳上來 ### 問題二 - 請改動程式,燈先亮中間、再亮左邊、再亮~~中間~~右邊。 - 左右邊定義: ![](https://i.imgur.com/OTo5xyw.png) - 請上傳你的作法,可以的話請利用這個語法在文字編輯區上: :::success \```arduino= <我是程式> \``` ::: * 上述語法是三個點點點,==該字元位在 tab 鈕的上面==,按三下 * 而總共會有六個點點點,上面三個下面再三個。 - 細節可以直接看老師在作業區的範例 ### 問題三 - 承問題一,利用問題一的 Code,將==滾珠開關移動後 LED 就熄滅==的功能拿掉。 - 上傳方式同問題二。 ### 問題四 - 仍舊承上題,==請將問題三的功能還原== - 然後,請在所有 LED 亮完的時候,多一個功能:在序列埠==印出你的學號== - 上傳方式同問題三。