En la entrada anterior hemos usado unas cuantas funciones a las que tendremos que recurrir con mucha frecuencia. Vamos a crear, por tanto, un archivo con todas ellas y lo incluiremos, cuando sea necesario, en una nueva pestaña del IDE Arduino:
Ahora sólo tenemos que copiar y pegar el siguiente código:
/*
* funcionesMicrobit.ino
* Conjunto de funciones que podemos usar en nuestros programas.
*/
/*
* Los pines de las tres filas y 9 columnas de la matriz
* interna de LEDs
*/
byte pinFilas[3] = {26, 27, 28};
byte pinColumnas[9] = {3, 4, 10, 23, 24, 25, 9, 7, 6};
/*
* boolean matrizLed[5][5];
* Vamos a crear una imagen virtual de la matriz de LEDs,
* para ello utilizamos un array de tipo booleano de dos
* dimensiones (fila-Columna).
* Un 1 es encendido y un 0 apagado.
*/
boolean matrizLed[5][5]={{0,0,0,0,0},
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,0,0,0}}; //matrizLed[fila][columna]
/*
* coorY y coorX son dos array de 3x9 que representan la
* fila (Y) y columna (X) de cada uno de los LED (matriz de 5x5)
* en relación con su posición en la matriz interna de 3x9.
*/
byte coorY [3][9] = {{0,0,0,3,3,3,3,3,2},
{2,2,2,0,0,4,4,0,0},
{4,4,4,1,1,1,1,1,2}};
byte coorX [3][9] = {{0,2,4,4,3,2,1,0,1},
{4,0,2,1,3,3,1,0,0},
{2,4,0,0,1,2,3,4,3}};
byte fila=0; //la fila actual a encender en el multiplexado.
long millisInicialesLed=0;
long millisInicialesDelay_=0;
/*
* pinMatrizLedSalidas()
* Programa como salidas los 3 pines de las filas internas
* y los 9 pines de las columnas
*/
void pinMatrizLedSalidas(){
for (byte i=0; i<9; i++){
pinMode(pinColumnas[i], OUTPUT);
}
for (byte i=0; i<3; i++){
pinMode(pinFilas[i], OUTPUT);
}
}
/*
* multiplexaMatrizLed()
* Cada 6 milisegundos llama a la función
* multiplexadoFilasLed.
*/
void multiplexaMatrizLed(){
if (millis() - millisInicialesLed > 6) {
millisInicialesLed = millis();
multiplexaFilasLed();
}
}
/*
* apagaMatrizLed()
* Desactiva todos los pines tanto de las tres filas
* como de las nueve columnas de la matriz de LEDS.
*/
void apagaMatrizLed(){
for (byte i=0; i<3; i++){
digitalWrite(pinFilas[i], LOW);
}
for (byte i=0; i<9; i++){
digitalWrite(pinColumnas[i], HIGH);
}
}
/*
* multiplexaFilasLed()
* Primero apaga toda los LEDs y después transfiere los 0 y 1
* de la matriz virtual a los LEDs correspondiente.
* Cada vez que se ejecuta (cada 6 mseg)se actualiza una sola
* de las tres filas internas.
* Recordamos los pines (fila columna) de los LEDs:
* (26-3) 27-23 26-4 27-24 (26-10)
* 28-23 (28-24) 28-25 (28-9) 28-7
* 27-4 26-6 (27-10) 28-6 27-3
* 26-7 (26-9) 26-25 (26-24) 26-23
* (28-10) 27-9 28-3 27-25 (28-4)
*/
void multiplexaFilasLed(){
apagaMatrizLed();
digitalWrite(pinFilas[fila],HIGH);
for (byte i=0; i<9; i++){
digitalWrite(pinColumnas[i], !matrizLed[coorY[fila][i]][coorX[fila][i]]);
}
fila++;
if(fila==3) fila=0;
}
/*
* delay_
* Creamos una función que realiza la temporización utilizando
* la instrucción millis() y genera un nuevo buble que se sigue
* ejecutando durante el tiempo que hayamos fijado.
* La variable millisIniciales está declarada como local dentro
* de la función.
* Para hacer ese buble hemos utilizado la instrucción:
* while(condición){ instrucciones }
* mientras que se cumpla la condición se ejecutan las instruciones
* que hay entre las llaves.
* En lugar de incluir entre las llaves todas las instrucciones
* que necesitemos las colocaremos en una nueva función loop_
* que hay que incluir en nuestro programa.
*/
void delay_(long tiempo){
long millisInicialesDelay_ = millis();
while(millis() - millisInicialesDelay_ < tiempo){
loop_();
}
}
En la primera pestaña escribiremos nuestros programas y podremos utilizar las funciones que hemos añadido. Al guardarlo aparecererán dos archivos .ino, el del programa y el de las funciones. Una vez que tenemos creado funcionesMicrobit.ino lo podemos incluir en otros programas utilizando la opción "Añadir fichero..." del menú "Programa".
No hay comentarios:
Publicar un comentario