@bdub11886, I have enjoyed using the Teensy USB Development boards available here. For my Autopilot panel build, I used the Teensy LC since I did not need over 27 inputs. If you need more, you can go with the Teensy 4.1.
EDIT: Forgot to mention WHY I liked these… you can program them to be a joystick so they readily show up in MSFS and X-Plane and can be easily programmed in-game to whatever keybind you want.
I do have an X-Cub panel layout using mini rockers available to download if you want to go that route.
As for programming, the following is some sample code for 3 toggle switches illustrating 3 different methods (constant on/off, momentary push button with each flip, and a momentary using another button like a shift-press on your keyboard.
#include <Bounce2.h>
Bounce button0 = Bounce(0, 20);
Bounce button1 = Bounce(1, 20);
Bounce button3 = Bounce(2, 20);
void setup() {
Joystick.Z(512);
Joystick.X(512);
Joystick.Y(512);
Joystick.Zrotate(512);
Joystick.sliderLeft(512);
Joystick.sliderRight(512);
Joystick.hat(-1);
pinMode (0, INPUT_PULLUP);
pinMode (1, INPUT_PULLUP);
void loop() {
button0.update();
button1.update();
button2.update();
if (button0.fallingEdge()) {Joystick.button(1, 1);}
if (button0.risingEdge()) {Joystick.button(1, 0);}
if (button1.fallingEdge()) {Joystick.button(2, 1);delay(50);Joystick.button(2, 0);}
if (button1.risingEdge()) {Joystick.button(2, 1);delay(50);Joystick.button(2, 0);}
if (button2.fallingEdge()) {Joystick.button(3, 1);delay(50);Joystick.button(3, 0);}
if (button2.risingEdge()) {Joystick.button(32, 1);delay(10);Joystick.button(3, 1);delay(50);Joystick.button(3, 0);Joystick.button(32, 0);}
}
Wiring button 1 to pin 0 and ground, button 2 to 1 and ground, and button 3 to 2 and ground… This is a decent way to test how you want to program your toggles. Currently, I am using the shift setup to avoid the issue with constant-on switches (see Honeycomb yoke issue basically).
I can walk through this code if you’d like; just say the word!