#include <MD_Parola.h> // inclure la bibliothèque MajicDesigns Parola
#include <MD_MAX72xx.h> // inclure la bibliothèque de matrices LED MajicDesigns MAX72xx
#include <SPI.h> // inclure la bibliothèque Arduino SPI
/*
Voici 4 types de matériel:
PAROLA_HW GENERIC_HW ICSTATION_HW FC16_HW
Veuillez vous assurer de choisir celui qui
convient à votre module.
*/
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
// #define HARDWARE_TYPE MD_MAX72XX::FC16_HW
// #define HARDWARE_TYPE MD_MAX72XX::GENERIC_HW
// #define HARDWARE_TYPE MD_MAX72XX::ICSTATION_HW
// DATA PIN et CLOCK PIN Communes aux 4 matrices
const int DATA_PIN = 11, CLK_PIN = 13;
// CS (Chip Select) pour chaque matrice.
const int CS_PIN_M1 = 10, CS_PIN_M2 = 9;
// Combien de matrices 8x8 avons-nous dans une chaîne,
const int MAX_DEVICES = 15; // (15 chaînes)
// MATÉRIEL SPI: Définir les PINS utilisés connecter chaque matrice à l'Arduino
MD_Parola Matrice_1 = // Nom de la Matrice 1
MD_Parola(HARDWARE_TYPE, // Type de matériel
DATA_PIN, // Broche DATA (commune à toutes les matrices)
CLK_PIN, // Broche Clock (commune à toutes les matrices)
CS_PIN_M1, // Broche CS (Chip Select) diffèrente pour chaque matrice.
MAX_DEVICES); // nombre maximal de chaînes pour cette matrice
// Idem pour les autre matrices
MD_Parola Matrice_2 = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN_M2, MAX_DEVICES); // Matrice 2
// Tampon d'index partagés par les fonctions série et de défilement
static uint8_t i = 0; // index (speed, pause, liste animations)
/*
Ensuite, nous définissons la structure
qui stocke toutes les informations nécessaires
pour exécuter l'animation.
c.à.d:
le texte à afficher que l'on souhaite animer,
l'alignement du texte.
la vitesse de l'animation,
la pause entre l'arrivée et le départ
le type d'animation avec lequel le texte arrive,
le type d'animation avec lequel le texte repart
*/
struct animations {
const char * textOut; // Texte à afficher
textPosition_t just; // Alignement (gauche, centre, droite)
uint16_t speed; // Vitesse d'animation (multiplicateur pour la valeur par défaut de la bibliothèque)
uint16_t pause; // pause (multiplicateur pour la valeur par défaut de la bibliothèque)
textEffect_t anim_in; // Type d'animation en entrant
textEffect_t anim_out;// Type d'animation en sortant
};
/*Et en utilisant cette structure,
nous créons le tableau qui stockera l’animation composite.*/
animations animList[] = {
//{"textOut", aligmenent, speed, pause, anim_in, anim_out},
{"", PA_CENTER, 4, 2, PA_SCROLL_UP, PA_SCROLL_UP}, // index 0
{"", PA_CENTER, 4, 2, PA_SCROLL_DOWN, PA_SCROLL_DOWN}, // index 1
{"", PA_CENTER, 4, 2, PA_SCROLL_LEFT, PA_SCROLL_LEFT }, // index 2
{"", PA_CENTER, 4, 2, PA_SCROLL_RIGHT, PA_SCROLL_RIGHT},// etc...
{"", PA_CENTER, 1, 2, PA_SPRITE, PA_SPRITE},
{"", PA_CENTER, 0, 2, PA_SLICE, PA_SLICE},
{"", PA_CENTER, 10, 2, PA_MESH, PA_MESH},
{"", PA_CENTER, 14, 2, PA_FADE, PA_FADE},
{"", PA_CENTER, 14, 2, PA_DISSOLVE, PA_DISSOLVE},
{"", PA_CENTER, 14, 2, PA_BLINDS, PA_BLINDS},
{"", PA_CENTER, 4, 2, PA_RANDOM, PA_RANDOM},
{"", PA_CENTER, 4, 2, PA_WIPE, PA_WIPE},
{"", PA_CENTER, 1, 2, PA_WIPE_CURSOR, PA_WIPE_CURSOR},
{"", PA_CENTER, 4, 2, PA_SCAN_HORIZ, PA_SCAN_HORIZ},
{"", PA_CENTER, 4, 2, PA_SCAN_HORIZX, PA_SCAN_HORIZX},
{"", PA_CENTER, 14, 2, PA_SCAN_VERT, PA_SCAN_VERT},
{"", PA_CENTER, 10, 2, PA_SCAN_VERTX, PA_SCAN_VERTX},
{"", PA_CENTER, 5, 2, PA_OPENING, PA_OPENING},
{"", PA_CENTER, 5, 2, PA_OPENING_CURSOR, PA_OPENING_CURSOR},
{"", PA_CENTER, 5, 2, PA_CLOSING, PA_CLOSING},
{"", PA_CENTER, 5, 2, PA_CLOSING_CURSOR, PA_CLOSING_CURSOR},
{"", PA_CENTER, 10, 2, PA_SCROLL_UP_LEFT, PA_SCROLL_UP_LEFT},
{"", PA_CENTER, 10, 2, PA_SCROLL_UP_RIGHT, PA_SCROLL_UP_RIGHT},
{"", PA_CENTER, 10, 2, PA_SCROLL_DOWN_LEFT, PA_SCROLL_DOWN_LEFT},
{"", PA_CENTER, 10, 2, PA_SCROLL_DOWN_RIGHT, PA_SCROLL_DOWN_RIGHT},
{"", PA_CENTER, 14, 2, PA_GROW_UP, PA_GROW_UP},
{"", PA_CENTER, 14, 2, PA_GROW_DOWN, PA_GROW_DOWN},
{"", PA_CENTER, 14, 2, PA_DISSOLVE, PA_DISSOLVE}
};
/*Définission de la structure pour le tableau contenant la liste
des fonctions pour les effets en entrée et en sortie*/
struct effects {
const char * liste;
};
//tableau contenant la liste des 27 fonctions pour
//programmer les animations en entrée et en sortie*/
effects effectsList[] =
{ "PA_SCROLL_UP",
"PA_SCROLL_DOWN",
"PA_SCROLL_LEFT",
"PA_SCROLL_RIGHT",
"PA_SPRITE",
"PA_SLICE",
"PA_MESH",
"PA_FADE",
"PA_DISSOLVE",
"PA_BLINDS",
"PA_RANDOM",
"PA_WIPE",
"PA_WIPE_CURSOR",
"PA_SCAN_HORIZ",
"PA_SCAN_HORIZX",
"PA_SCAN_VERT",
"PA_SCAN_VERTX",
"PA_OPENING",
"PA_OPENING_CURSOR",
"PA_CLOSING",
"PA_CLOSING_CURSOR",
"PA_SCROLL_UP_LEFT",
"PA_SCROLL_UP_RIGHT",
"PA_SCROLL_DOWN_LEFT",
"PA_SCROLL_DOWN_RIGHT",
"PA_GROW_UP",
"PA_GROW_DOWN",
"End of list"
};
void setup() {
// démarage des 2 matrices
Matrice_1.begin(); Matrice_2.begin();
// initialisation de la variable "i" (index) d'après
// la taille du tableau animList *** La fonction "ARRAY_SIZE()"
for (uint8_t i = 0; i < ARRAY_SIZE(animList); i++)
{ // initialise la vitesse et la pause de chaque élément contenu dans le tableau animList
animList[i].speed *= Matrice_1.getSpeed(); // vitesse
animList[i].pause *= 500; // durée de la pause multipliée pas 500ms.
}
}
void loop() {
// anime et renvoie vrai lorsqu'une animation est terminée
if (Matrice_2.displayAnimate() && Matrice_1.displayAnimate())
{
if (i == ARRAY_SIZE(animList))i = 0; // réinitialiser l'index de la boucle
// Affichage de la matrice 2
Matrice_2.displayText(effectsList[i].liste, // Texte à afficher
PA_CENTER, // Alignement
0, // Vitesse d'excution
1000, // Pause (durée d'affichage)
PA_NO_EFFECT, // Animation en entrée
PA_NO_EFFECT); // Animation en sortie
// Affichage de la matrice 1
Matrice_1.displayText(effectsList[i].liste, // Texte à afficher
animList[i].just, // Alignement
animList[i].speed, // Vitesse d'excution
animList[i].pause, // Pause (durée d'affichage)
animList[i].anim_in, // Animation en entrée
animList[i].anim_out);// Animation en sortie
delay(1000);
i++; // Configure l'effet de texte suivant
}
}