// DoubleSliderJoystick.ino
// Descretize a joystick into coordinates and act with a switch
// for https://forum.arduino.cc/t/how-to-get-this-to-work-1-analog-to-360-emulator-multi-buttons/967642/8
// DaveX 2022-03-09 CC 3.0 BY-SA
const byte xPot = A0;
const byte yPot = A1;
const byte buttonPin = 2;
const byte ledPin = LED_BUILTIN;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(xPot,INPUT);
pinMode(yPot,INPUT);
pinMode(buttonPin,INPUT_PULLUP);
pinMode(ledPin,OUTPUT);
}
unsigned long loopMs;
int joyState;
bool buttonState = false;
int readJoy(void){
return((analogRead(xPot)/103)*10 + analogRead(yPot)/103);
}
void scanInputs(){
const unsigned long interval = 100;
static unsigned long last = - interval;
if(loopMs - last >= interval){
last += interval;
joyState = readJoy();
buttonState = digitalRead(buttonPin) ? false:true ;
}
}
void report(){
const unsigned long interval = 1000;
static unsigned long last = - interval;
if(loopMs - last >= interval){
last += interval;
Serial.print(loopMs);
Serial.print(' ');
Serial.print(joyState);
Serial.print(' ');
Serial.print(buttonState,DEC);
Serial.print(' ');
Serial.print(digitalRead(ledPin),DEC);
Serial.print(' ');
Serial.println();
}
}
void loop() {
const unsigned long interval = 100;
static unsigned long last = - interval;
loopMs = millis();
scanInputs();
report();
if(loopMs - last >= interval){
last += interval;
switch(joyState){
case 0 ... 50:
digitalWrite(ledPin,HIGH);
break;
case 71 ... 75:
case 91 ... 95:
digitalWrite(ledPin,HIGH);
break;
case 86 ... 89:
if(buttonState){
Serial.println("You win a cookie!!");
}
break;
default:
digitalWrite(ledPin,LOW);
}
}
}