สารบัญ:

ESP32 Capacitive Touch Input โดยใช้ "Metallic Hole Plugs" สำหรับปุ่ม: 5 ขั้นตอน (พร้อมรูปภาพ)
ESP32 Capacitive Touch Input โดยใช้ "Metallic Hole Plugs" สำหรับปุ่ม: 5 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: ESP32 Capacitive Touch Input โดยใช้ "Metallic Hole Plugs" สำหรับปุ่ม: 5 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: ESP32 Capacitive Touch Input โดยใช้
วีดีโอ: Long-range RFID Vicinity Sensor Christmas Escape Room Puzzle Tutorial using PN5180 and ESP32 2024, พฤศจิกายน
Anonim
Image
Image
ฮาร์ดแวร์
ฮาร์ดแวร์

ขณะที่ฉันกำลังตัดสินใจออกแบบสำหรับโปรเจ็กต์ที่ใช้ ESP32 WiFi Kit 32 ที่กำลังจะมีขึ้นซึ่งต้องการอินพุตสามปุ่ม ปัญหาหนึ่งที่สังเกตได้คือ WiFi Kit 32 ไม่มีปุ่มกดเชิงกลเพียงปุ่มเดียว แต่มีปุ่มกลไกเพียงสามปุ่มสำหรับการป้อนข้อมูล อย่างไรก็ตาม WiFi Kit 32 มีอินพุตแบบสัมผัส capacitive มากมาย ดังนั้นฉันจึงใช้เวลาในการประกอบฮาร์ดแวร์ เขียนซอฟต์แวร์ และทดสอบการออกแบบอินพุตสามปุ่มโดยใช้คุณสมบัติอินพุตแบบสัมผัส capacitive ESP32 และปลั๊ก 3/8 "" โลหะ 3/8" สำหรับ ปุ่ม

ตามที่ใครก็ตามที่ได้ทดลองกับอินพุตสัมผัส capacitive ของ ESP32 ได้ค้นพบ อินพุตแบบสัมผัสนั้นมีเสียงดังมากพอที่จะต้องมีการกรองเพื่อการตรวจจับอินพุตที่เชื่อถือได้ เพื่อลดจำนวนชิ้นส่วนทั้งหมดสำหรับโปรเจ็กต์ที่จะเกิดขึ้น ฉันได้พิจารณาแล้วว่าตัวกรองดิจิทัลที่ขับเคลื่อนด้วยอินเตอร์รัปต์อย่างง่าย (เป็น "การดีบัก" มากกว่าตัวกรอง แต่ฉันพูดนอกเรื่อง) ซึ่งต่างจากการเพิ่มฮาร์ดแวร์ตัวกรองภายนอก อาจทำให้อินพุตที่มีเสียงดังเงียบลงได้. และหลังจากการทดสอบ ก็เห็นได้ชัดว่าอินพุต capacitive ของ ESP32, ปลั๊กรูโลหะ 3/8" สามตัว และซอฟต์แวร์ "การกรอง" ดิจิทัลบางตัว จะให้อินพุตสามปุ่มที่เชื่อถือได้สำหรับการออกแบบ

ดังนั้น หากคุณสนใจที่จะทดสอบอินพุตแบบ capacitive ด้วยการกรองแบบดิจิตอลบน ESP32 ฉันได้รวมซอร์สโค้ด "Buttons.ino" ไว้ในรูปแบบสภาพแวดล้อม Arduino พร้อมกับคำแนะนำในการประกอบและการเขียนโปรแกรม รวมทั้งคำอธิบายสั้น ๆ ของซอร์สโค้ดสำหรับ สิ่งที่ฉันค้นพบว่าเป็นอินพุตสามปุ่มที่เชื่อถือได้สูง

และเช่นเคย ฉันอาจจะลืมไฟล์ไปหนึ่งหรือสองไฟล์ หรือใครรู้อะไรอีก ดังนั้นหากคุณมีคำถามใดๆ โปรดอย่าลังเลที่จะถามเพราะฉันทำผิดพลาดมากมาย

