/* matrix-scan a set of LEDs pins: "rows" 12 & 13 go to a 220Ω resistor, then to 2 LEDs each (positive / long stem side); also to a 10kΩ resistor then to 2 phototransistors (collector / long stem side) also, from between the 10kΩ and the phototransistors, wire goes to A1 & A2 "columns" 14 & 15 go to 2 LEDs each (negative / short stem side) so that given one of 12|13 and one of 14|15, one LED is identified */ int currentLed = 0; int lastSeen = 100; void setup() { Serial.begin(19200); pinMode(12, OUTPUT); pinMode(13, OUTPUT); pinMode(14, OUTPUT); pinMode(15, OUTPUT); pinMode(A1, INPUT); pinMode(A2, INPUT); currentLed = 0; lastSeen = 100; } void tristate(int pin) { pinMode(pin,OUTPUT); digitalWrite(pin,LOW); pinMode(pin,INPUT); } void power(int pin) { pinMode(pin,OUTPUT); digitalWrite(pin,HIGH); } void ground(int pin) { pinMode(pin,OUTPUT); digitalWrite(pin,LOW); } void enableLed(int led) { int row = led/2; int col = led%2; /* Serial.print("enabling "); */ /* Serial.print(row); */ /* Serial.print(" "); */ /* Serial.println(col); */ if (row==0) { power(12); ground(13); } else { ground(12); power(13); } if (col==0) { ground(14); tristate(15); } else { tristate(14); ground(15); } } int sense(int led) { int row = led/2; int value = analogRead(row == 0 ? A1 : A2); //Serial.println(value); return value < 500; } void loop() { /* Serial.print("current led "); */ /* Serial.println(currentLed); */ enableLed(currentLed); delay(1); if (sense(currentLed)) { if (lastSeen != currentLed) { lastSeen = currentLed; Serial.print(currentLed); Serial.println(" proximity!"); } } else if (lastSeen == currentLed) { lastSeen = 100; } currentLed = (currentLed+1)%4; }