---
# System prepended metadata

title: 0414 課程 Code + Homework Guide
tags: [HW(HomeWork) Guide]

---

---
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 亮完的時候，多一個功能：在序列埠==印出你的學號==
- 上傳方式同問題三。