触摸中断单机和长按

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