ผู้เขียน หัวข้อ: การเรียนรู้ครั้งที่ 8 [Basic ESP32] การใช้งานสวิตช์สัมผัส  (อ่าน 6612 ครั้ง)

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์
การเรียนรู้ครั้งที่ 8 [Basic ESP32] การใช้งานสวิตช์สัมผัส
 สวิตช์สัมผัสหรือเซ็นเซอร์สัมผัสภายในตัว ESP32 มีมาให้ใช้งานได้ทั้งหมด 10 ช่องสำหรับ ESP32 ในโมดูลที่มีขา GPIO0 ต่อมาให้ใช้งานเช่น ESP32 DevKitC เป็นโมดูลที่มีจำนวนขาทั้งหมด 34 ขา แต่สำหรับ ESP32 ในโมดูลที่ไม่ได้เชื่อมขา GPIO0 ออกมาให้ใช้งาน (เนื่องจากเป็นขาที่ใช้สำหรับบังคับเข้าโหมดการโปรแกรมตัวเองจึงไม่ควรเอาไปใช้งานอื่น) เช่น ESP32 DOIT ขาใช้งานสวิตช์สัมผัสหรือเซ็นเซอร์สัมผัสจะมีให้ใช้งานเพียง 9 ขาเท่านั้นโดยขา TOUCH1 ซึ่งเป็นขาเดียวกับ GPIO0 ไม่ได้ต่อมาให้ใช้งานดังรูป

วิธีการอ่านค่าจากขาพอร์ตสวิตช์สัมผัส
ESP32 มีฟังก์ชั่นที่ใช้สำหรับอ่านค่าจากขาพอร์ตที่ทำหน้าที่เป็นสวิตช์สัมผัสโดยเฉพาะ เพียงแต่การกำหนดขาใช้งานจะไม่ได้ใช้คำเป็นเช่นใช้ T0 สำหรับขาสวิตช์สัมผัส TOUCH0 เป็นต้น ดังนั้นขาพอร์ตตัวอื่น ๆ จะใช้ตัวย่อเช่นกันได้แก่
T0 แทนขาสวิตช์สัมผัส TOUCH0
T1 แทนขาสวิตช์สัมผัส TOUCH1 (ESP32 DOIT ไม่มีขานี้)
T2 แทนขาสวิตช์สัมผัส TOUCH2
T3 แทนขาสวิตช์สัมผัส TOUCH3
T4 แทนขาสวิตช์สัมผัส TOUCH4
T5 แทนขาสวิตช์สัมผัส TOUCH5
T6 แทนขาสวิตช์สัมผัส TOUCH6
T7 แทนขาสวิตช์สัมผัส TOUCH7
T8 แทนขาสวิตช์สัมผัส TOUCH8
T9 แทนขาสวิตช์สัมผัส TOUCH9
รูปแบบของฟังก์ชั่นการใช้งานเป็นดังนี้
x=touchRead(T0);  //อ่านค่าจากขาสวิตช์สัมผัส TOUCH0 มาเก็บไว้ในตัวแปร x
« แก้ไขครั้งสุดท้าย: มิถุนายน 05, 2019, 01:33:38 PM โดย admin »

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์
Re: การเรียนรู้ครั้งที่ 8 [Basic ESP32] การใช้งานสวิตช์สัมผัส
« ตอบกลับ #1 เมื่อ: มิถุนายน 05, 2019, 01:18:43 PM »

ฟังก์ชั่นที่ใช้งานในการทดลองนี้

รูปแบบ คำอธิบาย
touchRead(Touch pin); ฟังก์ชั่นอ่านค่าจากเซนเซอร์สัมผัส
Touch pin: หมายเลขขาพอร์ตของเซอร์เซอร์สัมผัสที่ต้องการอ่านค่า
เช่น x=touchRead(T0); หมายถึงอ่านค่าจากขา TOUCH0 เก็บไว้ในตัวแปร x
delayMicroseconds(us); ฟังก์ชั่นหน่วงเวลาเป็นไมโครวินาที
us:ค่าตัวเลขไมโครวินาทีที่ต้องการหน่วง
« แก้ไขครั้งสุดท้าย: มิถุนายน 05, 2019, 01:20:52 PM โดย admin »

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์
Re: การเรียนรู้ครั้งที่ 8 [Basic ESP32] การใช้งานสวิตช์สัมผัส
« ตอบกลับ #2 เมื่อ: มิถุนายน 05, 2019, 01:35:32 PM »
วงจรที่ใช้ทดลอง

