:::info 💡 记录代码 :::

触摸中断单机和长按

以下为代码示例

  1. #define PRESSED 1 // 按下的标识
  2. #define NOT_PRESSED 0 // 松开的标识
  3. #define TOUCH_PIN 15 //监听的触摸引脚
  4. const unsigned long SHORT_PRESS = 100; // 单机的时间间隔
  5. const unsigned long LONG_PRESS = 3000; // 长按的时间间隔
  6. /**
  7. 定义一个按钮的结构体
  8. */
  9. typedef struct Buttons
  10. {
  11. unsigned long counter = 0; // 计时器
  12. bool prevState = NOT_PRESSED; // 前一状态
  13. bool currentState; // 当前状态
  14. } Button;
  15. // 该函数判断GPIO按下的状态
  16. int getState()
  17. {
  18. // TOUCH_PIN 是某一个pin
  19. // 具体的触摸pin 可以去这里看https://github.com/espressif/arduino-esp32#esp32dev-board-pinmap
  20. if (touchRead(TOUCH_PIN) > 50)
  21. {
  22. return NOT_PRESSED;
  23. }
  24. else
  25. {
  26. return PRESSED;
  27. }
  28. }
  29. Button button;
  30. // touch中断函数
  31. void gotTouch()
  32. {
  33. button.currentState = getState();
  34. if (button.currentState != button.prevState)
  35. {
  36. if (button.currentState == PRESSED)
  37. {
  38. button.counter = millis();
  39. }
  40. else
  41. {
  42. unsigned long diff = millis() - button.counter;
  43. if (diff >= SHORT_PRESS && diff < LONG_PRESS)
  44. {
  45. // 单机
  46. Serial.println("pressed");
  47. }
  48. else if (diff >= LONG_PRESS)
  49. {
  50. // 长按
  51. Serial.println("long pressed");
  52. }
  53. }
  54. button.prevState = button.currentState;
  55. }
  56. }
  57. void setup()
  58. {
  59. Serial.begin(115200);
  60. // 初始化触摸中断
  61. touchAttachInterrupt(TOUCH_PIN, gotTouch, 80);
  62. }
  63. void loop()
  64. {
  65. }