ESP32 Capacitive Touch Sensor with LED Dimmer

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

ESP32 Capacitive Touch Sensor with LED Dimmer
รูปที่ 1 วงจรที่ใช้ในการทดลองที่ 1
ESP32 Capacitive Touch Sensor with LED Dimmer
รูปที่ 2 ลักษณะของการทดลองวงจรบนเบรดบอร์ดการทดลองที่ 1

ในรูปที่ 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 ให้ทราบอีกครั้ง

ESP32 Capacitive Touch Sensor with LED Dimmer
รูปที่ 3 แสดงข้อความ TouchPIN 4 เมื่อใช้นิ้วแตะที่ขา GPIO4
ESP32 Capacitive Touch Sensor with LED Dimmer
รูปที่ 4 แสดงข้อความ TouchPIN 12 เมื่อใช้นิ้วแตะที่ขา GPIO12
ESP32 Capacitive Touch Sensor with LED Dimmer
รูปที่ 5 แสดงข้อความ TouchPIN 13 เมื่อใช้นิ้วแตะที่ขา GPIO13
ESP32 Capacitive Touch Sensor with LED Dimmer
รูปที่ 6 แสดงข้อความ TouchPIN15 เมื่อใช้นิ้วแตะที่ขา GPIO15

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

ESP32 Capacitive Touch Sensor with LED Dimmer
รูปที่ 7 วงจรที่ใช้ในการทดลองที่ 2
ESP32 Capacitive Touch Sensor with LED Dimmer
รูปที่ 8 ลักษณะของการทดลองวงจรบนเบรดบอร์ดการทดลองที่ 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 แล้วสังเกตความสว่างของแอลอีดีที่เกิดขึ้น

ESP32 Capacitive Touch Sensor with LED Dimmer
รูปที่ 9 ความสว่างของแอลอีดีเมื่อค่าตัวแปร sensVal เท่ากับ 64
ESP32 Capacitive Touch Sensor with LED Dimmer
รูปที่ 10 ความสว่างของแอลอีดีเมื่อค่าตัวแปร sensVal เท่ากับ 128
ESP32 Capacitive Touch Sensor with LED Dimmer
รูปที่ 11 ความสว่างของแอลอีดีเมื่อค่าตัวแปร sensVal เท่ากับ 192
ESP32 Capacitive Touch Sensor with LED Dimmer
รูปที่ 12 ความสว่างของแอลอีดีเมื่อค่าตัวแปร sensVal เท่ากับ 255

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

Reference

  1. https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/peripherals/cap_touch_sens.html
  2. https://github.com/palsayantan/ESP32_Touch_Matrix
  3. https://learn.adafruit.com/adafruit-esp32-s2-feather/capacitive-touch