Advertisement
Guest User

Untitled

a guest
Mar 6th, 2021
20
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.98 KB | None | 0 0
  1. #include <Keyboard.h>
  2. #define pin0 0
  3. #define pin1 1
  4. #define pin2 2
  5. #define pin3 3
  6.  
  7. int lastButtonState = HIGH; // предыдущее чтение с входного контакта
  8. unsigned long lastDebounceTime = 0; // последний раз, когда выходной контакт был переключен
  9. unsigned long debounceDelay = 50; // время дребезга; увеличиваются, если вывод мерцает
  10. bool buttonState = HIGH; // сохранение состояния переключателя
  11. int timediff, timediff2; // для созранения времени между каждым нажатием и отпусканием переключателя
  12. int reading, lastBtn = -1; // состояние кнопки и какую кнопку нужно печатать
  13. bool flag1, flag2; // просто две переменные
  14. long double presstime, releasetime, presstime2, releasetime2; // для сохранения миллисекунд на нажатии и миллисек на отжатии
  15. char btn;
  16.  
  17. void setup() {
  18. Serial.begin(9600);
  19. pinMode(pin0, INPUT_PULLUP);
  20. pinMode(pin1, INPUT_PULLUP);
  21. pinMode(pin2, INPUT_PULLUP);
  22. pinMode(pin3, INPUT_PULLUP);
  23. }
  24.  
  25. void keyPress(char btn) {
  26. Keyboard.begin();
  27. Keyboard.write(btn);
  28. Keyboard.end();
  29. }
  30.  
  31. int checkButtons(int *reading) {
  32. for (int i=0; i < 4; i++) {
  33. *reading = digitalRead(i);
  34. if (*reading == 0) {
  35. return i;
  36. }
  37. }
  38. }
  39.  
  40.  
  41. void clickButton() {
  42. lastBtn = checkButtons(&reading);
  43.  
  44. // сбросить таймер, когда выходной контакт был переключен
  45. if (reading != lastButtonState) {
  46. lastDebounceTime = millis();
  47. }
  48.  
  49. // изменение состояния кнопки
  50. if ((millis() - lastDebounceTime) > debounceDelay) {
  51. if (reading != buttonState) {
  52. buttonState = reading;
  53. }
  54. }
  55.  
  56. // Произошло нажатие
  57. if (buttonState == 0 && flag2 == 0) {
  58. presstime = millis();
  59. flag1 = 0;
  60. flag2 = 1;
  61. switch (lastBtn){
  62. case 0:
  63. btn = 'w';
  64. break;
  65. case 1:
  66. btn = 's';
  67. break;
  68. case 2:
  69. btn = 'a';
  70. break;
  71. case 3:
  72. btn = 'd';
  73. break;
  74. }
  75. keyPress(btn);
  76. }
  77.  
  78. // Кнопка всё ещё нажата
  79. if (buttonState == 0 && flag1 == 0) {
  80. releasetime = millis();
  81. releasetime2 = millis();
  82. timediff = releasetime - presstime;
  83. timediff2 = releasetime2 - presstime2;
  84. if (timediff >= 450 && timediff2>=35) {
  85. presstime2 = millis();
  86. keyPress(btn);
  87. }
  88. }
  89.  
  90. // когда переключатель отпущен
  91. if (buttonState == 1 && flag1 == 0) {
  92. releasetime = millis();
  93. flag1 = 1;
  94. flag2 = 0;
  95. timediff = releasetime - presstime;
  96. }
  97. lastButtonState = reading;
  98. }
  99.  
  100. void loop() {
  101. clickButton();
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement