Make toggle switch act as button

Hello guys! i just made a button box following this tutorial.
Works great, but i would like to change something. I have 5 toggles ( when i switch one, it stays always on until i switch it off).

Is there a way to modify the code to make those 5 toggles work as a momentary push button? preferably both when switched on, and when switched off.

The thing is i have basically 0 coding skills, i just copied the code that amstudio provided. So i have no idea what to modify even if someone told me. In any case ill paste the original code, maybe someone can help!

//BUTTON BOX 
//USE w ProMicro
//Tested in WIN10 + Assetto Corsa
//AMSTUDIO
//20.8.17

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

#define ENABLE_PULLUPS
#define NUMROTARIES 4
#define NUMBUTTONS 24
#define NUMROWS 5
#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},
};

struct rotariesdef {
  byte pin1;
  byte pin2;
  int ccwchar;
  int cwchar;
  volatile unsigned char state;
};

rotariesdef rotaries[NUMROTARIES] {
  {0,1,24,25,0},
  {2,3,26,27,0},
  {4,5,28,29,0},
  {6,7,30,31,0},
};

#define DIR_CCW 0x10
#define DIR_CW 0x20
#define R_START 0x0

#ifdef HALF_STEP
#define R_CCW_BEGIN 0x1
#define R_CW_BEGIN 0x2
#define R_START_M 0x3
#define R_CW_BEGIN_M 0x4
#define R_CCW_BEGIN_M 0x5
const unsigned char ttable[6][4] = {
  // R_START (00)
  {R_START_M,            R_CW_BEGIN,     R_CCW_BEGIN,  R_START},
  // R_CCW_BEGIN
  {R_START_M | DIR_CCW, R_START,        R_CCW_BEGIN,  R_START},
  // R_CW_BEGIN
  {R_START_M | DIR_CW,  R_CW_BEGIN,     R_START,      R_START},
  // R_START_M (11)
  {R_START_M,            R_CCW_BEGIN_M,  R_CW_BEGIN_M, R_START},
  // R_CW_BEGIN_M
  {R_START_M,            R_START_M,      R_CW_BEGIN_M, R_START | DIR_CW},
  // R_CCW_BEGIN_M
  {R_START_M,            R_CCW_BEGIN_M,  R_START_M,    R_START | DIR_CCW},
};
#else
#define R_CW_FINAL 0x1
#define R_CW_BEGIN 0x2
#define R_CW_NEXT 0x3
#define R_CCW_BEGIN 0x4
#define R_CCW_FINAL 0x5
#define R_CCW_NEXT 0x6

const unsigned char ttable[7][4] = {
  // R_START
  {R_START,    R_CW_BEGIN,  R_CCW_BEGIN, R_START},
  // R_CW_FINAL
  {R_CW_NEXT,  R_START,     R_CW_FINAL,  R_START | DIR_CW},
  // R_CW_BEGIN
  {R_CW_NEXT,  R_CW_BEGIN,  R_START,     R_START},
  // R_CW_NEXT
  {R_CW_NEXT,  R_CW_BEGIN,  R_CW_FINAL,  R_START},
  // R_CCW_BEGIN
  {R_CCW_NEXT, R_START,     R_CCW_BEGIN, R_START},
  // R_CCW_FINAL
  {R_CCW_NEXT, R_CCW_FINAL, R_START,     R_START | DIR_CCW},
  // R_CCW_NEXT
  {R_CCW_NEXT, R_CCW_FINAL, R_CCW_BEGIN, R_START},
};
#endif

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

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

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

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

void loop() { 

  CheckAllEncoders();

  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;
            }
           }   
         }
     }
}


void rotary_init() {
  for (int i=0;i<NUMROTARIES;i++) {
    pinMode(rotaries[i].pin1, INPUT);
    pinMode(rotaries[i].pin2, INPUT);
    #ifdef ENABLE_PULLUPS
      digitalWrite(rotaries[i].pin1, HIGH);
      digitalWrite(rotaries[i].pin2, HIGH);
    #endif
  }
}


