![](https://duino4projects.com/wp-content/uploads/2019/12/ESP32-Capacitive-Touch-Input-Using-Metallic-Hole-Plugs-for-Buttons.jpg)
همانطور که در حال نهایی کردن تصمیمات طراحی برای پروژه ESP32 WiFi Kit 32 آینده بودم که به ورودی سه دکمه نیاز داشت، یک مشکل قابل توجه این بود که کیت WiFi 32 یک دکمه مکانیکی واحد و در عین حال سه دکمه مکانیکی برای ورودی ندارد. با این حال، کیت WiFi 32 دارای ورودی های لمسی خازنی زیادی است، بنابراین من مدتی را صرف مونتاژ سخت افزار، نوشتن نرم افزار و آزمایش طراحی ورودی سه دکمه با استفاده از ویژگی ورودی لمسی خازنی ESP32 و سه شاخه سوراخ فلزی 3/8 اینچی کردم. دکمه ها.
همانطور که هر کسی که با ورودی های لمسی خازنی ESP32 آزمایش کرده است، دریافته است، ورودی های لمسی به یقین آنقدر نویز دارند که برای تشخیص ورودی مطمئن نیاز به فیلتر دارند. برای به حداقل رساندن تعداد کل قطعات برای پروژه آینده، من تشخیص دادم که یک فیلتر دیجیتال مبتنی بر وقفه ساده (بیشتر از یک فیلتر، اما من از فیلتر خارج میشوم)، برخلاف افزودن سختافزار فیلتر خارجی، میتواند ورودیهای پر سر و صدا را کاهش دهد. . و پس از آزمایش، مشخص شد که ورودیهای خازنی ESP32، سه شاخه سوراخ فلزی 3/8 اینچی، و برخی نرمافزارهای دیجیتال «فیلتر»، در واقع یک ورودی سه دکمه قابل اعتماد برای طراحی ارائه میدهند.
بنابراین اگر شما علاقه مند به آزمایش ورودی خازنی با فیلتر دیجیتال در ESP32 هستید، من کد منبع "Buttons.ino" را در قالب محیط آردوینو به همراه دستورالعمل های اسمبلی و برنامه نویسی، به علاوه شرح مختصری از کد منبع، برای شما قرار داده ام. چیزی که من کشف کردم یک ورودی سه دکمه بسیار قابل اعتماد است.
و طبق معمول، احتمالاً یک یا دو فایل را فراموش کرده ام یا چه کسی می داند چه چیز دیگری، بنابراین اگر سؤالی دارید، لطفاً در پرسیدن دریغ نکنید زیرا من اشتباهات زیادی می کنم.
و یک نکته پایانی، من هیچ غرامتی به هیچ شکلی دریافت نمیکنم، از جمله، اما نه محدود به نمونههای رایگان، برای هیچ یک از اجزای مورد استفاده در این طراحی
مرحله 1: سخت افزار
![](https://duino4projects.com/wp-content/uploads/2019/12/Hardware.jpg)
طراحی از سخت افزار زیر استفاده می کند:
- یک، کیت WiFi 32.
- سه شاخه سوراخ فلزی 3/8 اینچی.
- سه سیم با طول 4 اینچ 28 awg.
برای مونتاژ سخت افزار مراحل زیر را انجام دادم:
- همانطور که نشان داده شده است، انتهای هر سیم 4 اینچی را جدا کرده و قلع کنید.
- سیم اول را به پایه 13 ESP32 (ورودی TOUCH4 یا "T4") لحیم کرد.
- سیم دوم را به پایه 12 ESP32 (ورودی TOUCH5 یا "T5") لحیم کرد.
- سیم سوم را به پایه 14 ESP32 (ورودی TOUCH6 یا "T6") لحیم کرد.
- یکی از هر سه شاخه سوراخ فلزی 3/8 اینچی را به انتهای آزاد سه طول سیم لحیم کرد.
مرحله 2: نرم افزار
![](https://duino4projects.com/wp-content/uploads/2019/12/Software.jpg)
فایل “Buttons.ino” یک فایل محیطی آردوینو است که حاوی نرم افزار طراحی است. علاوه بر این فایل، به کتابخانه گرافیکی "U8g2lib" برای نمایشگر OLED WiFi Kit32 نیاز دارید ( برای اطلاعات بیشتر در مورد این کتابخانه به https://github.com/olikraus/u8g2/wiki مراجعه کنید).
با نصب کتابخانه گرافیکی U8g2lib در دایرکتوری آردوینو، و "Buttons.ino" بارگذاری شده در محیط آردوینو، نرم افزار را کامپایل و در ESP32 دانلود کنید.
پس از دانلود و اجرا، خط بالای نمایشگر باید «دکمهها» را با خط دوم نمایشگر «1 2 3» بهعنوان نشانگر دکمه نشان دهد. در زیر هر یک از نشانگرهای دکمه 1، 2، 3، مقادیر خواندن لمسی فیلتر نشده، و در زیر هر یک از آنها نشانگرهای فشار دکمه ("1" برای فشار داده شده، "0" برای فشار داده نشده وجود دارد. همانطور که در ویدئو مشاهده می شود (و همانطور که آزمایش طولانی مدت تایید شده است)، فیلتر نرم افزار تشخیص ورودی دکمه قابل اعتماد را بدون تحریک نادرست فراهم می کند.
مرحله 3: درباره نرم افزار
این نرم افزار شامل سه بخش کد اصلی است. آردوینو به بخشهای "setup()" و "loop()" و یک بخش "وقفه" نیاز داشت. بخش setup() حاوی کد لازم برای مقداردهی اولیه OLED و وقفه در خدمات است. توابع راه اندازی OLED در لینک بالا توضیح داده شده است. توابع راه اندازی سرویس وقفه به شرح زیر است:
- "timerLoopSemaphore = xSemaphoreCreateBinary()" یک سمافور برای "InterruptService()" (روال سرویس وقفه) ایجاد می کند تا زمانی که زمان اجرای یک پاس حلقه فرا می رسد به حلقه() اطلاع دهد.
- “timerInterruptService = timerBegin(0, 80, true)” یک تایمر با استفاده از تایمر سخت افزاری 0 با پیش مقیاس 80 ایجاد می کند.
- "timerAttachInterrupt(timerInterruptService، & InterruptService، true)" InterruptService() را به تایمر متصل می کند.
- "timerAlarmWrite(timerInterruptService، 1000، true)" نرخ سرویس وقفه را روی 1000 هرتز تنظیم می کند.
- "timerAlarmEnable(timerInterruptService)" زنگ تایمر را شروع می کند و در نتیجه سرویس را قطع می کند.
با تکمیل تنظیمات، loop() وارد می شود و بلافاصله در خط متوقف می شود:
if(xSemaphoreTake(timerLoopSemaphore، portMAX_DELAY) == pdTRUE)،