# ESP32 × AIOT
補充:[C++ 教學](https://hackmd.io/@BeiDesign/cplusplus)
<br>
## 1. ESP32 與物聯網基礎
### 1-1 什麼是物聯網(IoT)?
:::warning
**物聯網(Internet of Things, IoT)**
:::
物聯網就是**讓「物」會感覺、會思考、會回應**
**核心流程只有四步:**
> 感測 → 判斷 → 行動 → 回傳資料

<br>
### 1-2 感測器的角色
:::warning
**感測器就是「電子的感官」**
:::
| 人類 | 電子 |
| --- | ----- |
| 眼睛 | 光敏感測器 |
| 皮膚 | 溫度、濕度 |
| 耳朵 | 麥克風 |
| 平衡感 | 陀螺儀 |

<br>
### 1-3 ESP32 的角色
:::warning
**ESP32 就是整個系統的「大腦」**
:::
它負責把感測器收到的資料整理起來,
依照程式規則做判斷,
再決定要不要控制裝置或把資料送上網。
| 任務 | 說明 |
| -- | ----------- |
| 接收 | 從感測器讀取數值 |
| 判斷 | 用程式決定接下來怎麼做 |
| 控制 | 開燈、響蜂鳴器、轉馬達 |
| 連網 | 把資料傳到雲端或手機 |
<br>
### 1-4 為什麼選 ESP32?
:::warning
**ESP32 = 控制 + 感測 + 無線通訊 一次到位**
:::
ESP32 的核心優勢:
- 內建 WiFi + BLE
- 雙核心處理器
- 記憶體 4MB
- 支援 OTA 遠端更新
- 腳位數多、功能完整
- 價格便宜、教學資源多
- 與 Arduino 語法高度相容
#### 和其他板子的差異:
| 板子 | 特點 |
| ------- | ---------------- |
| UNO | 入門、無網路 |
| ESP8266 | 單核心、WiFi |
| ESP32 | 雙核心 + WiFi + BLE |

<br>
<br>
## 2. 開發環境建立
### 步驟一:[下載 Arduino IDE](https://www.arduino.cc/en/software/)

<br>
### 步驟二:設定「額外開發板管理員網址」
```
https://dl.espressif.com/dl/package_esp32_index.json
```

<br>
### 步驟三:安裝 ESP32 開發板核心

:::info
如果是第一次使用**按鈕會是 INSTALL**,不會是 UPDATE 喔!
:::
<br>
### 步驟四:安裝驅動程式
**驅動程式 = USB ↔ ESP32 翻譯官**
[點此下載安裝](https://drive.google.com/file/d/1OS8NOjKURKl4gYf9aDzj29-vPjeNifEG/view?usp=sharing)

<br>
### 步驟五:設定開發板

<br>
### 步驟六:設定通訊連接參數

<br>
### 環境測試
#### (1) Hello World
```cpp=
void setup() {
Serial.begin(115200);
}
void loop() {
Serial.println("Hello ESP32");
delay(1000);
}
```
#### (2) 內建 LED
```cpp=
void setup() {
pinMode(2, OUTPUT);
}
void loop() {
digitalWrite(2, HIGH);
delay(1000);
digitalWrite(2, LOW);
delay(1000);
}
```
<br>
<br>
## 3. 數位類比與腳位觀念
### 3-1 數位訊號 vs 類比訊號
#### 數位訊號(Digital):
- 只有兩種狀態:**HIGH / LOW**
- 例子:按鈕、震動開關、磁簧開關...
#### 類比訊號(Analog):
- 數值連續(0~4095 概念)
- 例子:可變電阻、光敏電阻、土壤濕度...
:::info
有些模組同時提供 **Digital + Analog**
:::

<br>
### 3-2 ESP32 腳位觀念
#### 電源腳:
- 3.3V:提供 3.3V 給模組
- Vin:通常是 5V 輸入
- GND:地(接地)
:::info
**「所有模組一定要跟 ESP32 共地(GND 要相通)」**
:::
#### 一般 GPIO(Digital I/O):
GPIOxx 就是你寫程式時用的「腳位數字」
#### 顏色標籤:
- **ADC(類比輸入)**
- TOUCH(觸摸感測)
- SPI / I2C / UART(通訊)
#### ⚠️ 需要注意的腳位:
- GPIO34–GPIO39 只能輸入(Input Only)
- GPIO6–GPIO11 系統快閃記憶體用(不要碰)
:::info
**「34–39 只能讀;6–11 不要用」**
:::

:::spoiler 對照圖

:::
<br>
### 3-3 常用指令
#### `pinMode(pin, mode)`:
- pin 設定腳位
- mode 宣告腳位是輸入還是輸出
- `INPUT`
- `OUTPUT`
- `INPUT_PULLUP`
#### `digitalWrite(pin, level)`:
- pin 設定腳位
- mode 指定 GPIO 輸出 HIGH / LOW(控制裝置)
- `HIGH`
- `LOW`
#### `digitalRead(pin)`:
- pin 設定腳位
- 用途為讀取指定 GPIO 狀態(HIGH / LOW)
#### `delay(ms)`:
用途為讓程式延遲(毫秒)
:::info
**為什麼需要 delay(ms)?**
「因為 ESP32 跑得太快,不停下來,人類看不到、裝置也來不及反應」
:::
<br>
### 3-4 麵包版架構
#### 中間區域(放元件用):
- 中間左右兩塊是水平相通
- 同一排的 5 個洞是連在一起的
- 不同排,不相通
#### 左右兩側電源軌(+ / −)
- 旁邊紅色(+)和藍色(−)是一整條垂直相通
- 常用來:
- **紅色接 3.3V / 5V**
- **藍色接 GND**

<br>
<br>
## 實作紅綠燈系統
### 使用元件
LED 燈 × 3(紅、黃、綠)

<br>
### 參考接法
| 元件 | 長腳 | 短腳 |
| -------- | -------- | -------- |
| 紅色 LED | GPIO4(麵包版右側 5) | GND |
| 黃色 LED | GPIO0(麵包版右側 6) | GND |
| 綠色 LED | GPIO2(麵包版右側 7) | GND |

<br>
### 參考程式碼
```cpp=
const int LED_G = 2; // 綠燈 pin
const int LED_Y = 0; // 黃燈 pin
const int LED_R = 4; // 紅燈 pin
void setup() {
pinMode(LED_G, OUTPUT);
pinMode(LED_Y, OUTPUT);
pinMode(LED_R, OUTPUT);
}
void loop() {
// 綠燈 5 秒
digitalWrite(LED_G, HIGH);
digitalWrite(LED_Y, LOW);
digitalWrite(LED_R, LOW);
delay(5000);
// 黃燈 1 秒
digitalWrite(LED_G, LOW);
digitalWrite(LED_Y, HIGH);
digitalWrite(LED_R, LOW);
delay(1000);
// 紅燈 3 秒
digitalWrite(LED_G, LOW);
digitalWrite(LED_Y, LOW);
digitalWrite(LED_R, HIGH);
delay(3000);
}
```
<br>
<br>
## 其他章節
**下一篇:[元件介紹](https://hackmd.io/@BeiDesign/Component-introduction)**