unsigned char rotary_process(int _i) {
   unsigned char pinstate = (digitalRead(rotaries[_i].pin2) << 1) | digitalRead(rotaries[_i].pin1);
  rotaries[_i].state = ttable[rotaries[_i].state & 0xf][pinstate];
  return (rotaries[_i].state & 0x30);
}

void CheckAllEncoders(void) {
  for (int i=0;i<NUMROTARIES;i++) {
    unsigned char result = rotary_process(i);
    if (result == DIR_CCW) {
      Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);
    };
    if (result == DIR_CW) {
      Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);
    };
  }
}

Also i found a post where someone had the exact same question, and it looks like it was solved with the help of the code someone posted below. BUT , i have no idea of how to implement it in the code!!

The toggles correspond to the following numbers in the windows controller properties :16, 19, 3, 4, and 5

thanks!

In the IDE, file/examples/digital/statechangedetection

You need to sense when the switch *becomes * open or closed, not when it *is * open or closed.

dougp:
In the IDE, file/examples/digital/statechangedetection

You need to sense when the switch *becomes * open or closed, not when it *is * open or closed.

hi! thanks for the reply!.

How do i implement that to the code in a way that would let me use the switch as a momentary push?

3lit:
hi! thanks for the reply!.

How do i implement that to the code in a way that would let me use the switch as a momentary push?

I'm not sure if I understand the question.

Do you mean something like, throw the switch and the LED comes on for a second, then throw the switch the other way and the LED comes on for one second?

SteveMann:
I'm not sure if I understand the question.

Do you mean something like, throw the switch and the LED comes on for a second, then throw the switch the other way and the LED comes on for one second?

Well kind of! It's a button box I made for my racing simulator, so instead of a led it would be an action in the game.

I think the answer Is in this code

boolean toggleState; // hold current state of switch
boolean lastToggleState;  // hold last state to sense when switch is changed
long toggleTimer = millis();  // // debounce timer

void setup(){
// setup stuff here
}

void loop(){

toggleState = digitalRead(toggleSwitchPin);

if (millis() - toggleTimer > 100){  // debounce switch 100ms timer
  if (toggleState && !lastToggleState) {  // if switch is on but was previously off
    lastToggleState = true;  // switch is now on
    toggleTimer = millis();  // reset timer
    // do stuff here
  }

  if (!toggleState && lastToggleState){  // if switch is off but was previously on
    lastToggleState = false; // switch is now off
    toggleTimer = millis(); // reset timer
    // do stuff here
    }
  }
}

But idk how to implement it in the original code since I don't know how to program :frowning:

If you want someone to code for you, there is a Gigs and Collaborations Forum for that.

I can tell you know that attempting to use code without knowing how to code will lead you to extreme frustration and annoyance. Especially with people going "Oh, all you have to do it this thingy, then try that thingy, and lastly set the thingamawhatzit and bam it magically works!". While the code for such a thing isn't hard to do, someone who doesn't know how to code will become extremely frustrated at it.

Trust me, learn how to code, and half of your problems will disappear. I'll start writing up the code for it now, but keep in mind that using code without learning it is like speaking a language without knowing what it means. Both sides get frustrated until one gives up and the other is left confused and without an answer

aarg:
If you want someone to code for you, there is a Gigs and Collaborations Forum for that.

Whoops. My bad!

Technokid2000:
I can tell you know that attempting to use code without knowing how to code will lead you to extreme frustration and annoyance. Especially with people going "Oh, all you have to do it this thingy, then try that thingy, and lastly set the thingamawhatzit and bam it magically works!". While the code for such a thing isn't hard to do, someone who doesn't know how to code will become extremely frustrated at it.

Trust me, learn how to code, and half of your problems will disappear. I'll start writing up the code for it now, but keep in mind that using code without learning it is like speaking a language without knowing what it means. Both sides get frustrated until one gives up and the other is left confused and without an answer

Thanks!! That would be awesome. And yes, I should start to learn at least some basic programming for this type of stuff. Thanks

@3lit's topic in the "Gigs and Collaborations" board:
https://forum.arduino.cc/index.php?topic=677054

bump