และหมายเหตุสุดท้าย ฉันไม่ได้รับค่าตอบแทนใดๆ ในรูปแบบใดๆ รวมถึงแต่ไม่จำกัดเพียงตัวอย่างฟรี สำหรับส่วนประกอบใดๆ ที่ใช้ในการออกแบบนี้

ขั้นตอนที่ 1: ฮาร์ดแวร์

ฮาร์ดแวร์
ฮาร์ดแวร์
ฮาร์ดแวร์
ฮาร์ดแวร์
ฮาร์ดแวร์
ฮาร์ดแวร์

การออกแบบใช้ฮาร์ดแวร์ต่อไปนี้:

  • หนึ่ง ชุด WiFi 32
  • ปลั๊กรูโลหะ 3/8" สามตัว
  • ลวด 28awg ยาว 3,4"

ในการประกอบฮาร์ดแวร์ ฉันทำตามขั้นตอนต่อไปนี้:

  • ปอกและชุบปลายสายไฟแต่ละเส้นยาว 4 นิ้วตามที่แสดง
  • บัดกรีสายแรกเพื่อยึด 13 ของ ESP32 (อินพุต TOUCH4 หรือ "T4")
  • บัดกรีสายที่สองเพื่อตรึง 12 ของ ESP32 (อินพุต TOUCH5 หรือ "T5")
  • บัดกรีลวดที่สามเพื่อพิน 14 ของ ESP32 (อินพุต TOUCH6 หรือ "T6")
  • บัดกรีปลั๊กรูโลหะขนาด 3/8 "หนึ่งในสามตัวเข้ากับปลายอิสระของความยาวสายสามเส้น

ขั้นตอนที่ 2: ซอฟต์แวร์

ซอฟต์แวร์
ซอฟต์แวร์

