Code:
#include <Encoder.h>
#include <Bounce2.h>
// Teensy LC Pin definitions
int ledPIN[7] = {10, 9, 22, 23, 20, 26, 13};
int buttonPIN[8] = {2,3,4,5,6,7,8,11};
int togglePIN = 0;
int pushPIN = 1;
int potPIN[6] = {14,15,16,17,18,19};
int encPIN1 = 12;
int encPIN2 = 25;
int encswPIN = 24;
int pedalPIN = 21;
// Array to store pot values
int potVal[6];
// Array to store button values
bool butt[16];
Bounce butt_0 = Bounce(buttonPIN[0], 5);
Bounce butt_1 = Bounce(buttonPIN[1], 5);
Bounce butt_2 = Bounce(buttonPIN[2], 5);
Bounce butt_3 = Bounce(buttonPIN[3], 5);
Bounce butt_4 = Bounce(buttonPIN[4], 5);
Bounce butt_5 = Bounce(buttonPIN[5], 5);
Bounce butt_6 = Bounce(buttonPIN[6], 5);
Bounce butt_7 = Bounce(buttonPIN[7], 5);
Bounce toggleSW = Bounce(togglePIN, 5);
Bounce pushSW = Bounce(pushPIN, 5);
Bounce encPush = Bounce(encswPIN, 5);
Encoder rotary(encPIN1, encPIN2);
long encoderPosition = -999;
long newPosition;
long oldPosition;
IntervalTimer usbTimer;
IntervalTimer encoderTimer;
// ############## SETUP ################ //
void setup() {
int i;
// Configure Pins
for (i=0; i < 7 ; i++) {
pinMode(ledPIN[i], OUTPUT);
}
for (i=0; i < 8; i++) {
pinMode(buttonPIN[i], INPUT_PULLUP);
}
for (i=0; i < 6; i++) {
pinMode(potPIN[i], INPUT);
}
pinMode(pushPIN, INPUT_PULLUP);
pinMode(togglePIN, INPUT_PULLUP);
pinMode(encswPIN, INPUT_PULLUP);
pinMode(encPIN1, INPUT_PULLUP);
pinMode(encPIN2, INPUT_PULLUP);
pinMode(pedalPIN, INPUT);
//Configure joystick values to be sent only on demand
Joystick.useManualSend(true);
// Configure USB Serial Baud Rate
Serial.begin(38400);
//Configure resolution of PWM duty cycle
//analogWriteResolution(10);
analogReadRes(10);
analogReadAveraging(32);
usbTimer.begin(updateRoutine, 50000);
encoderTimer.begin(encoderRoutine, 5000);
butt[11] = 1;
butt[12] = 1;
butt[13] = 1;
}
// ########## ENCODER ROUTINE ################ //
void encoderRoutine() {
if (newPosition != encoderPosition) {
if (newPosition > encoderPosition) {
butt[14] = 0;
}
if (newPosition < encoderPosition) {
butt[15] = 0;
}
}
encoderPosition = newPosition;
}
// ########## UPDATE ROUTINE ############### //
void updateRoutine() {
int i=0;
// Read pot values
/*
Joystick.X(map(analogRead(potPIN[0]), 0, 1023, 60, 960));
Joystick.Y(map(analogRead(potPIN[1]), 0, 1023, 60, 960));
Joystick.Z(map(analogRead(potPIN[2]), 0, 1023, 60, 960));
Joystick.Zrotate(map(analogRead(potPIN[3]), 0, 1023, 60, 960));
Joystick.sliderLeft(map(analogRead(potPIN[4]), 0, 1023, 60, 960));
Joystick.sliderRight(map(analogRead(potPIN[5]), 0, 1023, 60, 960));
Serial.println(analogRead(potPIN[0]));
*/
Joystick.X(analogRead(potPIN[0]));
Joystick.Y(analogRead(potPIN[1]));
Joystick.Z(analogRead(potPIN[2]));
Joystick.Zrotate(analogRead(potPIN[3]));
Joystick.sliderLeft(analogRead(potPIN[4]));
Joystick.sliderRight(analogRead(potPIN[5]));
// Set LEDs
if (butt[0] & butt[1]) {
digitalWrite(ledPIN[0], LOW);
}else{
digitalWrite(ledPIN[0], HIGH);
}
if (butt[2] & butt[3]) {
digitalWrite(ledPIN[1], LOW);
}else{
digitalWrite(ledPIN[1], HIGH);
}
if (butt[4] & butt[5]) {
digitalWrite(ledPIN[2], LOW);
}else{
digitalWrite(ledPIN[2], HIGH);
}
if (butt[6] & butt[7]) {
digitalWrite(ledPIN[3], LOW);
}else{
digitalWrite(ledPIN[3], HIGH);
}
digitalWrite(ledPIN[5], !butt[8]);
digitalWrite(ledPIN[4], !butt[14]);
digitalWrite(ledPIN[6], !butt[15]);
//set joystick button if pushed
for (i=0; i <16; i++) {
Joystick.button(i+1, !butt[i]);
}
//Send joystick values to USB
Joystick.send_now();
// reset encoder push button
butt[14] = 1;
butt[15] = 1;
// stop unused buttons from sending jostick presses
butt[11] = 1;
butt[12] = 1;
butt[13] = 1;
}
// ############## MAIN ################# //
void loop() {
//check switches
butt[0] = butt[0] ^ butt_0.update();
butt[1] = butt[1] ^ butt_1.update();
butt[2] = butt[2] ^ butt_2.update();
butt[3] = butt[3] ^ butt_3.update();
butt[4] = butt[4] ^ butt_4.update();
butt[5] = butt[5] ^ butt_5.update();
butt[6] = butt[6] ^ butt_6.update();
butt[7] = butt[7] ^ butt_7.update();
butt[8] = butt[8] ^ toggleSW.update();
butt[9] = butt[9] ^ pushSW.update();
butt[10] = butt[10] ^ encPush.update();
//check rotary encoder
newPosition = rotary.read();
}