clockworkpi_keypad.ino 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. // CLOCKWORK Keypad Arduino driver
  2. // For more information please visit https://forum.clockworkpi.com
  3. // HAPPY HACKING
  4. #include "UsbKeyboard.h"
  5. #define KEY_ENTER 0x28 // Keyboard Return (ENTER)
  6. #define KEY_ESCAPE 0x29 // Keyboard Escape
  7. #define KEY_BACKSPACE 0x2A // Keyboard Backspace
  8. #define KEY_SPACE 0x2C // Keyboard Space
  9. #define KEY_DASH 0x2D // Keyboard - and _
  10. #define KEY_EQUAL 0x2E // Keyboard = and +
  11. #define KEY_HOME 0x4A // Keyboard Home
  12. #define KEY_PAGE_UP 0x4B // Keyboard Page Up
  13. #define KEY_END 0x4D // Keyboard End
  14. #define KEY_PAGE_DOWN 0x4E // Keyboard Page Down
  15. #define KEY_RIGHT_ARROW 0x4F // Keyboard Right Arrow
  16. #define KEY_LEFT_ARROW 0x50 // Keyboard Left Arrow
  17. #define KEY_DOWN_ARROW 0x51 // Keyboard Down Arrow
  18. #define KEY_UP_ARROW 0x52 // Keyboard Up Arrow
  19. #define KEY_NUM_DASH 0x56 // Keyboard Num Pad -
  20. #define KEY_NUM_PLUS 0x57 // Keyboard Num Pad +
  21. #define KEY_OFF 1
  22. #define KEY_ON 0
  23. #define ADC_BOUNDARY 500
  24. #define DIGITAL_KEY_NUM 9
  25. #define ANALOG_KEY_NUM 6
  26. #define KEY_NUM (DIGITAL_KEY_NUM + ANALOG_KEY_NUM)
  27. #define SHIFT_KEY_NUM 2
  28. #define KEY_NULL 0xff
  29. #define KEYPAD_UP KEY_UP_ARROW
  30. #define KEYPAD_LEFT KEY_LEFT_ARROW
  31. #define KEYPAD_DOWN KEY_DOWN_ARROW
  32. #define KEYPAD_RIGHT KEY_RIGHT_ARROW
  33. #define KEYPAD_Y KEY_I
  34. #define KEYPAD_X KEY_U
  35. #define KEYPAD_A KEY_J
  36. #define KEYPAD_B KEY_K
  37. #define KEYPAD_MENU KEY_ESCAPE
  38. #define KEYPAD_SELECT KEY_SPACE
  39. #define KEYPAD_START KEY_ENTER
  40. #define KEYPAD_LIGHT1 KEY_L
  41. #define KEYPAD_LIGHT2 KEY_O
  42. #define KEYPAD_LIGHT4 KEY_Y
  43. #define KEYPAD_LIGHT5 KEY_H
  44. #define KEYPAD_UP_SHIFT KEY_UP_ARROW
  45. #define KEYPAD_LEFT_SHIFT KEY_LEFT_ARROW
  46. #define KEYPAD_DOWN_SHIFT KEY_DOWN_ARROW
  47. #define KEYPAD_RIGHT_SHIFT KEY_RIGHT_ARROW
  48. #define KEYPAD_Y_SHIFT KEY_O
  49. #define KEYPAD_X_SHIFT KEY_Y
  50. #define KEYPAD_A_SHIFT KEY_H
  51. #define KEYPAD_B_SHIFT KEY_L
  52. #define KEYPAD_MENU_SHIFT KEY_BACKSPACE
  53. #define KEYPAD_SELECT_SHIFT KEY_NUM_DASH
  54. #define KEYPAD_START_SHIFT KEY_NUM_PLUS
  55. #define KEYPAD_LIGHT1_SHIFT KEY_END
  56. #define KEYPAD_LIGHT2_SHIFT KEY_PAGE_DOWN
  57. #define KEYPAD_LIGHT4_SHIFT KEY_PAGE_UP
  58. #define KEYPAD_LIGHT5_SHIFT KEY_HOME
  59. const int pins[KEY_NUM] = {3, 6, 7, 8, 9, 10, 11, 12, 13, 0, 2, 3, 4, 6, 7};
  60. const int shift_pins[SHIFT_KEY_NUM] = {1, 5};
  61. const int keys[KEY_NUM] =
  62. {
  63. KEYPAD_UP, KEYPAD_LEFT, KEYPAD_DOWN, KEYPAD_RIGHT, KEYPAD_Y, KEYPAD_X, KEYPAD_A, KEYPAD_B, KEYPAD_START,
  64. KEYPAD_MENU, KEYPAD_SELECT, KEYPAD_LIGHT1, KEYPAD_LIGHT2, KEYPAD_LIGHT4, KEYPAD_LIGHT5
  65. };
  66. const int shift_keys[KEY_NUM] =
  67. {
  68. KEYPAD_UP_SHIFT, KEYPAD_LEFT_SHIFT, KEYPAD_DOWN_SHIFT, KEYPAD_RIGHT_SHIFT, KEYPAD_Y_SHIFT, KEYPAD_X_SHIFT, KEYPAD_A_SHIFT, KEYPAD_B_SHIFT, KEYPAD_START_SHIFT,
  69. KEYPAD_MENU_SHIFT, KEYPAD_SELECT_SHIFT, KEYPAD_LIGHT1_SHIFT, KEYPAD_LIGHT2_SHIFT, KEYPAD_LIGHT4_SHIFT, KEYPAD_LIGHT5_SHIFT
  70. };
  71. int old_keys[KEY_NUM];
  72. bool shift_key_pressed()
  73. {
  74. for(int i = 0; i < SHIFT_KEY_NUM; i++)
  75. {
  76. if(analogRead(shift_pins[i]) /ADC_BOUNDARY == KEY_ON)
  77. return true;
  78. }
  79. return false;
  80. }
  81. void setup()
  82. {
  83. TIMSK0 &= !(1 << TOIE0);
  84. for(int i = 0; i < KEY_NUM; i++)
  85. {
  86. if(i < DIGITAL_KEY_NUM)
  87. {
  88. pinMode(pins[i], INPUT);
  89. }
  90. old_keys[i] = KEY_NULL;
  91. }
  92. Serial.begin(115200);
  93. }
  94. void loop()
  95. {
  96. int on_off, key;
  97. UsbKeyboard.update();
  98. delay(1000);
  99. for(int i = 0; i < KEY_NUM; i++)
  100. {
  101. if( i < DIGITAL_KEY_NUM)
  102. {
  103. on_off = digitalRead(pins[i]);
  104. }
  105. else
  106. {
  107. on_off = analogRead(pins[i])/ADC_BOUNDARY;
  108. }
  109. if(on_off == KEY_OFF)
  110. {
  111. if(old_keys[i] != KEY_NULL)
  112. {
  113. UsbKeyboard.release(old_keys[i]);
  114. old_keys[i] = KEY_NULL;
  115. }
  116. }
  117. else
  118. {
  119. if(shift_key_pressed())
  120. {
  121. key = shift_keys[i];
  122. }
  123. else
  124. {
  125. key = keys[i];
  126. }
  127. if(key != old_keys[i])
  128. {
  129. if(old_keys[i] != KEY_NULL)
  130. {
  131. UsbKeyboard.release(old_keys[i]);
  132. }
  133. UsbKeyboard.press(key);
  134. old_keys[i] = key;
  135. }
  136. }
  137. }
  138. }