Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Keyboard.h>
- #define pin0 0
- #define pin1 1
- #define pin2 2
- #define pin3 3
- int lastButtonState = HIGH; // предыдущее чтение с входного контакта
- unsigned long lastDebounceTime = 0; // последний раз, когда выходной контакт был переключен
- unsigned long debounceDelay = 50; // время дребезга; увеличиваются, если вывод мерцает
- bool buttonState = HIGH; // сохранение состояния переключателя
- int timediff, timediff2; // для созранения времени между каждым нажатием и отпусканием переключателя
- int reading, lastBtn = -1; // состояние кнопки и какую кнопку нужно печатать
- bool flag1, flag2; // просто две переменные
- long double presstime, releasetime, presstime2, releasetime2; // для сохранения миллисекунд на нажатии и миллисек на отжатии
- char btn;
- void setup() {
- Serial.begin(9600);
- pinMode(pin0, INPUT_PULLUP);
- pinMode(pin1, INPUT_PULLUP);
- pinMode(pin2, INPUT_PULLUP);
- pinMode(pin3, INPUT_PULLUP);
- }
- void keyPress(char btn) {
- Keyboard.begin();
- Keyboard.write(btn);
- Keyboard.end();
- }
- int checkButtons(int *reading) {
- for (int i=0; i < 4; i++) {
- *reading = digitalRead(i);
- if (*reading == 0) {
- return i;
- }
- }
- }
- void clickButton() {
- lastBtn = checkButtons(&reading);
- // сбросить таймер, когда выходной контакт был переключен
- if (reading != lastButtonState) {
- lastDebounceTime = millis();
- }
- // изменение состояния кнопки
- if ((millis() - lastDebounceTime) > debounceDelay) {
- if (reading != buttonState) {
- buttonState = reading;
- }
- }
- // Произошло нажатие
- if (buttonState == 0 && flag2 == 0) {
- presstime = millis();
- flag1 = 0;
- flag2 = 1;
- switch (lastBtn){
- case 0:
- btn = 'w';
- break;
- case 1:
- btn = 's';
- break;
- case 2:
- btn = 'a';
- break;
- case 3:
- btn = 'd';
- break;
- }
- keyPress(btn);
- }
- // Кнопка всё ещё нажата
- if (buttonState == 0 && flag1 == 0) {
- releasetime = millis();
- releasetime2 = millis();
- timediff = releasetime - presstime;
- timediff2 = releasetime2 - presstime2;
- if (timediff >= 450 && timediff2>=35) {
- presstime2 = millis();
- keyPress(btn);
- }
- }
- // когда переключатель отпущен
- if (buttonState == 1 && flag1 == 0) {
- releasetime = millis();
- flag1 = 1;
- flag2 = 0;
- timediff = releasetime - presstime;
- }
- lastButtonState = reading;
- }
- void loop() {
- clickButton();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement