Arduino Polska Forum

Pełna wersja: Macro keyboard - Arduino Pro Micro
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
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.
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.
(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 ?
W załączonym fragmencie nie ma powodu by nie działał. Gdzie masz zmienną key, gdzie nadajesz jej wartości?
(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.
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.
(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.