ในบทความนี้ คุณจะได้เรียนรู้วิธีการสร้างสวิตช์เปิด-ปิดไฟที่ไม่ต้องใช้การกดปุ่มทางกล (Mechanical Switch) แต่ใช้การตรวจจับประจุไฟฟ้าจากปลายนิ้ว (Capacitive Touch) โดยใช้บอร์ดรุ่นใหม่ล่าสุดอย่าง ESP32-C6 ซึ่งรองรับเทคโนโลยีล้ำสมัยอย่าง Wi-Fi 6 และ Matter ในอนาคต

อุปกรณ์ที่ต้องใช้
- ESP32-C6 DevKit: บอร์ดไมโครคอนโทรลเลอร์ตัวแรง รองรับ Wi-Fi 6 และ Matter
- Capacitive Touch Sensor (TTP223): โมดูลสัมผัส
- Relay Module 1 Channel: สำหรับตัดต่อวงจรไฟ 220V
- Logic Level Shifter 8-bit: ตัวแปลงระดับสัญญาณ (เนื่องจาก ESP32 ทำงานที่ 3.3V แต่ Relay บางรุ่นต้องการ 5V เพื่อความเสถียร)
- Power Supply 5V: สำหรับเลี้ยงระบบ
การต่อวงจรแบบละเอียด (Schematic & Wiring)
การต่อ Logic Level Shifter จะมี 2 ฝั่ง คือ LV (Low Voltage) สำหรับฝั่ง 3.3V และ HV (High Voltage) สำหรับฝั่ง 5V

1. การต่อฝั่ง Power (ไฟเลี้ยง)
-
แหล่งจ่าย 5V: ต่อเข้าขา 5V ของ ESP32 และขา HV ของ Shifter รวมถึง VCC ของ Relay
-
แหล่งจ่าย 3.3V: ต่อจากขา 3V3 ของ ESP32 ไปที่ขา VCC ของ Touch Sensor และขา LV ของ Shifter
-
GND: ต้องต่อ Ground ทุกตัวรวมกัน (Common Ground)
2. การต่อสัญญาณ (Signal)
-
Touch Sensor (Input):
-
ขา SIG -> ต่อเข้า GPIO 1 ของ ESP32-C6
-
-
Relay (Output) ผ่าน Shifter:
-
ESP32 GPIO 2 -> ต่อเข้าขา A1 (ฝั่ง LV) ของ Shifter
-
ขา B1 (ฝั่ง HV) ของ Shifter -> ต่อเข้าขา IN ของ Relay
-
การเขียนโค้ด (The Code)
ก่อนอัปโหลดโค้ด ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งบอร์ด ESP32 ใน Arduino IDE เรียบร้อยแล้ว

โค้ดตัวอย่าง
1#define RELAY_PIN 7
2#define TOUCH_PIN 20
3
4bool relayState = false;
5bool lastTouchState = LOW;
6
7void setup() {
8 pinMode(RELAY_PIN, OUTPUT);
9 pinMode(TOUCH_PIN, INPUT);
10
11 digitalWrite(RELAY_PIN, HIGH);
12
13 Serial.begin(115200);
14}
15
16void loop() {
17
18 bool touchState = digitalRead(TOUCH_PIN);
19
20 if (touchState == HIGH && lastTouchState == LOW) {
21 relayState = !relayState;
22
23 if (relayState) {
24 digitalWrite(RELAY_PIN, LOW);
25 Serial.println("Relay ON");
26 } else {
27 digitalWrite(RELAY_PIN, HIGH);
28 Serial.println("Relay OFF");
29 }
30
31 delay(200);
32 }
33
34 lastTouchState = touchState;
35}
ทำความเข้าใจโค้ด
1. การประกาศตัวแปรและการกำหนดขา (Configuration)
ส่วนนี้คือการบอกให้ ESP32-C6 รู้ว่าเราเชื่อมต่ออุปกรณ์ไว้ที่ช่องไหน และเตรียมพื้นที่ในหน่วยความจำเพื่อเก็บสถานะต่างๆ
1#define RELAY_PIN 7
2#define TOUCH_PIN 20
3
4bool relayState = false;
5bool lastTouchState = LOW; ทำไมต้องมี lastTouchState?: เพราะเราต้องการตรวจจับ "จังหวะที่เริ่มแตะ" (Transition) ไม่ใช่แค่การ "แตะค้างไว้" ครับ
2. ฟังก์ชัน Setup (Initial Configuration)
ทำงานเพียงครั้งเดียวเมื่อเปิดเครื่องหรือกดปุ่ม Reset
1void setup() {
2 pinMode(RELAY_PIN, OUTPUT);
3 pinMode(TOUCH_PIN, INPUT);
4
5 digitalWrite(RELAY_PIN, HIGH);
6
7 Serial.begin(115200);
8}4. ส่วนหัวใจหลัก: Loop และ State Change Detection
ในส่วนนี้โปรแกรมจะทำงานวนลูปไปเรื่อยๆ หลายล้านครั้งต่อวินาที เพื่อคอยเช็คว่า "นิ้วมาแตะหรือยัง?"
การตรวจจับการสัมผัส (The Trigger)
1void loop() {
2 bool touchState = digitalRead(TOUCH_PIN);
3
4 if (touchState == HIGH && lastTouchState == LOW) {
5 relayState = !relayState;การสั่งการตามสถานะ (The Action)
1if (relayState) {
2 digitalWrite(RELAY_PIN, LOW);
3 Serial.println("Relay ON");
4 } else {
5 digitalWrite(RELAY_PIN, HIGH);
6 Serial.println("Relay OFF");
7 }
8
9 delay(200);
10 }การบันทึกสถานะ (Memory Update)
1lastTouchState = touchState;
2}Schematic

เขียนแบบ 3D ด้วย Fusion 360

ทดสอบ
