👆 پین لمسی ESP32: ساخت کلید لمسی بدون هیچ قطعهای با touchRead
کلیدهای لمسی گوشی و اجاقگاز را دیدهای که با یک لمس ساده روشن و خاموش میشوند؟ ESP32 این قابلیت را داخل خودش دارد. ده تا از پایههایش میتوانند لمس انگشت را حس کنند، بدون دکمه، بدون ماژول و بدون حتی یک مقاومت. فقط یک سیم یا یک تکه فویل آلومینیومی به پایه وصل میکنی و با touchRead عددش را میخوانی. در این آموزش پین لمسی ESP32 را میشناسیم، یاد میگیریم آستانهی لمس را خودکار پیدا کنیم و یک کلید لمسی میسازیم که با هر لمس LED را روشن یا خاموش کند. این از آن آموزشهایی است که در ووکوی (Wokwi) و هر شبیهسازی فقط تا نیمه قابل تمرین است؛ دقیق میگوییم کدام بخش را کجا امتحان کنی.
پین لمسی چطور کار میکند؟
بدن ما مثل یک خازن کوچک رفتار میکند. هر پایهی لمسی ESP32 مدام یک بار کوچک را روی پایه میریزد و خالی میکند و میشمارد در یک بازهی زمانی چند بار این کار انجام شد. وقتی انگشتت به سیم نزدیک میشود، ظرفیت خازنی پایه بالا میرود، شارژ و دشارژ کندتر میشود و عددی که touchRead برمیگرداند پایین میآید. در یک برد معمولی، پایهی آزاد چیزی حدود ۶۰ تا ۸۰ میخواند و با لمس به زیر ۲۰ میرسد. این عددها به طول سیم، اندازهی صفحهی فلزی، رطوبت هوا و حتی منبع تغذیه بستگی دارند؛ برای همین هیچوقت عدد ثابت در کد نمینویسیم و آستانه را خود برنامه پیدا میکند.
< را به > تبدیل کن و آستانه را بالاتر از عدد آزاد بگذار.کدام پایهها لمسیاند؟
| کانال | GPIO | روی DevKit سیپایه | توصیه |
|---|---|---|---|
| T0 | 4 | D4 | ✅ بهترین انتخاب برای شروع |
| T1 | 0 | بیرون نیامده | — |
| T2 | 2 | D2 | ⚠️ strapping و LED روی برد |
| T3 | 15 | D15 | ⚠️ strapping |
| T4 | 13 | D13 | ✅ امن |
| T5 | 12 | D12 | ⛔ strapping حساس؛ ممکن است جلوی بوت را بگیرد |
| T6 | 14 | D14 | ✅ قابل استفاده |
| T7 | 27 | D27 | ✅ امن |
| T8 | 33 | D33 | ✅ امن |
| T9 | 32 | D32 | ✅ امن |
دلیل علامتهای ⚠️ و ⛔ را در پین اوت ESP32 توضیح دادهایم. در کد میتوانی شمارهی GPIO را بنویسی (touchRead(4)) یا اسم کانال را (touchRead(T0))؛ هر دو یکیاند.
قطعهها و سیمکشی
- یک برد ESP32
- یک سیم جامپر که یک سرش به GPIO4 وصل است و سر دیگرش آزاد؛ یا بهتر، سر آزاد را به یک تکه فویل یا سکهی فلزی بچسبان تا سطح لمس بزرگتر شود
- LED آبی روی برد (GPIO2) برای نشان دادن وضعیت؛ سیم دیگری لازم نیست
سیم لمسی را کوتاه نگه دار (زیر ۲۰ سانتیمتر). سیم بلند خودش مثل آنتن رفتار میکند و عدد را بیدلیل تغییر میدهد.
قدم ۱: عدد خام را ببین
قبل از ساختن کلید، یک برنامهی یکخطی کافی است تا بفهمی برد تو چه عددی میدهد: در loop بنویس Serial.println(touchRead(4)); delay(200); و در سریال مانیتور نگاه کن. وقتی دست نمیزنی و وقتی سیم را لمس میکنی، دو عدد کاملاً متفاوت میبینی. همین فاصله است که کلید ما رویش ساخته میشود.
قدم ۲: کد کامل کلید لمسی
// ESP32 capacitive touch switch: tap the wire to toggle the LED.
const int TOUCH_PIN = 4; // T0
const int LED = 2; // built-in blue LED
int baseline = 0; // reading with nobody touching
int threshold = 0; // below this = touched
bool wasTouched = false;
bool ledOn = false;
unsigned long lastChange = 0;
int readTouch() {
long sum = 0;
for (int i = 0; i < 8; i++) sum += touchRead(TOUCH_PIN);
return sum / 8; // average 8 readings to calm the noise
}
void setup() {
Serial.begin(115200);
pinMode(LED, OUTPUT);
delay(500);
// calibrate: do not touch the wire during the first second
long sum = 0;
for (int i = 0; i < 20; i++) {
sum += readTouch();
delay(50);
}
baseline = sum / 20;
threshold = baseline * 6 / 10; // 60 % of the idle value
Serial.print("Baseline: ");
Serial.print(baseline);
Serial.print(" threshold: ");
Serial.println(threshold);
}
void loop() {
int value = readTouch();
bool isTouched = value < threshold; // classic ESP32: the value DROPS on touch
if (isTouched != wasTouched && millis() - lastChange > 60) {
lastChange = millis();
wasTouched = isTouched;
if (isTouched) { // act only at the moment of touching
ledOn = !ledOn;
digitalWrite(LED, ledOn ? HIGH : LOW);
Serial.println(ledOn ? "Touch -> LED ON" : "Touch -> LED OFF");
}
}
delay(20);
}
توضیح بخشهای مهم
readTouchهشت بار میخواند و میانگین میگیرد. تکخوانیهایtouchReadگاهی یک عدد پرت دارند که بدون میانگین، یک «لمس خیالی» میسازد.- در
setupبیست بار در یک ثانیه میخوانیم و میانگین را بهعنوانbaseline(حالت آزاد) نگه میداریم. برای همین در ثانیهی اول بعد از روشن شدن نباید سیم را لمس کنی. threshold = baseline * 6 / 10آستانه را ۶۰ درصد عدد آزاد میگذارد. اگر کلید خیلی حساس است و بدون لمس عمل میکند، این عدد را کم کن (مثلاً ۵ دهم)؛ اگر لمس را دیر میفهمد، زیادش کن.isTouched != wasTouchedفقط تغییر وضعیت را میبیند، نه خود وضعیت را. بدون این شرط، تا وقتی انگشتت روی سیم است، LED مدام روشن و خاموش میشد.millis() - lastChange > 60یک دیبانس ساده است. لمس انگشت مثل دکمهی مکانیکی لرزش دارد و این شرط نمیگذارد یک لمس دو بار حساب شود.- LED فقط در لحظهی شروع لمس عوض میشود. نتیجه یک کلید «یک بار بزن روشن، یک بار بزن خاموش» است؛ مثل چراغخوابهای لمسی.
وقفهی لمسی و بیدار شدن از خواب
بهجای خواندن مداوم در loop، روی برد واقعی میتوانی از وقفه استفاده کنی: touchAttachInterrupt(T0, onTouch, threshold) هر بار که عدد از آستانه پایینتر برود، تابع onTouch را صدا میزند. کاربرد جذابتر، بیدار کردن برد از خواب عمیق با لمس است؛ برد با باتری روزها خاموش میماند و با لمس یک صفحهی فلزی بیدار میشود. این را در آموزش دیپ اسلیپ ESP32 کامل توضیح دادهایم.
اجرا در شبیهساز: کدام بخش را کجا امتحان کنی؟
در شبیهساز ESP32 تینکرکد فارسی، touchRead پشتیبانی میشود و کد بالا بدون خطا کامپایل و اجرا میشود: کالیبره کردن انجام میشود، عدد پایه و آستانه در سریال مانیتور چاپ میشود و ساختار برنامه را میتوانی قدمبهقدم ببینی. ولی شبیهساز انگشت تو را حس نمیکند؛ touchRead همیشه عدد حالت «لمس نشده» را برمیگرداند. پس خود لمس را باید روی برد واقعی امتحان کنی. اجرای ESP32 در شبیهساز به اشتراک Plus نیاز دارد و خواندن مثالها رایگان است.
اگر میخواهی منطق «کلید لمسی» را همین حالا کامل در شبیهساز تجربه کنی، از ماژول سنسور لمسی TTP223 استفاده کن. این ماژول کار حس کردن را خودش انجام میدهد و خروجیاش یک HIGH و LOW ساده است که با digitalRead خوانده میشود، هم روی اونو و هم روی ESP32. پروژهی آمادهی چراغ لمسی با سنسور تاچ همین را با آردوینو اونو، بهصورت رایگان، اجرا میکند و منطق تغییر وضعیت و دیبانسش همانی است که بالا نوشتیم.
| پین لمسی داخلی ESP32 | ماژول TTP223 | |
|---|---|---|
| قطعهی اضافه | هیچ، فقط سیم یا فویل | یک ماژول کوچک |
| خواندن در کد | touchRead و آستانه | digitalRead |
| تنظیم حساسیت | در نرمافزار، با عدد آستانه | ثابت (با یک پل روی ماژول) |
| روی آردوینو اونو | ندارد | کار میکند |
اشکالهای رایج
- کلید بدون لمس، خودبهخود عمل میکند: سیم بلند است یا آستانه خیلی نزدیک به عدد آزاد است. سیم را کوتاه کن و ضریب آستانه را کم کن.
- با لمس هیچ اتفاقی نمیافتد: موقع کالیبره کردن سیم را لمس کردهای و عدد پایه اشتباه ثبت شده. برد را ریست کن و در ثانیهی اول دست نزن.
- با وصل کردن شارژر لپتاپ عددها عوض میشوند: زمین برد با منبع تغییر کرده؛ این طبیعی است و دلیل اصلی کالیبره کردن خودکار همین است.
- برد با سیم لمسی روی GPIO12 بوت نمیشود: T5 روی یک strapping pin است. از T0، T4، T7، T8 یا T9 استفاده کن.
- روی ESP32-S3 همیشه «لمس شده» میخواند: در این تراشه عدد با لمس بالا میرود؛ شرط مقایسه را برعکس کن.
یک ایدهی بعدی: بهجای LED، وضعیت کلید لمسی را در یک صفحهی وب نشان بده؛ از وبسرور ESP32 شروع کن. یا با چند پایهی لمسی یک پیانوی فویلی بساز. همهی آموزشهای این برد در صفحهی ESP32 هستند و اگر دنبال ایدهی پروژهای، ایدههای پروژهی اینترنت اشیا با ESP32 را ببین.
چراغ لمسی را در تینکرکد فارسی باز کن 👆سؤالهای رایج
کدام پایههای ESP32 لمسی هستند؟
ده پایه: T0 روی GPIO4، T1 روی GPIO0، T2 روی GPIO2، T3 روی GPIO15، T4 روی GPIO13، T5 روی GPIO12، T6 روی GPIO14، T7 روی GPIO27، T8 روی GPIO33 و T9 روی GPIO32. روی برد سیپایه GPIO0 بیرون نیامده است.
وقتی پین لمسی ESP32 را لمس میکنم، عدد touchRead بالا میرود یا پایین؟
در ESP32 معمولی عدد پایین میآید؛ مثلاً از حدود ۷۰ به زیر ۲۰. در ESP32-S2 و ESP32-S3 برعکس است و عدد با لمس بالا میرود، پس شرط کد را باید برعکس کنی.
میشود پین لمسی ESP32 را پشت شیشه یا پلاستیک گذاشت؟
بله، از پشت یک لایهی نازک پلاستیک یا شیشه هم کار میکند، ولی تغییر عدد کمتر میشود. یک صفحهی فلزی بزرگتر بگذار و آستانه را با کالیبره کردن دوباره تنظیم کن.