👆 پین لمسی ESP32: ساخت کلید لمسی بدون هیچ قطعه‌ای با touchRead

✍️ تیم ووکوی فارسی ·

کلیدهای لمسی گوشی و اجاق‌گاز را دیده‌ای که با یک لمس ساده روشن و خاموش می‌شوند؟ ESP32 این قابلیت را داخل خودش دارد. ده تا از پایه‌هایش می‌توانند لمس انگشت را حس کنند، بدون دکمه، بدون ماژول و بدون حتی یک مقاومت. فقط یک سیم یا یک تکه فویل آلومینیومی به پایه وصل می‌کنی و با touchRead عددش را می‌خوانی. در این آموزش پین لمسی ESP32 را می‌شناسیم، یاد می‌گیریم آستانه‌ی لمس را خودکار پیدا کنیم و یک کلید لمسی می‌سازیم که با هر لمس LED را روشن یا خاموش کند. این از آن آموزش‌هایی است که در ووکوی (Wokwi) و هر شبیه‌سازی فقط تا نیمه قابل تمرین است؛ دقیق می‌گوییم کدام بخش را کجا امتحان کنی.

پین لمسی چطور کار می‌کند؟

بدن ما مثل یک خازن کوچک رفتار می‌کند. هر پایه‌ی لمسی ESP32 مدام یک بار کوچک را روی پایه می‌ریزد و خالی می‌کند و می‌شمارد در یک بازه‌ی زمانی چند بار این کار انجام شد. وقتی انگشتت به سیم نزدیک می‌شود، ظرفیت خازنی پایه بالا می‌رود، شارژ و دشارژ کندتر می‌شود و عددی که touchRead برمی‌گرداند پایین می‌آید. در یک برد معمولی، پایه‌ی آزاد چیزی حدود ۶۰ تا ۸۰ می‌خواند و با لمس به زیر ۲۰ می‌رسد. این عددها به طول سیم، اندازه‌ی صفحه‌ی فلزی، رطوبت هوا و حتی منبع تغذیه بستگی دارند؛ برای همین هیچ‌وقت عدد ثابت در کد نمی‌نویسیم و آستانه را خود برنامه پیدا می‌کند.

💡 در ESP32-S2 و ESP32-S3 روش اندازه‌گیری فرق دارد و عدد با لمس بالا می‌رود، آن هم تا چند ده هزار. اگر برد تو یکی از این‌هاست، در کد زیر علامت < را به > تبدیل کن و آستانه را بالاتر از عدد آزاد بگذار.

کدام پایه‌ها لمسی‌اند؟

کانالGPIOروی DevKit سی‌پایهتوصیه
T04D4✅ بهترین انتخاب برای شروع
T10بیرون نیامده—
T22D2⚠️ strapping و LED روی برد
T315D15⚠️ strapping
T413D13✅ امن
T512D12⛔ strapping حساس؛ ممکن است جلوی بوت را بگیرد
T614D14✅ قابل استفاده
T727D27✅ امن
T833D33✅ امن
T932D32✅ امن

دلیل علامت‌های ⚠️ و ⛔ را در پین اوت ESP32 توضیح داده‌ایم. در کد می‌توانی شماره‌ی GPIO را بنویسی (touchRead(4)) یا اسم کانال را (touchRead(T0))؛ هر دو یکی‌اند.

قطعه‌ها و سیم‌کشی

سیم لمسی را کوتاه نگه دار (زیر ۲۰ سانتی‌متر). سیم بلند خودش مثل آنتن رفتار می‌کند و عدد را بی‌دلیل تغییر می‌دهد.

قدم ۱: عدد خام را ببین

قبل از ساختن کلید، یک برنامه‌ی یک‌خطی کافی است تا بفهمی برد تو چه عددی می‌دهد: در 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);
}

توضیح بخش‌های مهم

وقفه‌ی لمسی و بیدار شدن از خواب

به‌جای خواندن مداوم در loop، روی برد واقعی می‌توانی از وقفه استفاده کنی: touchAttachInterrupt(T0, onTouch, threshold) هر بار که عدد از آستانه پایین‌تر برود، تابع onTouch را صدا می‌زند. کاربرد جذاب‌تر، بیدار کردن برد از خواب عمیق با لمس است؛ برد با باتری روزها خاموش می‌ماند و با لمس یک صفحه‌ی فلزی بیدار می‌شود. این را در آموزش دیپ اسلیپ ESP32 کامل توضیح داده‌ایم.

اجرا در شبیه‌ساز: کدام بخش را کجا امتحان کنی؟

در شبیه‌ساز ESP32 تینکرکد فارسی، touchRead پشتیبانی می‌شود و کد بالا بدون خطا کامپایل و اجرا می‌شود: کالیبره کردن انجام می‌شود، عدد پایه و آستانه در سریال مانیتور چاپ می‌شود و ساختار برنامه را می‌توانی قدم‌به‌قدم ببینی. ولی شبیه‌ساز انگشت تو را حس نمی‌کند؛ touchRead همیشه عدد حالت «لمس نشده» را برمی‌گرداند. پس خود لمس را باید روی برد واقعی امتحان کنی. اجرای ESP32 در شبیه‌ساز به اشتراک Plus نیاز دارد و خواندن مثال‌ها رایگان است.

اگر می‌خواهی منطق «کلید لمسی» را همین حالا کامل در شبیه‌ساز تجربه کنی، از ماژول سنسور لمسی TTP223 استفاده کن. این ماژول کار حس کردن را خودش انجام می‌دهد و خروجی‌اش یک HIGH و LOW ساده است که با digitalRead خوانده می‌شود، هم روی اونو و هم روی ESP32. پروژه‌ی آماده‌ی چراغ لمسی با سنسور تاچ همین را با آردوینو اونو، به‌صورت رایگان، اجرا می‌کند و منطق تغییر وضعیت و دیبانسش همانی است که بالا نوشتیم.

پین لمسی داخلی ESP32ماژول TTP223
قطعه‌ی اضافههیچ، فقط سیم یا فویلیک ماژول کوچک
خواندن در کدtouchRead و آستانهdigitalRead
تنظیم حساسیتدر نرم‌افزار، با عدد آستانهثابت (با یک پل روی ماژول)
روی آردوینو اونونداردکار می‌کند

اشکال‌های رایج

یک ایده‌ی بعدی: به‌جای 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 را پشت شیشه یا پلاستیک گذاشت؟

بله، از پشت یک لایه‌ی نازک پلاستیک یا شیشه هم کار می‌کند، ولی تغییر عدد کمتر می‌شود. یک صفحه‌ی فلزی بزرگ‌تر بگذار و آستانه را با کالیبره کردن دوباره تنظیم کن.

مقاله‌های مرتبط

🦾

راه‌اندازی سروو موتور با ESP32: کتابخانه‌ی ESP32Servo، روش ledc ۵۰ هرتز و تغذیه‌ی درست

📡

ESP32 در حالت Access Point: وب‌سرور بدون مودم با WiFi.softAP

😴

دیپ اسلیپ ESP32: خواب عمیق، بیدار شدن با تایمر و دکمه و ماه‌ها کار با یک باتری

⚖️

میکروپایتون یا C++ آردوینو؟ مقایسه‌ی کامل برای انتخاب زبان میکروکنترلر

همه‌ی آموزش‌های ESP32 و اینترنت اشیا ← · همه‌ی مقاله‌ها