استفاده از پین های لمسی ESP32٬ که یک برد توسعه عالی برای پروژههای هوشمند اینترنت اشیا (IoT) است این امکان را به شما خواهد داد تا با اضافه کردن قابلیت لمسی به مدارات خود را هوشمندتر کنید٬ چرا که ماژول ESP32 شامل 10 پین GPIO لمسی خازنی است و شما میتوانید از این پینها برای ارتقاء پروژههایی که یک کلید ساده مکانیکی بر روی آن ها تعبیه شده استفاده کنید.
شاید این نکته برای شما مهم باشد که ما دراین پروژه از کدام مدل ماژول برد ESP32 در حل مثال خود استفاده خواهیم نمود٬ لذا لازم به بیان است برد درنظر گرفته شده٬ ماژول ESP-WROOM-32 دارای وای فای و بلوتوث 30 پایه با مبدل CP2102 می باشد و شما می توانید با توجه به امکانات موردنیاز پروژه های خود و بررسی دیتاشیت این محصول اقدام به خرید و به کارگیری آن نمایید.
ESP32 چگونه لمس یک انگشت را تشخیص می دهد؟
پیش از راه اندازی پین های Touch یک ماژول ESP32 بهتر است نحوه تشخیص لمس یک انگشت در این ماژول را بدانید. این قطعه از خواص الکتریکی موجود در بدن انسان به عنوان ورودی استفاده میکند. هنگامی که پین حسگر لمسی توسط انگشت لمس میشود، یک بار الکتریکی کوچک در نقطه اتصال جذب میشود. این اتفاق باعث ایجاد تغییر در ظرفیت خازنی و در نتیجه سیگنال آنالوگ میشود. سپس دو ADC متوالی تقریبی (SAR ADC)، این سیگنال آنالوگ را به اعداد دیجیتال تبدیل میکنند.
بهتر است بدانید:
ADC های SAR از یک مقایسهگر برای مقایسه ولتاژ ورودی و خروجی یک مبدل داخلی دیجیتال به آنالوگ، استفاده میکنند.
تشخیص لمس در ESP32، توسط کمک پردازنده ULP مدیریت میشود. بنابراین میتوان از این پینهای لمسی برای بیدار کردن ESP32 از خواب عمیق نیز استفاده کرد. کمک پردازندهی (Ultra-Low-Power coprocessor)ULP یک نوع پردازنده کم مصرف است که به عنوان یک واحد پردازشی تکمیلی در معماری یک پردازنده اصلی استفاده میشود. این نوع پردازندهها برای انجام وظایفی که نیاز به مصرف کم انرژی دارند، استفاده میشوند و معمولا برای افزایش عمر باتری و بهبود عملکرد دستگاههای هوشمند و قابل حمل استفاده میشوند
معرفی پین های Touch ماژول ESP32:
این ماژول دارای 10 پین ورودی و خروجی لمسی خازنی است. هنگامی که یک بار خازنی (مانند پوست انسان) در مجاورت GPIO باشد، ESP32 تغییر در ظرفیت خازنی را تشخیص میدهد.
اگر چه ESP32 در مجموع دارای 10 پین حسگر لمسی خازنی (GPIO) است، اما تنها 9 عدد از 30 پین در پینهدرهای دو طرف برد توسعهESP32 قابل دسترس هستند.
نحوه دریافت داده از سنسور لمسی در IDE:
خواندن داده های دریافتی از حسگر لمسی ESP32 بسیار ساده است. برای این کار کافی است در Arduino IDE، از تابع touchRead()
استفاده کنید. این تابع٬ شماره پین ورودی و خروجی (GPIO) را که میخواهید بخوانید، به عنوان آرگومان میپذیرد.
touchRead(GPIOPin);
ایجاد اتصالات سخت افزاری:
اکنون که با چگونگی تشخیص لمس انگشت (بار خازنی) بصورت تئوری آشنا شده اید زمان آن سیده است تا با انجام یک مثال عملی نحوه استفاده از پین های لمسی ESP32 را آموزش ببینیم:
ابتدا لازم داریم یک سیم را به حسگر لمسی شماره0 (Touch #0) یا همان پایه GPIO شماره 4 وصل کنیم و سپس کد آماده شده در بخش بعد را در IDE سیستم خود آپلود نمایید. شما می توانید هر جسم رسانایی مانند فویل آلومینیومی، پوشش رسانا، رنگ رسانا و غیره را به این پین وصل کنید و آن را به یک پد لمسی تبدیل کنید.
کد نمونه
بیایید با استفاده از مثالی از کتابخانه ببینیم که چگونه کار می کند. Arduino IDE خود را باز کنید و به مسیرFile > Examples > ESP32 > Touch بروید. سپس برنامه TouchRead را باز کنید .
این مثال به سادگی پین لمسی 0 را می خواند و نتیجه را روی نمایشگر سریال نشان می دهد.
// ESP32 Touch Test
// Just test touch pin - Touch0 is T0 which is on GPIO 4.
void setup() {
Serial.begin(115200);
delay(1000); // give me time to bring up serial monitor
Serial.println("ESP32 Touch Test");
}
void loop() {
Serial.print("Touch: ");
Serial.println(touchRead(4)); // get touch value on GPIO 4
delay(1000);
}
نحوه عملکرد کد:
ابتدا لازم است ذکر کنیم که این برنامه بسیار ساده است. ما در تابع ()setup، قصد داریم در گام اول ارتباط سریال با رایانه را برقرار کنیم:
Serial.begin(115200);
سپس درحلقه ()loop از تابع touchRead()
استفاده می کنیم و پایه ای را که می خواهیم بخوانیم به عنوان آرگومان ارسال میکنیم. در اینجا تصمیم داریم پین شماره 4 را بخوانیم. (همچنین می توانید شماره سنسور لمسی T0
را ارسال کنید.)
Serial.println(touchRead(4));
مثال: روشن/خاموش نمودن LED با استفاده از پین های لمسی ESP32
بیایید به سرعت پروژهای ایجاد کنیم تا نشان دهیم که چگونه میتوان از پینهای لمسی ESP32 برای کنترل دستگاهها استفاده کرد. در این مثال، قصد داریم یک LED ساده که با لمس روشن می شود را بسازیم.
البته این پروژه را می توان گسترش داد به پروژههای دیگر ازجمله باز کردن درها، رلههای سوئیچی، روشنایی یا هر چیز دیگری که فکرش را بکنید.
پیدا کردن آستانه تشخیص بار
قبل از ادامه، باید ببینید ESP32 واقعاً چه چیزی میخواند و چه از آن دریافت میکنید. به خروجی های دریافتی هنگامی که پین لمس میشود و زمانی که لمس نمیشود، دقت کنید.
وقتی کد قبلی را اجرا میکنید، قرائت های نزدیک به مقادیر زیر را در مانیتور سریال خواهید دید:
- وقتی پین را لمس می کنید (~3)
- وقتی پین را لمس نمی کنید (~71)
بر اساس مقادیر، میتوانیم آستانهای را تعیین کنیم، به طوری که وقتی مقدار خوانده شده از مقدار آستانه کمتر شد ، LED تغییر وضعیت دهد. احتمالا 30 مقدار آستانه خوبی در این مورد باشد.
نمونه کد:
در این مرحله بایستی کد زیر را در ESP32 خود آپلود کنید. بعد از آن هر بار که سیم را لمس می کنید، باید تغییر وضعیت LED را ببینید. به طوری که با یک بار لمس پین، LED روی برد روشن میشود و با لمس مجدد آن خاموش میشود. طبق این کد ال ای دی به پایه شماره 2 ماژول esp32 متصل شده است.
// set pin numbers
const int touchPin = 4;
const int ledPin = 2;
const int threshold = 30; // set the threshold
int ledState = LOW; // the current state of the output pin
int touchState; // the current reading from the input pin
int lastTouchState = LOW; // the previous reading from the input pin
unsigned long lastDebounceTime = 0; // the last time the output pin was toggled
unsigned long debounceDelay = 50; // the debounce time; increase if the output flickers
void setup() {
pinMode(ledPin, OUTPUT);
// set initial LED state
digitalWrite(ledPin, ledState);
}
void loop() {
// read the state of the pin
int reading = touchRead(touchPin);
// binarize touch reading for easy operation
if (reading < threshold) {
reading = HIGH;
} else{
reading = LOW;
}
// If the pin is touched:
if (reading != lastTouchState) {
// reset the debouncing timer
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
// whatever the reading is at, it's been there for longer than the debounce
// delay, so take it as the actual current state:
// if the touch state has changed:
if (reading != touchState) {
touchState = reading;
// only toggle the LED if the new touch state is HIGH
if (touchState == HIGH) {
ledState = !ledState;
}
}
}
// set the LED:
digitalWrite(ledPin, ledState);
// save the reading. Next time through the loop, it'll be the lastTouchState:
lastTouchState = reading;
}