วงจรที่ใช้ทดลอง
(https://www.praphas.com/PhotoForum/ESP32/Lab-08-Touch/2.png)
ตัวอย่างโปรแกรม [1] อ่านค่าจากขาสวิตช์สัมผัสแล้วแสดงผลทันที
เขียนโปรแกรมอ่านค่าจากขาสวิตช์สัมผัสแล้วแสดงผลค่าที่อ่านได้ผ่านทางพอร์ตอนุกรมแสดงผลบน Serial monitor ทันที
void setup()
{
Serial.begin(115200);
delay(1000);
}
void loop()
{
Serial.println(touchRead(T0));
delay(100);
}
สังเกตค่าที่อ่านได้
(https://www.praphas.com/PhotoForum/ESP32/Lab-08-Touch/3.png)
เนื่องจากค่าที่อ่านได้แสดงผลเป็นตัวเลขมีการแกว่งทำให้การวิเคราะห์ยาก ทำการเป็นการดูเป็นแบบกราฟแทน โดยดำเนินการตามรูป
(https://www.praphas.com/PhotoForum/ESP32/Lab-08-Touch/4.png)
สังเกตุค่าที่อ่านได้ จะเห็นว่ามีค่าที่แกว่งอยู่หากนำไปใช้งานโดยตรงจะทำให้โปรแกรมควบคุมงานทำงานผิดพลาดได้ จากรูปเป็นค่าในขณะที่ไม่มีการสัมผัส
(https://www.praphas.com/PhotoForum/ESP32/Lab-08-Touch/5.png)
ทดลองสัมผัสที่ตัวโลหะที่ขาสวิตช์สัมผัส ผลที่ได้เป็นดังรูป
(https://www.praphas.com/PhotoForum/ESP32/Lab-08-Touch/6.png)
เมื่อทดลองใช้ตัวเก็บประจุค่า 22pF ทำการกรองสัญญาณ ผลที่ได้ค่าจะลดลงแต่การแกว่งยังมีเหมือนเดิม
(https://www.praphas.com/PhotoForum/ESP32/Lab-08-Touch/7.png)
ตัวอย่างโปรแกรม [2] อ่านค่าจากขาสวิตช์สัมผัสจำนวนมากแล้วทำการเฉลี่ยก่อนใช้งาน
เขียนโปรแกรมอ่านค่าจากขาสวิตช์สัมผัส โดยอ่านค่าจำนวนมากแล้วทำการเฉลี่ยค่าที่อ่านได้ก่อนนำค่าที่ได้ไปแสดงผล ในตัวอย่างนี้ใช้วิธีการอ่าน 100 ครั้งโดยแต่ละครั้งของการอ่านจะห่างกัน 10 ไมโครวินาที
int touchValue = 0;
void setup()
{
Serial.begin(115200);
}
void loop()
{
for (byte i = 0; i < 100; i++)
{
touchValue += touchRead(T0);
delayMicroseconds(10);
}
touchValue/=100;
Serial.println(touchValue);
delay(50);
}
ผลที่ได้เป็นดังรูป
(https://www.praphas.com/PhotoForum/ESP32/Lab-08-Touch/8.png)
ตัวอย่างโปรแกรม [3] อ่านค่าจากขาสวิตช์สัมผัสแล้วไปควบคุมการทำงานของ LED
เขียนโปรแกรมอ่านค่าจากขาสวิตช์สัมผัสเพิ่มเติมจากตัวอย่างที่ 2 โดยให้ควบคุมการติดดับของ LED ใช้การตรวจสอบค่าเฉลี่ยของค่าที่อ่านจากสวิตช์สัมผัสหากต่ำกว่า 60 แสดงว่ามีการสัมผัสสวิตช์ (ดูจากกราฟผลการทดลองข้างต้น)
#define LED 27
int touchValue = 0;
void setup()
{
Serial.begin(115200);
pinMode(LED, OUTPUT);
}
void loop()
{
for (byte i = 0; i < 100; i++)
{
touchValue += touchRead(T0);
delayMicroseconds(10);
}
touchValue /= 100;
digitalWrite(LED, touchValue < 60 ? 1 : 0);
Serial.println(touchValue);
delay(50);
}
ผลการรันจากโค้ดตัวอย่าง [3]
https://www.youtube.com/v/fWiqIRqg2O0