---
# System prepended metadata

title: 元件介紹

---

# 元件介紹

<br>

## ESP32 腳位
![1584374673-2956395738](https://hackmd.io/_uploads/H1jl59eIWe.png)

<br>

## 1. LED 燈
### 1-1 基本介紹

![led-1](https://hackmd.io/_uploads/SJPbY9QUWx.jpg =50%x)

<br>

### 1-2 參考接法 
| 元件 | 長腳 | 短腳 |
| -------- | -------- | -------- |
| LED     | GPIO4（麵包版右側 5）    | GND |

![LED 燈_bb](https://hackmd.io/_uploads/S1Gw9qQL-l.png =75%x)

<br>

### 1-3 參考程式碼
```cpp=
// ====== 腳位設定 ======
#define LED_PIN 17

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_PIN, HIGH); // 亮
  delay(1000);

  digitalWrite(LED_PIN, LOW);  // 滅
  delay(1000);
}
```

<br>
<br>

## 2. RGB LED
### 2-1 基本介紹

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

<br>

### 2-2 參考接法
| 編號 | 腳位 |
| -------- | -------- |
| 1     | GPIO25（左側 11）    | 
| 2     | GND    | 
| 3     | GPIO26（左側 10）    | 
| 4     | GPIO27（左側 9）    | 

![RGB LED_bb](https://hackmd.io/_uploads/rJl2go7Ubx.png =75%x)

<br>

### 2-3 參考程式碼
```cpp=
// ===== 腳位 =====
#define PIN_R 25
#define PIN_G 26
#define PIN_B 27

void setup() {
  pinMode(PIN_R, OUTPUT);
  pinMode(PIN_G, OUTPUT);
  pinMode(PIN_B, OUTPUT);
}

void loop() {
  // 紅
  digitalWrite(PIN_R, HIGH);
  digitalWrite(PIN_G, LOW);
  digitalWrite(PIN_B, LOW);
  delay(1000);

  // 綠
  digitalWrite(PIN_R, LOW);
  digitalWrite(PIN_G, HIGH);
  digitalWrite(PIN_B, LOW);
  delay(1000);

  // 藍
  digitalWrite(PIN_R, LOW);
  digitalWrite(PIN_G, LOW);
  digitalWrite(PIN_B, HIGH);
  delay(1000);

  // 白（RGB 全亮）
  digitalWrite(PIN_R, HIGH);
  digitalWrite(PIN_G, HIGH);
  digitalWrite(PIN_B, HIGH);
  delay(1000);

  // 全關
  digitalWrite(PIN_R, LOW);
  digitalWrite(PIN_G, LOW);
  digitalWrite(PIN_B, LOW);
  delay(1000);
}
```

:::spoiler 調色版
```cpp=
// ===== 腳位 =====
#define PIN_R 25
#define PIN_G 26
#define PIN_B 27

void setup() {
  // ledcAttach(腳位, 頻率, 解析度)
  ledcAttach(PIN_R, 5000, 8);
  ledcAttach(PIN_G, 5000, 8);
  ledcAttach(PIN_B, 5000, 8);
}

void setColor(int r, int g, int b) {
  // ledcWrite(腳位, 數值)
  ledcWrite(PIN_R, r);
  ledcWrite(PIN_G, g);
  ledcWrite(PIN_B, b);
}

void loop() {
  setColor(255, 0, 0);   // 紅
  delay(1000);

  setColor(0, 255, 0);   // 綠
  delay(1000);

  setColor(0, 0, 255);   // 藍
  delay(1000);

  setColor(255, 255, 0); // 黃
  delay(1000);

  setColor(0, 255, 255); // 青
  delay(1000);

  setColor(255, 0, 255); // 紫
  delay(1000);

  setColor(255, 255, 255); // 白
  delay(1000);

  setColor(0, 0, 0);     // 關
  delay(1000);
}
```
:::

:::spoiler 漸變版
```cpp=
// ===== 腳位 =====
#define PIN_R 25
#define PIN_G 26
#define PIN_B 27

void setup() {
  // ledcAttach(腳位, 頻率, 解析度)
  ledcAttach(PIN_R, 5000, 8);
  ledcAttach(PIN_G, 5000, 8);
  ledcAttach(PIN_B, 5000, 8);
}

void setColor(int r, int g, int b) {
  // ledcWrite(腳位, 數值)
  ledcWrite(PIN_R, r);
  ledcWrite(PIN_G, g);
  ledcWrite(PIN_B, b);
}

void loop() {
  for (int i = 0; i <= 255; i++) {
    setColor(i, 0, 255 - i); // 紅 → 藍 漸變
    delay(10);
  }
}
```
:::

<br>
<br>

## 3. 蜂鳴器（無源）
### 3-1 基本介紹

![截圖 2026-01-25 晚上10.06.02](https://hackmd.io/_uploads/By7DQsQL-e.png =50%x)

### 3-2 參考接法
| 元件 | + | - |
| -------- | -------- | -------- |
| 蜂鳴器     | GPIO18（右側 11）    | GND |

![蜂鳴器_bb](https://hackmd.io/_uploads/ryIpEiQU-x.png =75%x)


<br>

### 3-3 參考程式碼
```cpp=
// ===== 腳位 =====
#define BUZZER_PIN 18

void setup() {
  ledcAttach(BUZZER_PIN, 2000, 8);   // 2kHz, 8-bit
}

void loop() {
  // 發聲
  ledcWrite(BUZZER_PIN, 128);   // 50% duty
  delay(1000);

  // 停止
  ledcWrite(BUZZER_PIN, 0);
  delay(1000);
}
```

:::spoiler 音調版
```cpp=
// ===== 腳位 =====
#define BUZZER_PIN 18

void setup() {
  // 初始化腳位
  ledcAttach(BUZZER_PIN, 2000, 8);   // 2kHz, 8-bit
}

void playTone(int freq, int duration) {
  // ledcWriteTone(腳位, 頻率)
  ledcWriteTone(BUZZER_PIN, freq); // 50% duty
  
  delay(duration);
  
  // 停止發聲
  ledcWriteTone(BUZZER_PIN, 0);
}

void loop() {
  playTone(523, 300);  // Do
  playTone(587, 300);  // Re
  playTone(659, 300);  // Mi
  playTone(698, 300);  // Fa
  playTone(784, 300);  // Sol
  
  delay(1000);
}
```
:::


<br>
<br>

## 4. 溫濕度感測器（DHT11）
### 4-1 基本介紹

![Gemini_Generated_Image_opmn6jopmn6jopmn (1) (1) (1) (1)](https://hackmd.io/_uploads/Sy1kiceIZe.png =50%x)

### 4-2 下載函式庫
```
DHT sensor library
```

![圖解](https://hackmd.io/_uploads/SJrJUie8bx.png)

<br>

### 4-3 參考接法

| 元件 | DATA | VCC | GND |
| -------- | -------- | -------- | -------- |
| DHT11     | GPIO17（右側 9）     | 3.3V     | GND |

![溫濕度感測器_bb](https://hackmd.io/_uploads/B1wrq7ZLbx.png =75%x)

<br>

### 4-4 參考程式碼

```cpp=
#include <DHT.h>

DHT dht(17, DHT11);

void setup() {
  Serial.begin(115200);
  dht.begin(); // 初始化 DHT 感測器

  Serial.println("DHT11 Sensor Start");
}

void loop() {
  float humidity = dht.readHumidity();        // 讀取濕度
  float temperature = dht.readTemperature();  // 讀取溫度（攝氏）

  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("Failed to read from DHT sensor");
    delay(2000);
    return;
  }

  Serial.print("Humidity: ");
  Serial.print(humidity);
  Serial.print(" %  |  ");

  Serial.print("Temperature: ");
  Serial.print(temperature);
  Serial.println(" °C");

  delay(2000);  // 2 秒讀一次
}
```

<br>
<br>

## 5. LCD 螢幕（1602 LCD I2C）
### 5-1 基本介紹

![Gemini_Generated_Image_577yij577yij577y (1)](https://hackmd.io/_uploads/HkJaydbUWe.png =50%x)

<br>

### 5-2 下載函式庫
```
LiquidCrystal_I2C
```

![圖解](https://hackmd.io/_uploads/HJLexObIbe.png)

<br>

### 5-3 參考接法

| 元件 | SDA | SCL | VCC | GND |
| -------- | -------- | -------- | -------- | -------- |
| 1602 LCD（I2C）     | GPIO21（右側 14）     | GPIO22（右側 17）     | 5V     | GND |

![LCD 螢幕_bb](https://hackmd.io/_uploads/Sk8WmdZIZl.png =75%x)

<br>

### 5-4 參考程式碼

```cpp=
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// ====== LCD 設定 ======
#define LCD_ADDRESS 0x27   // 常見位址：0x27 或 0x3F
#define LCD_COLS 16
#define LCD_ROWS 2

LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLS, LCD_ROWS);

void setup() {
  Wire.begin(21, 22);   // ESP32 I2C 腳位
  lcd.init();
  lcd.backlight();

  lcd.setCursor(0, 0);
  lcd.print("Hello ESP32");

  lcd.setCursor(0, 1);
  lcd.print("I2C LCD Ready");
}

void loop() {
  // 這個範例不需要 loop
}
```

<br>
<br>

## 6. 火焰傳感器（KY-026）
### 6-1 基本介紹

![KY-026-Flame-Sensor-](https://hackmd.io/_uploads/S1Uw3fQL-e.jpg =50%x)

:::info
DO：判斷「**有沒有火焰**」
AO：讀取「**火焰強度數值**」
:::

<br>

### 6-2 參考接法

| 元件 | DO | AO | VCC | GND |
| -------- | -------- | -------- | -------- | -------- |
| KY-026     | GPIO16 （右側 8）     | GPIO34（左側 15）     | 3.3V     | GND |

![火焰傳感器_bb](https://hackmd.io/_uploads/BJLeOmQU-e.png =75%x)


<br>

### 6-3 參考程式碼
```cpp=
// ====== 腳位設定 ======
#define FLAME_DO 16   // 數位輸出 DO
#define FLAME_AO 34   // 類比輸出 AO（ADC 腳位）

void setup() {
  Serial.begin(115200);

  pinMode(FLAME_DO, INPUT);

  Serial.println("KY-026 A0 + D0 Test Start");
}

void loop() {
  int digitalState = digitalRead(FLAME_DO);   // DO：有沒有火
  int analogValue  = analogRead(FLAME_AO);    // AO：火焰強度

  // 顯示數值
  Serial.print("AO Value: ");
  Serial.print(analogValue);
  Serial.print(" | DO State: ");

  if (digitalState == LOW) {
    Serial.println("Flame Detected");
  } else {
    Serial.println("No Flame");
  }

  delay(300);
}
```

<br>
<br>

## 7. 紅外線感測器（HW-416）
### 7-1 基本介紹

![hq720](https://hackmd.io/_uploads/HygqjQ7IZg.jpg)

:::info
Delay set 0.3s to 5 min：**維持時間**
Sensitivity set up 7 m：**感測距離**
:::

<br>

### 7-2 參考接法

| 元件 | OUT | VCC | GND |
| -------- | -------- | -------- | -------- |
| KY-026     | GPIO27 （左側 9）     | 5V     | GND |

![紅外線感測器_bb](https://hackmd.io/_uploads/rJ7IaQQLWl.png =75%x)

<br>

### 7-3 參考程式碼
```cpp=
// ====== 腳位設定 ======
#define PIR_PIN 27   // OUT 接在 GPIO27

void setup() {
  Serial.begin(115200);
  pinMode(PIR_PIN, INPUT);

  Serial.println("PIR Motion Sensor Start");
}

void loop() {
  int motion = digitalRead(PIR_PIN);

  if (motion == HIGH) {
    Serial.println("🚶 Motion Detected");
  } else {
    Serial.println("No Motion");
  }

  delay(300);
}
```

<br>
<br>

## 8. 觸碰感測器（HW-139）
### 8-1 基本介紹
![截圖 2026-01-25 下午1.47.28](https://hackmd.io/_uploads/ryBwx4XU-g.png)

<br>

### 8-2 參考接法

| 元件 | SIG | VCC | GND |
| -------- | -------- | -------- | -------- |
| HW-139     | GPIO25 （左側 11）     | 3.3V     | GND |

![觸碰感測器_bb](https://hackmd.io/_uploads/ByWdW47U-x.png =75%x)

<br>

### 8-3 參考程式碼
```cpp=
// ====== 腳位設定 ======
#define TOUCH_PIN 25   // SIG 接在 GPIO25

void setup() {
  Serial.begin(115200);
  pinMode(TOUCH_PIN, INPUT);

  Serial.println("KY-036 Touch Sensor Start");
}

void loop() {
  int state = digitalRead(TOUCH_PIN);

  if (state == HIGH) {
    Serial.println("Touch Detected");
  } else {
    Serial.println("No Touch");
  }

  delay(200);
}
```

<br>
<br>

## 9. 氣體感測器（MQ-2）
### 9-1 基本介紹

![ESP32_10015-2-1024x602](https://hackmd.io/_uploads/SyTpf4mLZg.png)

<br>

### 9-2 參考接法

| 元件 | DO | AO | VCC | GND |
| -------- | -------- | -------- | -------- | -------- |
| MQ-2     | GPIO16 （右側 8）     | GPIO34（左側 15）     | 5V     | GND |

![氣體感測器_bb](https://hackmd.io/_uploads/B1eTVEmIZl.png =75%x)

<br>

### 9-3 參考程式碼
```cpp=
// ====== 腳位設定 ======
#define MQ2_AO 34   // 類比輸出
#define MQ2_DO 16   // 數位輸出

void setup() {
  Serial.begin(115200);
  pinMode(MQ2_DO, INPUT);

  Serial.println("MQ-2 Gas Sensor Start");
}

void loop() {
  int gasValue = analogRead(MQ2_AO);   // 氣體濃度
  int gasAlarm = digitalRead(MQ2_DO);  // 是否超標

  Serial.print("AO Value: ");
  Serial.print(gasValue);
  Serial.print(" | DO State: ");

  if (gasAlarm == LOW) {
    Serial.println("Gas Detected");
  } else {
    Serial.println("Normal");
  }

  delay(500);
}
```

<br>
<br>

## 10. 超音波感測器（HC-SR04）
### 10-1 基本介紹

![48effbb0-c9d9-429b-ac84-038a5fd0cd1a](https://hackmd.io/_uploads/rkc4uVQU-e.jpg =50%x)

<br>

### 10-2 參考接法

| 元件 | Trig | Echo | VCC | GND |
| -------- | -------- | -------- | -------- | -------- |
| KY-026     | GPIO26 （左側 10）     | GPIO25（左側 11）     | 5V     | GND |

![超音波感測器_bb](https://hackmd.io/_uploads/B1Sr5Nm8Zg.png =75%x)

<br>

### 10-3 參考程式碼
```cpp=
// ====== 腳位設定 ======
#define TRIG_PIN 26
#define ECHO_PIN 25

void setup() {
  Serial.begin(115200);
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);

  Serial.println("HC-SR04 Start");
}

void loop() {
  // 發送超音波
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  // 讀取回波時間（微秒）
  long duration = pulseIn(ECHO_PIN, HIGH, 30000); // 30ms timeout

  // 距離計算（cm）
  float distance = duration * 0.034 / 2;

  if (duration == 0) {
    Serial.println("Out of range");
  } else {
    Serial.print("Distance: ");
    Serial.print(distance);
    Serial.println(" cm");
  }

  delay(500);
}
```

<br>
<br>

## 11. 光敏電阻模組（LM393）
### 11-1 基本介紹

![截圖 2026-01-25 下午3.25.27](https://hackmd.io/_uploads/BJSdSSmLbl.png)

<br>

### 11-2 參考接法
| 元件 | DO | AO | VCC | GND |
| -------- | -------- | -------- | -------- | -------- |
| LM393     | GPIO16 （右側 8）     | GPIO34（左側 15）     | 5V     | GND |

![光敏電阻_bb](https://hackmd.io/_uploads/rkVU_BQL-x.png =75%x)

<br>

### 11-3 參考程式碼
```cpp=
// ====== 腳位設定 ======
#define LIGHT_AO 34   // 類比亮度
#define LIGHT_DO 16   // 數位判斷

void setup() {
  Serial.begin(115200);
  pinMode(LIGHT_DO, INPUT);

  Serial.println("Photoresistor Sensor Start");
}

void loop() {
  int lightValue = analogRead(LIGHT_AO);   // 亮度數值
  int lightState = digitalRead(LIGHT_DO);  // 亮 / 暗判斷

  Serial.print("AO Value: ");
  Serial.print(lightValue);
  Serial.print(" | DO State: ");

  if (lightState == LOW) {
    Serial.println("Bright / Triggered");
  } else {
    Serial.println("Dark / Normal");
  }

  delay(300);
}
```

<br>
<br>

## 12. 震動感測器（SW-420）
### 12-1 基本介紹
![images](https://hackmd.io/_uploads/B1IDor7Ibg.jpg)

<br>

### 12-2 參考接法
| 元件 | DO | VCC | GND |
| -------- | -------- | -------- | -------- |
| HW-139     | GPIO16 （右側 8）     | 3.3V     | GND |

![震動感測器_bb](https://hackmd.io/_uploads/HkVOhSXIZx.png =75%x)

<br>

### 12-3 參考程式碼
```cpp=
// ====== 腳位設定 ======
#define VIB_PIN 16   // DO 接在 GPIO16

void setup() {
  Serial.begin(115200);
  pinMode(VIB_PIN, INPUT);

  Serial.println("SW-420 Vibration Sensor Start");
}

void loop() {
  int state = digitalRead(VIB_PIN);

  if (state == LOW) {
    Serial.println("Vibration Detected");
  } else {
    Serial.println("No Vibration");
  }

  delay(200);
}
```

<br>
<br>

## 13. 水位感測器（HW-038）
### 13-1 基本介紹

![截圖 2026-01-25 下午4.01.54](https://hackmd.io/_uploads/H1h7xLm8Wg.png)

<br>

### 13-2 參考接法
| 元件 | AO | VCC | GND |
| -------- | -------- | -------- | -------- |
| HW-038     | GPIO34 （左側 15）     | 3.3V     | GND |

![水位感測器_bb](https://hackmd.io/_uploads/SJq5fU7UZe.png =75%x)

<br>

### 13-3 參考程式碼
```cpp=
// ====== 腳位設定 ======
#define WATER_PIN 34   // AO 接在 GPIO34

void setup() {
  Serial.begin(115200);
  Serial.println("HW-038 Water Level Sensor Start");
}

void loop() {
  int waterValue = analogRead(WATER_PIN);

  Serial.print("Water Level Value: ");
  Serial.println(waterValue);

  delay(500);
}
```

<br>
<br>

## 14. 繼電器模組（HW-482）
### 14-1 基本介紹


![截圖 2026-01-25 下午4.43.51](https://hackmd.io/_uploads/H1spdI78bg.png =50%x)

:::info
NO：平常斷開，啟動才接通
NC：平常接通，啟動才斷開
:::

<br>

### 14-2 參考接法
| 元件 | IN | VCC | GND |
| -------- | -------- | -------- | -------- |
| HW-482     | GPIO17 （右側 9）     | 5V     | GND |

#### 繼電器關閉想通電
| NC | COM | NO | 
| -------- | -------- | -------- |
| VCC     | 白線     | X     |

#### 繼電器開啟想通電
| NC | COM | NO | 
| -------- | -------- | -------- |
| X     | 白線     | VCC     |

:::info
**黑線都接 GND**
:::


![bluetoothLight_bb](https://hackmd.io/_uploads/HJLJldm8Ze.png =75%x)

<br>

### 14-3 參考程式碼
```cpp=
// ====== 腳位設定 ======
#define RELAY_PIN 17   // IN 接在 GPIO17

void setup() {
  pinMode(RELAY_PIN, OUTPUT);

  // 預設關閉
  digitalWrite(RELAY_PIN, LOW);
}

void loop() {
  // 開啟繼電器
  digitalWrite(RELAY_PIN, HIGH);
  delay(2000);

  // 關閉繼電器
  digitalWrite(RELAY_PIN, LOW);
  delay(2000);
}
```

<br>
<br>

## 15. 土壤感測器（HW-103 × 080）
### 15-1 基本介紹

![截圖 2026-01-25 晚上10.20.18](https://hackmd.io/_uploads/rkWyDs7Ubl.png)

<br>

### 15-2 參考接法
| 元件 | DO | AO | VCC | GND |
| -------- | -------- | -------- | -------- | -------- |
| HW-103     | GPIO16 （右側 8）     | GPIO34（左側 15）     | 5V     | GND |

![土壤感測器_bb](https://hackmd.io/_uploads/rkdA_j78Wl.png =75%x)

<br>

### 15-3 參考程式碼
```cpp=
// ===== 腳位 =====
#define SOIL_AO 34
#define SOIL_DO 27

// 你一定要自己量一次再填：
// 空氣中(乾) 的 analogRead 值通常比較大
// 濕土中(濕) 的 analogRead 值通常比較小
int DRY_RAW = 3000;  // 乾值：探針在空氣中
int WET_RAW = 1200;  // 濕值：探針插在完全濕的土

int rawToPercent(int raw) {
  // 0% = 乾、100% = 濕
  int p = map(raw, DRY_RAW, WET_RAW, 0, 100);
  return constrain(p, 0, 100);
}

void setup() {
  Serial.begin(115200);

  pinMode(SOIL_DO, INPUT);

  // ESP32 ADC 設定（可選但建議）
  analogReadResolution(12);                   // 0~4095
  analogSetPinAttenuation(SOIL_AO, ADC_11db); // 量測範圍較大，讀值更穩
}

void loop() {
  int aoRaw = analogRead(SOIL_AO);     // 0~4095
  int aoPct = rawToPercent(aoRaw);     // 0~100%

  int doVal = digitalRead(SOIL_DO);    // 0/1，門檻由電位器決定

  // 多數這類模組：DO 的 LED 標示「低電平亮」
  // 所以 doVal==0 常表示「達到你設定的濕度門檻」（但以你調的為準）
  Serial.print("AO_raw=");
  Serial.print(aoRaw);
  Serial.print("  AO%=");
  Serial.print(aoPct);
  Serial.print("%  DO=");
  Serial.print(doVal);
  Serial.print("  DO_meaning=");
  Serial.println(doVal == 0 ? "TRIGGER(<=threshold)" : "NOT_TRIGGER(>threshold)");

  delay(500);
}
```


<br>
<br>

## 16. 伺服馬達（SG90）
### 16-1 基本介紹

![Servo-Motor-Pinout](https://hackmd.io/_uploads/HkSe7ABUWl.jpg =50%x)


<br>

### 16-2 下載函式庫
```
ESP32Servo
```

<br>

### 16-3 參考接法
| 元件 | Control | VCC | GND |
| -------- | -------- | -------- | -------- |
| SG90     | GPIO18 （右側 11）     | 5V     | GND |

<br>

### 16-4 參考程式碼
```cpp=
#include <ESP32Servo.h>

#define SERVO_PIN 18

Servo myServo;

void setup() {
  myServo.attach(SERVO_PIN, 500, 2400); 
}

void loop() {
  myServo.write(0);    // 轉到 0°
  delay(1000);

  myServo.write(90);   // 轉到 90°
  delay(1000);

  myServo.write(180);  // 轉到 180°
  delay(1000);
}
```

<br>
<br>


## 其他章節
**上一篇：[ESP32 × AIOT](https://hackmd.io/@BeiDesign/ESP32×AIOT)**
**下一篇：[通知與 AI 應用](https://hackmd.io/@BeiDesign/Notifications_AI)**