โปรเจกต์นี้เป็นสวิตช์เปิด-ปิดไฟแบบไม่ต้องกดปุ่ม แค่เอานิ้วแตะก็สั่งงานได้ ใช้โมดูล TTP223 เป็นตัวรับสัมผัส ESP32-C6 เป็นสมอง แล้วสั่ง Relay ตัดต่อไฟ 220V อีกที จุดที่ต้องระวังคือ ESP32 ใช้ไฟ 3.3V แต่ Relay ส่วนใหญ่อยากได้สัญญาณ 5V เลยต้องมี Logic Level Shifter มาคั่นกลาง

1. อุปกรณ์ที่ต้องใช้
1. ESP32-C6 DevKit ซื้อเลยบน Shopee

2. Capacitive Touch Sensor (TTP223): โมดูลสัมผัส ซื้อเลยบน Shopee

3. Relay Module 1 Channel: สำหรับตัดต่อวงจรไฟ 220V ซื้อเลยบน Shopee

4. Logic Level Shifter 8-bit: ตัวแปลงระดับสัญญาณ (เนื่องจาก ESP32 ทำงานที่ 3.3V แต่ Relay บางรุ่นต้องการ 5V เพื่อความเสถียร) ซื้อเลยบน Shopee

2. การต่อวงจรแบบละเอียด (Schematic & Wiring)

ส่วนแรก ต่อ ESP32 ไปยัง Touch Sensor
ส่วนสอง ต่อ ESP32 กับ Level Shifter
ส่วนที่สาม ต่อ Relay กับ Level Shifter
ส่วนที่สี่ ต่อไฟเลี้ยงให้ Relay ผ่าน ESP32
3. เขียนโค้ด (The Code)
โค้ดตัวอย่าง
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#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}
4. ทำความเข้าใจโค้ด
1. การประกาศตัวแปรและการกำหนดขา
ส่วนนี้เป็นการประกาศตัวแปรต่างที่จำเป็น เช่น การกำหนด Pin ต่างๆ ที่ใช้
1#define RELAY_PIN 7
2#define TOUCH_PIN 20
3
4bool relayState = false;
5bool lastTouchState = LOW; 1#define RELAY_PIN 7
2#define TOUCH_PIN 20
3
4bool relayState = false;
5bool lastTouchState = LOW; ทำไมต้องมี lastTouchState?: เพราะเราต้องการตรวจจับ "จังหวะที่เริ่มแตะ" (Transition) ไม่ใช่แค่การ "แตะค้างไว้" ครับ
2. ฟังก์ชัน Setup
ส่วนนี้จะเป็นการตั้งค่า Pin ต่างๆ และ Serial ไว้พร้อมไช้งาน
1void setup() {
2 pinMode(RELAY_PIN, OUTPUT);
3 pinMode(TOUCH_PIN, INPUT);
4
5 digitalWrite(RELAY_PIN, HIGH);
6
7 Serial.begin(115200);
8}1void setup() {
2 pinMode(RELAY_PIN, OUTPUT);
3 pinMode(TOUCH_PIN, INPUT);
4
5 digitalWrite(RELAY_PIN, HIGH);
6
7 Serial.begin(115200);
8}ต้องสั่ง digitalWrite(RELAY_PIN, HIGH); ก่อนเพราะ Relay เป็น Active Low เราอย่างให้ตอนเริ่มรีเลย์ไม่ทำงาน ทำให้ต้องสั่ง High ไว้ก่อน
4. ส่วนหัวใจหลัก: Loop และ State Change Detection
ส่วนนี้จะเริ่มจากการตรวจจับการเปลี่ยนแปลงระหว่างสถานะของปุ่มไร้สัมผัสถ้ามีการสัมผัสเมื่อไหร่จะเปลี่ยนตัวแปร relayState เป็นตรงข้าม (ถ้าเปิดอยู่ให้ปิด แต่ถ้าปิดอยู่ให้เปิด)
1void loop() {
2 bool touchState = digitalRead(TOUCH_PIN);
3
4 if (touchState == HIGH && lastTouchState == LOW) {
5 relayState = !relayState;
6 }1void loop() {
2 bool touchState = digitalRead(TOUCH_PIN);
3
4 if (touchState == HIGH && lastTouchState == LOW) {
5 relayState = !relayState;
6 }ต้องเช็คตัวแปร lastTouchState ด้วยเพื่อให้โค้ดชุดนี้ทำงานเฉพาะจังหวะแรกที่มีการกดปุ่มเท่านั้นไม่ใช่ทำงานตลอด
จากนั้นเราจะต้องใช้ตัวแปร relayState มาใช้เปิดปิดรีเลย์จริงๆด้วนคำสั่ง digitalWrite
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 delay(200);
9}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 delay(200);
9}จุดสุดท้ายที่คนชอบลืมเราจะต้องบันทึกค่าของ สถานะปุ่มไว้ด้วยเพื่อใช้เช็คกับลูปถัดไป
1lastTouchState = touchState;1lastTouchState = touchState;5. ต่อวงจรลงบอร์ดไข่ปลา

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

7. ทดสอบการทำงาน

