Paso 2: código
- Los cuadros de animación
- La asignación de charlieplexing
- El bucle
- El controlador de led
1 los cuadros de animación
Para que sea fácil de programar lo que se muestra en la pantalla pequeña, he hecho el código para que sólo pueda escribir en lo que quieras que aparezca como lo que se muestra en las siguientes líneas. 1 significa que la luz está encendida y el 0 apagado. El carácter B pretende Arduino sabe es código binario en lugar de 1 mil hunder etc. etc..
{ B10101010, B10101010, B10101010, B10101010, B10101010, B10101010, B10101010, B10101010 }, { B11111111, B00000000, B11111111, B00000000, B11111111, B00000000, B11111111, B00000000 }
2 la asignación de charlieplexing
Se trata de una matriz indicando que pasadores necesitan estar conectados entre sí. La belleza de esta tabla es que todavía puede hacer este mismo dispositivo funciona, incluso si han cometido errores en el cableado o tienen algunos otros pernos del IO en uso. Si es así, sólo cambia los valores de la matriz!
3 el lazo
El bucle no hace nada más que cambiar el marco número después de una cantidad fija de tiempo. Llama al controlador de led tan a menudo como sea posible para evitar el parpadeo. Fácilmente podría combinar el programa con otra cosa a añadir aquí.
4 el controlador led
Esto es donde la magia sucede. Básicamente, camina a través de cada LED y comprueba si el actual marco de animación quiere activar o desactivar. Algo que era difícil de captar para mí antes era bitlogic solía hacer esta comprobación. Si no entiendes la explicación en los comentarios, probar con este tutorial: http://arduino.cc/en/Tutorial/BitMask
Código:
int limiter = 100000;//us (this allows you to delay the action of charlieplexing, //allowing to tweak the speed or see the effect in simulation) int animationDelay = 200;//ms ( 1/(animationDelay/1000)=fps => 5fps ) //this does not really work if the charlieplexing is limited char animationLength = 4;//match this number to the number of frames you've used //this array is filled with all the frames you want to animate, 1 is on and 0 is off char animation[4][8]={ { B10101010, B10101010, B10101010, B10101010, B10101010, B10101010, B10101010, B10101010 }, { B01010101, B01010101, B01010101, B01010101, B01010101, B01010101, B01010101, B01010101 }, { B00000000, B11111111, B00000000, B11111111, B00000000, B11111111, B00000000, B11111111 }, { B11111111, B00000000, B11111111, B00000000, B11111111, B00000000, B11111111, B00000000 } }; const int UPPERPIN = 13; //upmost pin const int LOWERPIN = 5; //lowest pin //this is the charlieplexing mapping, see for more info: //http://wealoneonearth.blogspot.nl/2013/03/design-note-charlieplexing-led-matrices.html char mapping[8][8]={ {2,3,4,5,6,7,8,9}, {1,3,4,5,6,7,8,9}, {1,2,4,5,6,7,8,9}, {1,2,3,5,6,7,8,9}, {1,2,3,4,6,7,8,9}, {1,2,3,4,5,7,8,9}, {1,2,3,4,5,6,8,9}, {1,2,3,4,5,6,7,9} }; //two variables used for timekeeping int animationFrame=0; long animationTimer = 0; void setup() { //nothing to set up } void loop() { //a timer, so you can do some other stuff at the same time if(millis() - animationTimer > animationDelay) { animationFrame++; if (animationFrame>animationLength)animationFrame=0; } updatePins();//update the leds } //the function which manages the leds void updatePins(){ for(int i = 0;i<8;i++){ for(int j = 0;j<8;j++){ if(animation[animationFrame][i]& 1<<j){ //This function works in two parts // 1<<j makes 00000001 for j=1, 00000010 for j=2, etc // then the & operator compares that bit with what is in animation[] //so in total, it checks a specific bit in animiation[], //if it's 1, a led will light, if it's 0, it will not resetAllPins(); //turn off everything pinMode(UPPERPIN-mapping[i][j]+1, OUTPUT);//+1 for offset digitalWrite(UPPERPIN-mapping[i][j]+1, HIGH); pinMode(UPPERPIN-i, OUTPUT); digitalWrite(UPPERPIN-i, LOW); //the mapping array makes sure the right pins are turned on and off delayMicroseconds(limiter); //to be able to see the effect, we limit the speed } else resetAllPins(); } } } void resetAllPins(){ for(int i=LOWERPIN;i<=UPPERPIN;i++){ pinMode(i, INPUT); digitalWrite(i, LOW); } //set everything to high impendance, so it will not function in the circuit }