Connect an analog joystick to an Arduino. Read two analog values (x- and y-position) and a switch using a method witch does not hog the processor during the whole ADConversion.
The capacitor reduces digital noise on the analog readings.
Code
static const byte ADC_CHANNEL_JOYSTICK_X = 0; static const byte ADC_CHANNEL_JOYSTICK_Y = 1; static const byte ADC_CHANNEL_MAX = 2; byte adc_channel = 0; bool joystick_button = 0; // 1 or 0 uint16_t joystick_x = 0; // 0~1023 uint16_t joystick_y = 0; // 0~1023 void setup() { Serial.begin(115200); // Remove pinMode(A0, INPUT); // Analog pin A0 pinMode(A1, INPUT); // Analog pin A1 pinMode(2, INPUT_PULLUP); // Digital pin 2 // Setup adc ADCSRA |= 1 << ADEN; // Enable ADC, with no interrupt! ADCSRA |= ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0)); // Main clock / 128 ADMUX = adc_channel; // Channel ADMUX |= 1 << REFS0; // Aref pin -> 100nF -> gnd ADCSRA |= 1 << ADSC; // Start first conversion } void loop() { byte changed = 0; // Analog if ((ADCSRA & (1 << ADSC)) == 0) { // ADC done changed += read_analog(); } // Digital changed += read_digital(); // Tmp if(changed > 0) { Serial.print("x: "); Serial.println(joystick_x); Serial.print("y: "); Serial.println(joystick_y); Serial.print("button: "); Serial.println(joystick_button); Serial.println(); } delay(100); // Remove } byte read_digital() { byte state = 0; byte val = !(bool)(PIND & 0b00000100); // PORT IN D, pin nr 2 if(val != joystick_button) { state = 1; joystick_button = val; } return state; } byte read_analog() { byte state = 0; uint16_t val = ADC; // ADC is the full 10-bit, two-register, value from the last ADConversion switch(adc_channel) { case ADC_CHANNEL_JOYSTICK_X: if(joystick_x != val) { state = 1; joystick_x = val; } break; case ADC_CHANNEL_JOYSTICK_Y: if(joystick_y != val) { state = 1; joystick_y = val; } break; } adc_channel++; if(adc_channel >= ADC_CHANNEL_MAX) adc_channel = 0; ADMUX = adc_channel; // Channel ADMUX |= 1 << REFS0; // Aref pin -> 100nF -> gnd ADCSRA |= 1 << ADSC; // Start next conversion return state; }