ไฟล์ "Buttons.ino" เป็นไฟล์สภาพแวดล้อม Arduino ที่มีซอฟต์แวร์สำหรับการออกแบบ นอกเหนือจากไฟล์นี้ คุณจะต้องมีไลบรารีกราฟิก "U8g2lib" สำหรับจอแสดงผล WiFi Kit32 OLED (ดู https://github.com/olikraus/u8g2/wiki สำหรับข้อมูลเพิ่มเติมเกี่ยวกับไลบรารีนี้)

ด้วยไลบรารีกราฟิก U8g2lib ที่ติดตั้งในไดเร็กทอรี Arduino ของคุณและโหลด "Buttons.ino" ในสภาพแวดล้อม Arduino ให้คอมไพล์และดาวน์โหลดซอฟต์แวร์ลงใน ESP32

เมื่อดาวน์โหลดและเรียกใช้แล้ว บรรทัดบนสุดของจอแสดงผลควรอ่านว่า "ปุ่ม" โดยมีบรรทัดที่สองของจอแสดงผลอ่านว่า "1 2 3" เป็นตัวบ่งชี้ปุ่ม ด้านล่างของตัวบ่งชี้ปุ่ม 1, 2, 3 แต่ละตัวคือค่าการอ่านแบบสัมผัสที่ไม่มีการกรอง และด้านล่างแต่ละรายการคือตัวบ่งชี้การกดปุ่ม ("1" สำหรับการกด "0" สำหรับค่าที่ไม่ได้กด) ดังที่เห็นในวิดีโอ (และเมื่อผ่านการทดสอบในระยะยาวแล้ว) ตัวกรองซอฟต์แวร์ให้การตรวจจับอินพุตปุ่มที่เชื่อถือได้โดยไม่มีการทริกเกอร์ที่ผิดพลาด

ขั้นตอนที่ 3: เกี่ยวกับซอฟต์แวร์

ซอฟต์แวร์ประกอบด้วยรหัสหลักสามส่วน Arduino ต้องการส่วน "setup()" และ "loop()" และส่วน "Interrupts" ส่วน setup() มีโค้ดที่จำเป็นในการเริ่มต้น OLED และขัดจังหวะบริการ ฟังก์ชันการตั้งค่า OLED มีอธิบายไว้ในลิงก์ด้านบน ฟังก์ชันการตั้งค่าบริการขัดจังหวะมีดังนี้:

  • "timerLoopSemaphore = xSemaphoreCreateBinary()" สร้างสัญญาณสำหรับ "InterruptService()" (รูทีนบริการขัดจังหวะ) เพื่อแจ้ง loop() เมื่อถึงเวลาดำเนินการวนรอบ
  • "timerInterruptService = timerBegin(0, 80, true)" สร้างตัวจับเวลาโดยใช้ตัวจับเวลาฮาร์ดแวร์ 0 ที่มีค่าพรีสเกล 80
  • "timerAttachInterrupt(timerInterruptService, & InterruptService, true)" แนบ InterruptService() เข้ากับตัวจับเวลา
  • "timerAlarmWrite(timerInterruptService, 1000, true)" ตั้งค่าอัตราบริการขัดจังหวะเป็น 1000hz
  • "timerAlarmEnable(timerInterruptService)" เริ่มการเตือนตัวจับเวลา และทำให้บริการขัดจังหวะ

เมื่อตั้งค่าเสร็จแล้ว ให้ป้อน loop() และหยุดที่บรรทัดทันที:

if(xSemaphoreTake(timerLoopSemaphore, portMAX_DELAY) == pdTRUE), ความหมาย loop() จะรอ ณ จุดนี้จนกว่าสัญญาณจาก InterruptService() จะมาถึง เมื่อสัญญาณมาถึง โค้ด loop() จะทำงาน อัปเดตจอแสดงผล OLED ด้วยข้อมูลปุ่ม จากนั้นกลับไปที่ด้านบนอีกครั้งเพื่อรอสัญญาณถัดไป ด้วย InterruptService() ที่ทำงานที่ 1000hz และค่า LOOP_DELAY ที่ 30, loop() จะดำเนินการทุกๆ 30ms หรือที่อัตราการอัปเดตการแสดงผล 33.333hz แม้ว่าจะเป็นอัตราการรีเฟรชการแสดงผลที่สูงกว่าที่จำเป็นสำหรับแอปพลิเคชัน ESP32 ส่วนใหญ่ แต่ฉันใช้การตั้งค่านี้เพื่อแสดงการตอบสนองของตัวกรอง ฉันได้ทดสอบและกำหนดเวลาที่ต้องดำเนินการ single loop() ผ่านเป็น 20ms

InterruptService() ถูกเรียกโดยตัวจับเวลาที่สร้างใน setup() ที่อัตรา 1000hz เมื่อถูกเรียก มันจะอัพเดตตัวนับสองตัว nLoopDelay และ nButtonDelay เมื่อ nLoopDelay ถูกนับถอยหลังสู่ศูนย์ จะส่ง semaphore ที่อนุญาตให้ loop() ดำเนินการผ่านครั้งเดียว จากนั้นรีเซ็ต nLoopDelay เมื่อ nButtonDelay ถูกนับถอยหลังสู่ศูนย์ มันก็จะถูกรีเซ็ตเช่นกัน จากนั้นปุ่ม "ตัวกรอง" จะทำงาน

ตัวกรองปุ่มแต่ละตัวมีตัวนับตัวกรองที่ไม่ซ้ำกัน (เช่น nButton1Count, nButton2Count และ nButton3Count) ตราบใดที่ค่าอินพุตแบบสัมผัสที่กำหนดให้กับปุ่มนั้นมากกว่าหรือเท่ากับค่าเกณฑ์ที่กำหนด (BUTTON_THRESHHOLD) ตัวนับตัวกรองที่กำหนดให้กับปุ่มและปุ่มยังคงเป็นศูนย์ หากค่าอินพุตแบบสัมผัสที่กำหนดให้กับปุ่มน้อยกว่าเกณฑ์ที่กำหนดไว้ ตัวนับตัวกรองที่กำหนดให้กับปุ่มจะเพิ่มขึ้นทุกๆ 20 มิลลิวินาที เมื่อตัวนับตัวกรองเกินค่าตัวกรองปุ่ม (BUTTON_FILTER) ปุ่มจะถือว่า "กด" ผลของวิธีนี้คือการสร้างตัวกรองที่ต้องการ 80ms (20ms nButtonDelay * 4ms nButtonCountN โดยที่ N คือหมายเลขปุ่ม) ของค่าอินพุตแบบสัมผัสต่อเนื่องที่ต่ำกว่าเกณฑ์ที่กำหนดเพื่อพิจารณาว่ามีการกดปุ่มจริง ทุกครั้งที่น้อยกว่า 80ms จะถือเป็น "ความผิดพลาด" และถูกปฏิเสธโดยตัวกรอง

จากคำอธิบายสั้น ๆ นี้ หากคุณมีคำถามใด ๆ โปรดอย่าลังเลที่จะถามและเราจะพยายามตอบคำถามเหล่านี้ให้ดีที่สุด

หวังว่าคุณจะสนุกกับมัน!

ขั้นตอนที่ 4: "โครงการที่จะเกิดขึ้น"

NS
NS

โปรเจ็กต์ที่จะเกิดขึ้น "Intelligrill® Pro" เป็นเครื่องตรวจสอบผู้สูบบุหรี่ที่มีหัววัดอุณหภูมิแบบคู่ซึ่งมี:

  • การคำนวณหัววัดอุณหภูมิของ Steinhart-Hart (ตรงข้ามกับตาราง "ค้นหา") เพื่อความแม่นยำที่เพิ่มขึ้น
  • เวลาที่คาดการณ์ว่าจะเสร็จสมบูรณ์บนโพรบ 1 ที่รวมความแม่นยำที่เพิ่มขึ้นซึ่งได้มาจากการคำนวณของสไตน์ฮาร์ต-ฮาร์ต
  • หัววัดที่สอง หัววัด 2 สำหรับตรวจสอบอุณหภูมิของผู้สูบบุหรี่ (จำกัดที่ 32 ถึง 399 องศา)
  • การควบคุมอินพุตแบบสัมผัสแบบ Capacitive (ตามคำแนะนำนี้)
  • การตรวจสอบระยะไกลโดยใช้ WIFI (ด้วยที่อยู่ IP คงที่ช่วยให้สามารถตรวจสอบความคืบหน้าของผู้สูบบุหรี่ได้จากทุกที่ที่มีการเชื่อมต่ออินเทอร์เน็ต)
  • ช่วงอุณหภูมิขยาย (อีกครั้ง 32 ถึง 399 องศา)
  • เสียงเตือนเมื่อเสร็จสิ้นทั้งภายในตัวส่งสัญญาณ Intelligrill® และอุปกรณ์ตรวจสอบ WiFi ส่วนใหญ่ได้
  • แสดงอุณหภูมิได้ทั้ง องศา F หรือ องศา C
  • รูปแบบเวลาใน HH:MM:SS หรือ HH:MM
  • แบตเตอรี่แสดงเป็นโวลต์หรือ% ที่ชาร์จ
  • และเร็วๆ นี้ เอาต์พุต PID สำหรับผู้สูบบุหรี่ที่ใช้สว่าน

"Intelligrill® Pro" กำลังทดสอบเพื่อให้เป็น Intelligrill® ที่อิงตาม HTML ที่มีคุณลักษณะครบถ้วนและเชื่อถือได้มากที่สุด

ยังอยู่ในระหว่างการทดสอบ แต่ด้วยอาหารที่ช่วยในการเตรียมระหว่างการทดสอบ ฉันได้รับมากกว่าสองสามปอนด์

อีกครั้งฉันหวังว่าคุณจะสนุกกับมัน!

ขั้นตอนที่ 5: ถัดไป: ESP32 NTP Temperature Probe อินพุตแบบอะนาล็อกพร้อมการแก้ไข Steinhart-Hart

เตรียมพร้อมที่จะปัดฝุ่นหนังสือพีชคณิตของคุณสำหรับหนังสือเล่มนี้

แนะนำ: