• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Macro keyboard - Arduino Pro Micro
#1
Witam

Znalazlem w necie program i chcialbym go rozbudowac, a mianowicie dodac wiecej klawiszy.
W orginale obsluguje 9, a mi zalezy zeby mozna bylo obslugiwac ich 13.
Uzywam blibliotki : #include "HID-Project.h"
Wszytsko dziala ale tylko w zakresie :
  switch (key) {
    case 1:  // 0x001
      Serial.println("MEDIA_VOLUME_MUTE");
      Consumer.write(MEDIA_VOLUME_MUTE);
      delay(10);
      break;
    case 2:  // 0x002
      Serial.println("Widok z PRZODU");
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_1);
      Keyboard.releaseAll();
      delay(75);
      break;
    case 4:  // 0x004
      Serial.println("Widok normalny do  ");
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_8);
      Keyboard.releaseAll();
      delay(75);
      break;

     .
     .
     .
      case 256:  // 0x0100                    
      Serial.println("4 wolny");
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_C);
      Keyboard.releaseAll();
      delay(75);
      break;

Mam problem jak w tym kodzie dolaczycz jeszcze 4 klawisze, bylbym wdzieczny za pomoc.
 
Odpowiedź
#2
Bardzo ładnie wykropkowałeś kilka klawiszy, każdy kryje się w jakimś "case", wciśnięcie przycisku to linie z Keyboard.press();, przyciski wszystkie znajdziesz w swojej bibliotece,
albo tu: https://github.com/NicoHood/HID/blob/mas...ayoutsUS.h
jeśli to ta sama.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
(08-12-2022, 20:53)kaczakat napisał(a): Bardzo ładnie  wykropkowałeś kilka klawiszy, każdy kryje się w jakimś "case", wciśnięcie przycisku to linie z Keyboard.press();, przyciski wszystkie znajdziesz w swojej bibliotece,
albo tu: https://github.com/NicoHood/HID/blob/mas...ayoutsUS.h
jeśli to ta sama.
Oki, ale jak chce dopisac nastepnego case to ten klaawisz nie dziala, dziala tylko do case 256; jak powinien wygladac nastepny Case ?
 
Odpowiedź
#4
W załączonym fragmencie nie ma powodu by nie działał. Gdzie masz zmienną key, gdzie nadajesz jej wartości?
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#5
(08-12-2022, 22:34)kaczakat napisał(a): W załączonym fragmencie nie ma powodu by nie działał. Gdzie masz zmienną key, gdzie nadajesz jej wartości?
oto caly kod:


// Encoder obrotowy
#include "ESPRotary.h";
#define ROTARY_PIN_1 4
#define ROTARY_PIN_2 3
int moves_per_click = 2;
ESPRotary r = ESPRotary(ROTARY_PIN_1, ROTARY_PIN_2, moves_per_click) ;
int old_pos = 0;
int new_pos = 0;

// Biblioteka klawiatury
#include "HID-Project.h"

// Klawisze
int keypadPins[13] = {2, 5, 6, 7, 8, 9, 10, 16, 14, 15, 18, 19};
int keypadStatus;  // Służy do monitorowania, które przyciski są wciśnięte.
int timeout;      // Zmienna timeout używana w pętli
int UpDownArr, SideArr = 0;
int MainVol = 1;

void setup() {
  Serial.begin(115200);
  // Obrót encodera
  r.setChangedHandler(rotate);
  for (int i = 0; i < 9; i++) {
    pinMode(keypadPins[i], INPUT);      // Ustaw wszystkie piny klawiatury jako wejścia
    digitalWrite(keypadPins[i], HIGH);  // Pociągnij wszystkie styki klawiatury do góry
  }
  Consumer.begin();
}

void loop() {
  r.loop();
  keypadStatus = getKeypadStatus();    // Przeczytaj, które przyciski są wciśnięte
  if (keypadStatus != 0) {
    sendKeyPress(keypadStatus);        // Wyślij przycisk przez USB
    timeout = 2000;                    // Opóźnienia powtarzan
    while ((keypadStatus == getKeypadStatus()) && (--timeout))  // Zmniejsz limit czasu i sprawdź, czy klawisz jest wciśnięty
      delayMicroseconds(400);
    while (getKeypadStatus() == keypadStatus)                  // Podczas gdy ten sam przycisk jest wciśnięty
    {
      sendKeyPress(keypadStatus);                              // Kontynuuj wysyłanie przycisku przez USB
      delay(250);
    }
  }
}

void rotate(ESPRotary & r) {
  new_pos = r.getPosition();
  if ( old_pos < new_pos) {
    old_pos = new_pos ;
    if ( MainVol == 1) {
      Serial.println("MEDIA_VOLUME_UP");
      Consumer.write(MEDIA_VOLUME_UP);
    }
  } else {
    old_pos = new_pos ;
    if ( MainVol == 1) {
      Serial.println("MEDIA_VOLUME_DOWN");
      Consumer.write(MEDIA_VOLUME_DOWN);
    }
  }
}

