ESP32 Capacitive Touch Sensor with LED Dimmer

โครงงานการทดลองนี้เป็นการใช้งาน Capacitive Touch Sensor ที่สามารถใช้งานได้ในตัวบอร์ดควบคุม NodeMCU ESP32 ด้วยการเขียนโปรแกรมคำสั่งไม่มากนัก ซึ่งในบางครั้งสำหรับนำไปพัฒนาโครงงานขนาดเล็กที่ทำงานไม่ซับซ้อน ก็ช่วยลดการใช้อุปกรณ์ต่อร่วมภายนอกลงและเป็นการลดต้นทุนได้อีกส่วนหนึ่ง ทั้งนี้ในตัวโครงงานที่นำเสนอจะเป็นการทดลองใช้คำสั่งอย่างง่ายและสำหรับควบคุมความสว่างของแอลอีดีตัวเดียวด้วยสัญญาณพัลซ์วิดธ์มอดูเลตชั่น (PWM Signal) สำหรับเป็นไอเดียนำไปใช้งานต่างๆ ต่อไป


ในรูปที่ 1 และรูปที่ 2 แสดงวงจรที่ใช้ในการทดลองที่ 1 จะใช้งานขา GPIO4, GPIO15, GPIO13 และ GPIO 12 สำหรับทดลองการใช้งาน Capacitive Touch Sensor โดยจะใช้ตัวต้านทาน 0R (หรือเรียกตัวต้านทานจั้ม) ต่อที่ขา GPIO ทั้งหมด สำหรับใช้ทดลองเปลี่ยนค่าตัวเก็บประจุที่ขา GPIO ทั้งหมด
/*
Test 1: Touch Sensor ESP32 for GPIO4, GPIO15, GPIO 13, GPIO 12
*/
const int led = 2; // LED Display
int TouchPIN4,TouchPIN15,TouchPIN13,TouchPIN12,LevelThreshold = 40;
void setup() {
Serial.begin(115200);
pinMode(led, OUTPUT);
delay(100);
}
void loop() {
TouchPIN4 = touchRead(4); // (GPIO 4)
Serial.println(TouchPIN4);
if (TouchPIN4 < LevelThreshold){digitalWrite(led, HIGH);Serial.println(" TouchPIN 4 ");delay(500);}
TouchPIN15 = touchRead(15); // (GPIO 15)
Serial.println(TouchPIN15);
if (TouchPIN15 < LevelThreshold){digitalWrite(led, HIGH);Serial.println(" TouchPIN 15 ");delay(500);}
TouchPIN13 = touchRead(13); // (GPIO 13)
Serial.println(TouchPIN13);
if (TouchPIN13 < LevelThreshold){digitalWrite(led, HIGH);Serial.println(" TouchPIN 13 ");delay(500);}
TouchPIN12 = touchRead(12); // (GPIO 12)
Serial.println(TouchPIN12);
if (TouchPIN12 < LevelThreshold){digitalWrite(led, HIGH);Serial.println(" TouchPIN 12 ");delay(500);}
digitalWrite(led, LOW); // LED Display OFF
delay(50);
}
สำหรับโปรแกรมที่ 1 เป็นการทดลองการทำงานให้รับการสัมผัสที่ขา GPIO4, GPIO15, GPIO13, และ GPIO12 ตามนำดับด้วยคำสั่ง TouchPIN = touchRead(X); จากนั้นจะนำค่าในแต่ละขามาเปรียบเทียบกับค่า LevelThreshold เพื่อแยกระดับสัญญาณสัมผัสและไม่สัมผัสให้ชัดเจนขึ้นโดยค่า LevelThreshold จะกำหนดไว้ที่ระดับ 40 โดยในกดนี้ที่ขาใดถูกสัมผัส ก็จะทำใด้แอลอีดีบนบอร์ด NodeMCU ESP32 แสดงผลให้ทราบด้วยคำสั่ง digitalWrite(led, HIGH); และแสดงข้อความตำแหน่งขานั้นๆ ด้วยคำสั่ง Serial.println(” TouchPIN X “) ให้ทราบที่หน้าต่าง Serial Monitor ให้ทราบอีกครั้ง




ในรูปที่ 3 ถึงรูปที่ 6 แสดงผลการทดลองที่ 1 ด้วยแสดงข้อความ TouchPIN X เมื่อทดลองใช้นิ้วแตะที่ขา GPIO4, GPIO12, GPIO413, GPIO15 ซึ่งหมายความว่าขาอินพุต GPIO สามารถทำงานได้สอดคล้องกับโปรแกรมการทดลองที่เขียนไว้และใช้ในการทดลองที่ 2 อีกครั้ง


