• 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
Button Box na Arduino Pro Micro - problem z odwołaniem do konkretnego przycisku
#1
Cześć

To mój pierwszy post, więc witam serdecznie Smile

Mam taki problem - zbudowałem sobie button box i zastosowałem dwa rodzaje przycisków (i tak chciałbym je wykorzystywać w grze) - bistabilne i monostabilne. Jestem w stanie zrobić, żeby wszystkie przyciski zachowywały się jak monostabilne lub wszystkie jako bistabilne. Jednak nie wiem w jaki sposób dojść do konkretnego przycisku. Komputer wykrywa button box jako gamepad z 45 przyciskami i wydawało mi się, że wystarczy się odwołać w pętli do konkretnego numeru przycisku, żeby zmienić jego zachowanie.

Mój kod na przyciski monostabilne:
Kod:
//BUTTON BOX 45 buttons
//Arduino Pro Micro
//Tested in WIN7 + ETS2
//V1.0

#include <Keypad.h>
#include <Joystick.h>

#define NUMBUTTONS 45
#define NUMROWS 9
#define NUMCOLS 5


byte buttons[NUMROWS][NUMCOLS] = {
  {0,1,2,3,4},
  {5,6,7,8,9},
  {10,11,12,13,14},
  {15,16,17,18,19},
  {20,21,22,23,24},
  {25,26,27,28,29},
  {30,31,32,33,34},
  {35,36,37,38,39},
  {40,41,42,43,44},
};


byte rowPins[NUMROWS] = {21,20,19,18,15,14,16,10,9};
byte colPins[NUMCOLS] = {8,7,6,5,3};

Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS);

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
  JOYSTICK_TYPE_JOYSTICK, 45, 0,
  false, false, false, false, false, false,
  false, false, false, false, false);

void setup() {
  Joystick.begin();
}

void loop() {

  CheckAllButtons();

}

void CheckAllButtons(void) {
      if (buttbx.getKeys())
    {
       for (int i=0; i<LIST_MAX; i++)  
        {
           if ( buttbx.key[i].stateChanged )  
            {
            switch (buttbx.key[i].kstate) { 
                    case PRESSED:
                    case HOLD:
                              Joystick.setButton(buttbx.key[i].kchar, 1);
                              break;
                    case RELEASED:
                    case IDLE:
                              Joystick.setButton(buttbx.key[i].kchar, 0);
                              break;
            }
           }  
         }
     }
}

Część kodu na przyciski bistabilne:
Kod:
void CheckAllButtons(void) {
      if (buttbx.getKeys())
    {
       for (int i=0; i<LIST_MAX; i++)  
        {
           if ( buttbx.key[i].stateChanged )  
            {
            switch (buttbx.key[i].kstate) { 
                    case PRESSED:
                              Joystick.setButton(buttbx.key[i].kchar, 1);
                              break;
                    case HOLD:
                    case RELEASED:
                              Joystick.setButton(buttbx.key[i].kchar, 1);
                              delay(100);
                              Joystick.setButton(buttbx.key[i].kchar, 0);
                    case IDLE:
                    break;
            }
           }  
         }
     }
}

Wszystko byłoby git, ale jednak chcę mieć możliwość, żeby część przycisków działała jako bistabilne a część jako monostabilne. Miałem nadzieję, że jak chcę zaprogramować przyciski nr 5, 10, 36, 38 i 43 jako bistabilny to wystarczy wpisać:
Kod:
void CheckAllButtons(void) {
    if (buttbx.getKeys())
    {
        for (int i=0; i<LIST_MAX; i++)  
        {
            if ( buttbx.key[i].stateChanged )  
            {
                switch (buttbx.key[i].kstate)
                {
                    case PRESSED:
                        if ( (i == 10) || (i == 5) || (i == 36) || (i == 43) || (i == 38) )
                            {
                                Joystick.setButton(buttbx.key[i].kchar, 1);
                                delay(100);
                                Joystick.setButton(buttbx.key[i].kchar, 0);
                            }
                    break;
                    case HOLD:
                        if ( (i != 10) && (i != 5) && (i != 36) && (i != 43) && (i != 38) )
                            {
                                Joystick.setButton(buttbx.key[i].kchar, 1);
                            }
                    break;
                    case RELEASED:
                        if ( (i == 10) || (i == 5) || (i == 36) || (i == 43) || (i == 38) )
                            {
                                Joystick.setButton(buttbx.key[i].kchar, 1);
                                delay(100);
                                Joystick.setButton(buttbx.key[i].kchar, 0);
                            }
                    break;
                    case IDLE:
                        if ( (i != 10) && (i != 5) && (i != 36) && (i != 43) && (i != 38) )
                            {
                                Joystick.setButton(buttbx.key[i].kchar, 0);
                            }
                    break;
                }
            }
        }
    }
}
Jednak tak się nie stało. i == 5 nie odwołuje się do przycisku nr 5. W jaki sposób odwołać się do tych przycisków?

Z góry dziękuję za pomoc.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości