---
# System prepended metadata

title: 第03週- IoT 數位及基本指令
tags: [ESP32, 基本指令, IoT]

---

# 第03週- IoT 數位及基本指令
###### tags: `ESP32` `IoT` `基本指令` `數位`
首先了解 ESP32 數位訊號以及相關指令。

---

## 免費線上模擬器介紹
1. TinkerCAD 電路設計：
- 模擬 Arduino 各種開板、各項電子零件和電路 (circuits)
- 建立帳戶 (Account creation)
- 開始第一專案 (Start your first project)
- 交換學習專案 (Exchanging your projects)

2. WOKWI 模擬器：
- 免費的線上Arduino, ESP32 和 Raspberry Pi Pico 開發板模擬器
- 建立帳戶 (Account creation)

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


## 再談上週挑戰題
### 設計接近實際路口時相的交通燈號
紅、黃、綠 依序啟閉
- 紅 LED 亮兩秒半後關閉，同時亮綠 LED
- 綠 LED 亮兩秒後關閉，同時亮黃 LED
- 黃 LED 亮半秒後關閉，同時亮紅 LED
> 提示 (hint):
>- 選擇正確的 ADC(2) 腳位，分別接不同 LED
>- delay(1000) 代表延遲一千亳秒 = 一秒

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

### Arduino IDE 程式語言
#### 變數(variable)
在程式中代表某個數值的名稱
- 非指令名稱
- 非數字開頭

在宣告時，需要同時定義型態(type)
- 決定記憶體大小 ，以及如何運算
如:
> - int x = 0; (宣告後馬上指定初使值)
>  ALU (arithmetic logic unit)
> - float y;
> - boolean z = 0;


#### 常數(constant)
也可以使用 #define 宣告
數字 int:
- const int redLed=15; (開一個16位元的空間)
- #define redLed 15 (不佔記憶體空間)

字元 char
- #define redLed ‘r’
- 數字為單字母ASCII 的數字序 r = 114

#### Digital Signal (雙向交通燈號)
如何變成有直橫向的交通燈號時序？
- 先配雙向的燈號電路
> - 多加一組紅、黃、綠 LED
> - 修改上週的程式，測試是否新加的燈會亮?

觀察直橫向的交通燈號時序關係

指令：
- 指定全域變數：int
- 設定腳位模式：pinMode(pin, OUTPUT)
- 輸出訊號：digitalWrite (pin, value)
- 輸出訊號持續的時間：delay(millis)

找出規律寫程式
- rLED(2500), gLED(2000), yLED(500) [直向]
- gLED2(2000), yLED2(500), rLED2(2500), [橫向]

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


:::success
例題3-1: [[路口紅綠燈(6顆LED)]](https://wokwi.com/projects/359154455039079425)
![](https://hackmd.io/_uploads/B1eYJPWKn.png)
:::


## 為電路加上一個數位開關
輕觸開關 (tack switch)電路設計
- 嵌入式系統架構的電路基礎觀念 (Elementary block diagram of Embedded System Structure for Electrical circuit)
> - 何謂嵌入式系統？
> - 和 IoT 的關聯性？
- 數位訊號輸入接地(digital read grounding)

![](https://hackmd.io/_uploads/ByUVBP-Y3.png)


## 設計第一個有數位開關控制線路
![](https://hackmd.io/_uploads/H1aJLD-th.png)

![](https://hackmd.io/_uploads/ry1v8P-Kn.png)

![](https://hackmd.io/_uploads/H1acLP-F3.png)

:::success
例題3-2: [[單顆按鈕控制LED燈]](https://wokwi.com/projects/359683804297538561)
:::

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


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

:::success
例題3-3: [[以 Serial.println 監看單顆按鈕控制LED燈狀況]](https://wokwi.com/projects/359672176169970689)
:::


:::success
挑戰題：
按一下開燈，再按一次後，熄燈？

例題3-4: [[按鈕按一次LED亮，再按一次LED滅]](https://wokwi.com/projects/359703829935135745)
:::

## 真實世界需要 debounce
![](https://hackmd.io/_uploads/BkshnwWY2.png)

![](https://hackmd.io/_uploads/HJaxTP-Y2.png)

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

:::success
例題3-5: [[debounce]](https://wokwi.com/projects/359348886337694721)

例題3-6: [[鈕計次]](https://wokwi.com/projects/359284020104756225)
:::

## 雙開開關設計
程式是否與單開不同？
![](https://hackmd.io/_uploads/HJZ0IFZt2.png)


:::info
:wink:挑戰題：
能否一個負責”開燈”？另一個負責”關燈”？
![](https://hackmd.io/_uploads/BJ4eDKZFn.png)

例題3-7: [[兩顆按鈕控制LED燈]](https://wokwi.com/projects/359704524594812929)
:::

## 雙開+單向交通燈號
觀察燈號的時序
- if (判斷式) vs. while (判斷式)，有何不同？
![](https://hackmd.io/_uploads/SJamFYZt2.png)



挑戰題：
- 開燈後，如何再按一次後，即時熄燈？
>- 是否需要改電路？

## 雙開+雙向交通燈號
觀察燈號的時序
- if (判斷式)vs. while (判斷式)，有何不同？
![](https://hackmd.io/_uploads/SyGZtFWt3.png)

挑戰題：
- 如何設計成兩個開關各自掌管一邊的燈號？
>- 是否需要改電路？

:::info
:wink: 來點挑戰吧
1. 單開電路，按一下開燈後，再按一次後熄燈？
2. 雙開關電路，一個負責”開燈”？另一個負責”關燈”？
提示 (hint): 使用兩個 ACD
3. 街口交通號制，如何設計成直、橫向各有一個開關，各自掌管的燈號的明滅？
:::