สำหรับรูปที่ 7 และรูปที่ 8 เป็นการทดลองที่ 2 โดยการเพิ่มแอลอีดีให้กับขา GPIO32 สำหรับแสดงผลความสว่างที่ระดับต่างๆ ตามค่าของสัญญาณพัลซ์วิดธ์มอดูเลตชั่นที่กำหนด ทั้งนี้เพื่อเป็นการใช้การสัมผัสขาอินพุต GPIO ต่างๆ ไปใช้ในการควบคุมอุปกรณ์ภายนอกแบบหนึ่ง
/*
Test 2: Touch Sensor ESP32 for GPIO4, GPIO15, GPIO 13, GPIO 12
*/
int led = 2; // LED Display on board
int ledDimmer = 32; // LED for Dimmer
int sensVal = 0;
int TouchPIN4,TouchPIN15,TouchPIN13,TouchPIN12,LevelThreshold = 40;
void setup() {
Serial.begin(115200);
pinMode(led, OUTPUT);
pinMode(ledDimmer, OUTPUT);
delay(100);
}
void loop() {
TouchPIN4 = touchRead(4); // (GPIO 4)
if (TouchPIN4 < LevelThreshold){digitalWrite(led, HIGH);Serial.println(" TouchPIN 4 ");delay(200);sensVal++;goto gosensVal;}
TouchPIN15 = touchRead(15); // (GPIO 15)
if (TouchPIN15 < LevelThreshold){digitalWrite(led, HIGH);Serial.println(" TouchPIN 15 ");delay(200);sensVal--;goto gosensVal;}
TouchPIN13 = touchRead(13); // (GPIO 13)
if (TouchPIN13 < LevelThreshold){digitalWrite(led, HIGH);Serial.println(" TouchPIN 13 ");delay(200);sensVal = 0;goto gosensVal;}
TouchPIN12 = touchRead(12); // (GPIO 12)
if (TouchPIN12 < LevelThreshold){digitalWrite(led, HIGH);Serial.println(" TouchPIN 12 ");delay(200);sensVal = 255;goto gosensVal;}
gosensVal:
sensVal = constrain(sensVal, 0, 255);
Serial.println(sensVal);
analogWrite(ledDimmer, sensVal);
digitalWrite(led, LOW); // LED Display OFF
delay(50);
}
ในส่วนโปรแกรมที่ 2 เป็นการทดลองการทำงานสวิตช์สำผัสเช่นเดิม แต่จะเพิ่มคำสั่ง sensVal++, sensVal–, sensVal = 0, sensVal = 255 และคำสั่ง analogWrite(ledDimmer, sensVal); เพื่อควบคุมความสว่างแอลอีดีที่ตำแหน่งขา GPIO32 สำหรับผลการทดลองจะแสดงในรูปที่ 9 ถึงรูปที่ 12 ด้วยการสัมผสที่ขาอินพุต GPIO4 ให้ค่าตัวแปร sensVal เท่ากับ 64, 128, 192 และ 255 แล้วสังเกตความสว่างของแอลอีดีที่เกิดขึ้น




สำหรับโครงงานนี้เป็นการทดลองใช้งานเซนเซอร์สวิตช์สำผัส ที่สามารถใช้งานได้ในบอร์ดควบคุม NodeMCU ESP32 โดยในการทดลองนี้จะใช้สวิตช์สำผัส 4 ตัวที่ขา GPIO4, GPIO15, GPIO12 และ GPIO13 ซึ่งจะกำหนดให้ GPIO4 เพิ่มค่าสัญญาณ PWM, GPIO15 ลดค่าสัญญาณ PWM, GPIO13 ให้ค่าสัญญาณ PWM เท่ากับ 0 และ GPIO12 ให้ค่าสัญญาณ PWM เท่ากับ 255 เพื่อควบคุมการส่งสัญญาณพัลซ์วิดธ์มอดูเลตชั่นด้วยคำสั่ง analogWrite(ledDimmer, sensVal); ทั้งนี้เนื้อหาในโครงงานคงจะช่วยให้ผู้อ่านสามารถนำไปใช้เป็นไอเดียของการพัฒนาวงจรต่างๆ ได้ง่ายและรวดเร็วยิ่งขึ้นครับ.
Reference