ตัวอย่างโปรแกรม [1] อ่านค่าจากขาสวิตช์สัมผัสแล้วแสดงผลทันที
เขียนโปรแกรมอ่านค่าจากขาสวิตช์สัมผัสแล้วแสดงผลค่าที่อ่านได้ผ่านทางพอร์ตอนุกรมแสดงผลบน Serial monitor ทันที
โค๊ด: [Select]
void setup()
{
  Serial.begin(115200);
  delay(1000);
}
void loop()
{
  Serial.println(touchRead(T0));
  delay(100);
}
สังเกตค่าที่อ่านได้

เนื่องจากค่าที่อ่านได้แสดงผลเป็นตัวเลขมีการแกว่งทำให้การวิเคราะห์ยาก ทำการเป็นการดูเป็นแบบกราฟแทน โดยดำเนินการตามรูป

สังเกตุค่าที่อ่านได้ จะเห็นว่ามีค่าที่แกว่งอยู่หากนำไปใช้งานโดยตรงจะทำให้โปรแกรมควบคุมงานทำงานผิดพลาดได้ จากรูปเป็นค่าในขณะที่ไม่มีการสัมผัส

ทดลองสัมผัสที่ตัวโลหะที่ขาสวิตช์สัมผัส ผลที่ได้เป็นดังรูป

เมื่อทดลองใช้ตัวเก็บประจุค่า 22pF ทำการกรองสัญญาณ ผลที่ได้ค่าจะลดลงแต่การแกว่งยังมีเหมือนเดิม


ตัวอย่างโปรแกรม [2] อ่านค่าจากขาสวิตช์สัมผัสจำนวนมากแล้วทำการเฉลี่ยก่อนใช้งาน
เขียนโปรแกรมอ่านค่าจากขาสวิตช์สัมผัส โดยอ่านค่าจำนวนมากแล้วทำการเฉลี่ยค่าที่อ่านได้ก่อนนำค่าที่ได้ไปแสดงผล ในตัวอย่างนี้ใช้วิธีการอ่าน 100 ครั้งโดยแต่ละครั้งของการอ่านจะห่างกัน 10 ไมโครวินาที
โค๊ด: [Select]
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);
}
ผลที่ได้เป็นดังรูป


ตัวอย่างโปรแกรม [3] อ่านค่าจากขาสวิตช์สัมผัสแล้วไปควบคุมการทำงานของ LED
เขียนโปรแกรมอ่านค่าจากขาสวิตช์สัมผัสเพิ่มเติมจากตัวอย่างที่ 2 โดยให้ควบคุมการติดดับของ LED ใช้การตรวจสอบค่าเฉลี่ยของค่าที่อ่านจากสวิตช์สัมผัสหากต่ำกว่า 60 แสดงว่ามีการสัมผัสสวิตช์ (ดูจากกราฟผลการทดลองข้างต้น)
โค๊ด: [Select]
#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]
<a href="https://www.youtube.com/v/fWiqIRqg2O0" target="_blank" class="new_win">https://www.youtube.com/v/fWiqIRqg2O0</a>
« แก้ไขครั้งสุดท้าย: กรกฎาคม 30, 2019, 10:34:06 PM โดย admin »

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์
Re: การเรียนรู้ครั้งที่ 8 [Basic ESP32] การใช้งานสวิตช์สัมผัส
« ตอบกลับ #3 เมื่อ: กรกฎาคม 30, 2019, 10:34:28 PM »
xxxxxxxxxxx
« แก้ไขครั้งสุดท้าย: กรกฎาคม 31, 2019, 08:04:44 AM โดย admin »