void sendKeyPress(int key) {
  switch (key) {
    case 1:  // 0x001
      Serial.println("MEDIA_VOLUME_MUTE");
      Consumer.write(MEDIA_VOLUME_MUTE);
      delay(10);
      break;
    case 2:  // 0x002
      Serial.println("Widok z PRZODU");
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_1);
      Keyboard.releaseAll();
      delay(75);
      break;
    case 4:  // 0x004
      Serial.println("Widok normalny do  ");
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_8);
      Keyboard.releaseAll();
      delay(75);
      break;
    case 8:  // 0x008
      Serial.println("ORIENTACJA");
      Keyboard.press(KEY_SPACE);
      Keyboard.releaseAll();
      delay(75);
      break;
    case 16:  // 0x010
      Serial.println("Wpasuj w ekran");
      Keyboard.press(KEY_F);
      Keyboard.releaseAll();
      delay(75);
      break;
    case 32:  // 0x020
      Serial.println("1 wolny");
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_C);
      Keyboard.releaseAll();
      delay(75);
      break;
    case 64:  // 0x040
      Serial.println("2 wolny");
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_C);
      Keyboard.releaseAll();
      delay(75);
      break;
    case 128:  // 0x080
      Serial.println("3 wolny");
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_C);
      Keyboard.releaseAll();
      delay(75);
      break;
  case 256:  // 0x0100                   
      Serial.println("4 wolny");
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_C);
      Keyboard.releaseAll();
      delay(75);
      break;
  case 512  :  // 0x000
      Serial.println("KEY_LEFT_CTRL+C");
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_C);
      Keyboard.releaseAll();
      delay(75);
      break;
  case 1024 :  // 0x000
      Serial.println("Kopiowanie");
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_C);
      Keyboard.releaseAll();
      delay(75);
      break;
  case 1280:  // 0x000
      Serial.println("Wklejania");
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_V);
      Keyboard.releaseAll();
      delay(75);
      break;
  case 2560:  // 0x000
      Serial.println("Escape");
      Keyboard.press(KEY_ESC );
      Keyboard.releaseAll();
      delay(75);
      break;
     
  }
}

int getKeypadStatus() {
  int keypadStatus = 0;  // To będzie to, co zostanie zwrócone

  /* zainicjuj wszystkie piny, wejścia z podciągnięciami */
  for (int i = 0; i < 9; i++) {
    if (!digitalRead(keypadPins[i])) {
      keypadStatus |= 1 << i; // Ustawić bit stanu wartości zwracanej przez klawiaturę
    }
  }
  return keypadStatus;
}

Jak pisalem dzialaja tyllo do ":case 256" - to nie ma cos wspolnego z zapisem decymalnym, juz zglupialem.
 
Odpowiedź
#6
Czyli do funkcji z wysłaniem klawisza klawiatury wysyłasz zmienną int o nazwie keypadStatus
sendKeyPress(keypadStatus);
Wydrukuj sobie jakie wartości przyjmuje keypadStatus, masz 'i' max 8 choć przycisków więcej, 0, 1, 2, 4, 8, 16, 32,64,128,256, obciąłeś sobie liczbę int do 9 bitów.
Nie wiem po co tak kombinujesz, jeślibyś jeszcze korzystał z kombinacji tych przycisków chcąc osiągnąć parę tysięcy różnych przycisków to OK, wykorzystując je jak liczbę binarną, to OK. Tu wystarczy zwrócić i , masz wciśnięty przycisk z idexu 0-12, albo jak chcesz widzieć wciśnięcia wielu przycisków to w swich case znowu trzeba z maskami odzyskiwać te bity.
To czy program liczbę 11 zrozumie jako 11 patyczków 0b11 patyczków czy 0x11 patyczków zależy od tych dodatkowych znaczków.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#7
(10-12-2022, 03:17)kaczakat napisał(a): Czyli do funkcji z wysłaniem klawisza klawiatury wysyłasz zmienną int o nazwie keypadStatus
sendKeyPress(keypadStatus); 
Wydrukuj sobie jakie wartości przyjmuje keypadStatus, masz 'i' max 8 choć przycisków więcej, 0, 1, 2, 4, 8, 16, 32,64,128,256, obciąłeś sobie liczbę int do 9 bitów.
Nie wiem po co tak kombinujesz, jeślibyś jeszcze korzystał z kombinacji tych przycisków chcąc osiągnąć parę tysięcy różnych przycisków to OK, wykorzystując je jak liczbę binarną, to OK. Tu wystarczy zwrócić i , masz wciśnięty przycisk z idexu 0-12, albo jak chcesz widzieć wciśnięcia wielu przycisków to w swich case znowu trzeba z maskami odzyskiwać te bity.
To czy program liczbę 11 zrozumie jako 11 patyczków 0b11 patyczków czy 0x11 patyczków zależy od tych dodatkowych znaczków.
Dzieki kaczakat, rozwiazalem problem, zamykam temat.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości