/**************************************/ /* Charlieplexing 6 LEDs with 3 Pins */ /* */ /* Code written by William Hart, 2011 */ /* http://williamhart.info */ /* */ /* Uses 3 pins to power a network of */ /* 6 LEDs using the charlieplexing */ /* technique. */ /**************************************/ #define LED_A 1 #define LED_B 2 #define LED_C 3 #define LED_D 4 #define LED_E 5 void setup() { // first set all pins to input, or high impedance // (not strictly necessary as all pins are inputs by default) pinMode(LED_A, INPUT); pinMode(LED_B, INPUT); pinMode(LED_C, INPUT); pinMode(LED_D, INPUT); pinMode(LED_E, INPUT); } void loop() { // run through a sample loop, lighting each LED // in turn and holding for half a second. set_pins(LED_B, LED_A); delay(10); set_pins(LED_A, LED_B); delay(10); set_pins(LED_A, LED_C); delay(10); set_pins(LED_A, LED_D); delay(10); set_pins(LED_A, LED_E); delay(10); set_pins(LED_C, LED_A); delay(10); set_pins(LED_C, LED_B); delay(10); set_pins(LED_B, LED_C); delay(10); set_pins(LED_B, LED_D); delay(10); set_pins(LED_B, LED_E); delay(10); set_pins(LED_D, LED_A); delay(10); set_pins(LED_D, LED_B); delay(10); set_pins(LED_D, LED_C); delay(10); set_pins(LED_C, LED_D); delay(10); set_pins(LED_C, LED_E); delay(10); set_pins(LED_E, LED_A); delay(10); set_pins(LED_E, LED_B); delay(10); set_pins(LED_E, LED_C); delay(10); set_pins(LED_E, LED_D); delay(10); set_pins(LED_D, LED_E); delay(10); } void set_pins(int high_pin, int low_pin) { // reset all the pins reset_pins(); // set the high and low pins to output pinMode(high_pin, OUTPUT); pinMode(low_pin, OUTPUT); // set high pin to logic high, low to logic low digitalWrite(high_pin, HIGH); digitalWrite(low_pin,LOW); } void reset_pins() { // start by ensuring all pins are at input and low pinMode(LED_A, INPUT); pinMode(LED_B, INPUT); pinMode(LED_C, INPUT); pinMode(LED_D, INPUT); pinMode(LED_E, INPUT); digitalWrite(LED_A, LOW); digitalWrite(LED_B, LOW); digitalWrite(LED_C, LOW); digitalWrite(LED_D, LOW); digitalWrite(LED_E, LOW); }