Visualisateur Temps Parole/Code Source
De Wiki d'activités IMA
// Nicolas Lefebvre
// Polytech Lille 2011
// Permet d'afficher sur une matrice de 9*9 sous matrice de 8*8 led le pourcentage de paroles de 2 personnes
//a decommenter pour le code pour 3 matrice inférieur, et commenter pour les 6 supérieures
//à mettro à 0 pour les 6 matrice et à 2 pour les 3
//#define __MATRICE3__ 0 //pour les 6
#define __MATRICE3__ 2 //pour les 3
//largeur et hauteur des caracteres
//enlever 1 à la valeur voulue (si 12-6 désiré, mettre 11-5)
#define HCHAR 11
#define LCHAR 6
//Define the "Normal" Colors
#define BLACK 0
#define RED 0xE0
#define GREEN 0x1C
#define BLUE 0x03
#define ORANGE RED|GREEN
#define MAGENTA RED|BLUE
#define TEAL BLUE|GREEN
#define WHITE (RED|GREEN|BLUE)-0xA0
#define COULEUR_FOND 0x03
//Define the SPI Pin Numbers
#define DATAOUT 11//MOSI
#define DATAIN 12//MISO
#define SPICLOCK 13//sck
#define SLAVESELECT 10//ss
//Pin des micros
#define ENTREE01 2
#define ENTREE02 3
//interrupteur de selection de mode
#define INT01 4
#define INT02 5
#define INT03 6
#define NOMBRE_ENTREES 2
//Matrice globale
#define MATRIX_WIDTH 24
#define MATRIX_HEIGHT 24
#define SUBMATRIX_WIDTH 8
#define SUBMATRIX_HEIGHT 8
//Define the variables we'll need later in the program
char frame_buffer [MATRIX_WIDTH][MATRIX_HEIGHT];
int parole1 = 1,parole1_prec = 1,pourc1=50,pourc1_prec=0;
int parole2 = 1,parole2_prec = 1,pourc2=50,pourc2_prec=0;
int parole3 = 1,parole3_prec = 1,pourc3=0,pourc3_prec=0;
int parole4 = 1,parole4_prec = 1,pourc4=0,pourc4_prec=0;
int someChar;
int modeselect=1,modeselect_prec=0;
int compteur=0;// permet d'eviter que les informations soient transmise en série à chaque boucle
int modif=0;//permet d'indiquer qu'il faut mettre à jour les données séries
int rayon1 = 2*MATRIX_WIDTH / NOMBRE_ENTREES;//utilise en temps que nombre de LED de la matrice globale
int rayon2 = 2*MATRIX_WIDTH / NOMBRE_ENTREES;
void setup()
{
Serial.begin(9600); // used for debug
//SPI Bus setup
SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);
SPSR = SPSR & B11111110;
// Set the pin modes for the RGB matrix
pinMode(SPICLOCK,OUTPUT);
pinMode(DATAOUT,OUTPUT);
pinMode(DATAIN,INPUT);
pinMode(SLAVESELECT,OUTPUT);
pinMode(ENTREE01,INPUT);
pinMode(ENTREE02,INPUT);
pinMode(INT01,INPUT);
pinMode(INT02,INPUT);
pinMode(INT03,INPUT);
// Make sure the RGB matrix is deactivated
digitalWrite(SPICLOCK,LOW);
digitalWrite(SLAVESELECT,HIGH);
delayMicroseconds(500); // delay as the LED Matrix datasheet's recommends
initialiseMatrice(frame_buffer,COULEUR_FOND);
displayMatrix(frame_buffer);
}
void loop()
{
#if (__MATRICE3__ ==0)
// Detection parole des micros
if (digitalRead (ENTREE01) == LOW){ //Micro 1
parole1=parole1+1;
modif=1;
}
if (digitalRead (ENTREE02) == LOW){ //Micro 2
parole2=parole2+1;
modif=1;
}
//bornage des compteurs
if ((parole1>200)||(parole2>200)){
parole1/=2;
parole2/=2;
}
// Mise à jour des pourcentage pour l'affichage
if((modif==1)&&(compteur>10)){
// Calcul du pourcentage
pourc1=(100*parole1)/(parole1+parole2);
if(pourc1==37) pourc1++;// permet de zapper 37 qui fait '%' en ASCII et deconfigure les matrices
pourc2=100-pourc1;
if(pourc2==37){
pourc2++;
pourc1=100-pourc2;
}
//Envoi en série
if(pourc1!=pourc1_prec){
Serial.print((char)251);
//pourc1_prec = pourc1;
Serial.print((char)pourc1);
}
if(pourc2!=pourc2_prec){
Serial.print((char)252);
//pourc2_prec = pourc2;
Serial.print((char)pourc2);
}
if(pourc3!=pourc3_prec){
Serial.print((char)253);
//pourc3_prec = pourc3;
Serial.print((char)pourc3);
}
if(pourc4!=pourc4_prec){
Serial.print((char)254);
//pourc4_prec = pourc4;
Serial.print((char)pourc4);
}
compteur=0;
}
#else
//reception série
//if(Serial.available() > 0){
char someChar = Serial.read();
if (someChar==(char)251){
//affichageNombre(frame_buffer,6,16, RED,1);
pourc1 = (char)Serial.read();
modif=1;
} else if (someChar==(char)252){
pourc2 = (char)Serial.read();
modif=1;
} else if (someChar==(char)253){
pourc3 = (char)Serial.read();
modif=1;
} else if (someChar==(char)254){
pourc4 = (char)Serial.read();
modif=1;
}
#endif
// changement de mode
if ((digitalRead (INT01) == HIGH)&&(modeselect!= 1)){
modeselect = 1;
} else if ((digitalRead (INT02) == HIGH)&&(modeselect!= 2)){
modeselect = 2;
} else if ((digitalRead (INT03) == HIGH)&&(modeselect!= 3)){
modeselect = 3;
}
if (modeselect!= modeselect_prec){ // si on change de mode on initialise les matrices
initialiseMatrice(frame_buffer,COULEUR_FOND);
modeselect_prec=modeselect;
compteur=11;
modif=1;
}
//affichage
if(modif==1){
switch (modeselect) {
case 1:
affichagePourcentage2();
break;
case 2:
cercles2();
break;
case 3:
carreAleatoire2();
break;
default:
affichagePourcentage2();
break;
}
displayMatrix(frame_buffer);
pourc1_prec=pourc1;
pourc2_prec=pourc2;
modif=0;
}
delay(10); // allow some time for the Serial data to be sent
compteur++;
}
//Use this command to send a single color value to the RGB matrix.
//NOTE: You must send 64 color values to the RGB matrix before it displays an image!
char spi_transfer(volatile char data)
{
SPDR = data; // Start the transmission
while (!(SPSR & (1<<SPIF))){}; // Wait for the end of the transmission
return SPDR; // return the received byte
}
void affichageParole1(){ // affichage du 1er compteur de parole sur la premiere ligne
affichageNombre(frame_buffer,0,0, GREEN,(parole1/100)%10);
affichageNombre(frame_buffer,8,0, GREEN,(parole1/10)%10);
affichageNombre(frame_buffer,16,0, GREEN,parole1%10);
}
//permet d'afficher une matrice du programme sur la matrice de led
void displayMatrix(char matrix[MATRIX_WIDTH][MATRIX_HEIGHT])
{
int index=0;
#if (__MATRICE3__ ==2)
int height = 8 / SUBMATRIX_HEIGHT; // 1
int width = 24 / SUBMATRIX_WIDTH; // 3
#else
int height = 16 / SUBMATRIX_HEIGHT; // 2
int width = 24 / SUBMATRIX_WIDTH; // 3
#endif
for(int i=height-1;i>=0;i--) // 0 a 0
for(int j=width-1;j>=0;j--){ // 3 a 0
digitalWrite(SLAVESELECT, LOW);
delayMicroseconds(500);
for(int k=0;k<SUBMATRIX_HEIGHT;k++)
for(int l=SUBMATRIX_WIDTH-1;l>=0;l--){
int y=(i+__MATRICE3__)*SUBMATRIX_HEIGHT+k;
int x=j*SUBMATRIX_WIDTH+l;
char color=matrix[x][y];
spi_transfer(color);
}
digitalWrite(SLAVESELECT, HIGH);
delayMicroseconds(10);
}
}
//afficha
void carreAleatoire2(){
int i,j;
if (pourc1>pourc1_prec){
do{
i=random(24);
j=random(24);
} while (frame_buffer[i][j]==RED);
frame_buffer[i][j]=RED;
} else if (pourc1<pourc1_prec){
do{
i=random(24);
j=random(24);
} while (frame_buffer[i][j]==GREEN);
frame_buffer[i][j]=GREEN;
}
}
//mode affichage arc de cercle
void cercles2(){
initialiseMatrice(frame_buffer,COULEUR_FOND);
rayon1=1.4*(MATRIX_WIDTH*pourc1)/100;
rayon2=1.4*(MATRIX_WIDTH*pourc2)/100;
for (int i=0;i<MATRIX_WIDTH;i++){
for (int j=0; j<MATRIX_HEIGHT; j++){
if(((i*i)+(j*j))<=((rayon1)*(rayon1))){
frame_buffer [i][j]=RED;
} else if((((23-i)*(23-i))+((23-j)*(23-j)))<=((rayon2)*(rayon2))){
frame_buffer [i][j]=GREEN;
}
}
}
}
//affichage des pourcentages
void affichagePourcentage2(){
if(pourc1!=pourc1_prec){
affichageNombre(frame_buffer,0,0, RED,(pourc1/10)%10);
affichageNombre(frame_buffer,8,0, RED,pourc1%10);
}
if(pourc2!=pourc2_prec){
affichageNombre(frame_buffer,8,12, GREEN,(pourc2/10)%10);
affichageNombre(frame_buffer,16,12, GREEN,pourc2%10);
}
}
void affichagePourcentage4(){
pourc1=100*parole1/(parole1+parole2+parole3+parole4);
pourc2=100*parole2/(parole1+parole2+parole3+parole4);
pourc3=100*parole3/(parole1+parole2+parole3+parole4);
pourc4=100*parole4/(parole1+parole2+parole3+parole4);
if(pourc1!=pourc1_prec){
affichageNombre(frame_buffer,0,0, RED,pourc1/10);
affichageNombre(frame_buffer,6,0, RED,pourc1%10);
pourc1_prec=pourc1;
}
if(pourc2!=pourc2_prec){
affichageNombre(frame_buffer,12,0, GREEN,pourc2/10);
affichageNombre(frame_buffer,18,0, GREEN,pourc2%10);
pourc2_prec=pourc2;
}
if(pourc3!=pourc3_prec){
affichageNombre(frame_buffer,0,12, ORANGE,pourc3/10);
affichageNombre(frame_buffer,6,12, ORANGE,pourc3%10);
pourc3_prec=pourc3;
}
if(pourc4!=pourc4_prec){
affichageNombre(frame_buffer,12,12, TEAL,pourc4/10);
affichageNombre(frame_buffer,18,12, TEAL,pourc4%10);
pourc4_prec=pourc4;
}
}
void initialiseMatrice(char matrix[MATRIX_WIDTH][MATRIX_HEIGHT],int couleur){
for (int i=0;i<MATRIX_WIDTH;i++){
for (int j=0; j<MATRIX_HEIGHT; j++){
matrix[i][j]=couleur;
}
}
}
//permet d'ecrire un nombre (pour affichage) à des coordonnées précisées dans une matrice
void affichageNombre(char matrix[MATRIX_WIDTH][MATRIX_HEIGHT],int x,int y,int couleur,int nombre){
for (int i=x;i<x+LCHAR+1;i++){
for (int j=y; j<y+HCHAR+1; j++){
matrix[i][j]=COULEUR_FOND;
}
}
switch (nombre) {
case 1:
un(frame_buffer,x,y,couleur);
break;
case 2:
deux(frame_buffer,x,y,couleur);
break;
case 3:
trois(frame_buffer,x,y,couleur);
break;
case 4:
quatre(frame_buffer,x,y,couleur);
break;
case 5:
cinq(frame_buffer,x,y,couleur);
break;
case 6:
six(frame_buffer,x,y,couleur);
break;
case 7:
sept(frame_buffer,x,y,couleur);
break;
case 8:
huit(frame_buffer,x,y,couleur);
break;
case 9:
neuf(frame_buffer,x,y,couleur);
break;
case 0:
zero(frame_buffer,x,y,couleur);
break;
default:
erreur(frame_buffer,x,y,couleur);
break;
}
}
//permet de dessiner une ligne
void ligne(char matrix[MATRIX_WIDTH][MATRIX_HEIGHT],int x1,int y1, int x2, int y2,int couleur){
int i=0;
if(x1==x2){
for(i=y1;i<y2;i++){
matrix[x1][i]=couleur;
}
} else if (y1==y2){
for(i=x1;i<x2;i++){
matrix[i][y1]=couleur;
}
}
}
void erreur(char matrix[MATRIX_WIDTH][MATRIX_HEIGHT],int x,int y,int couleur){
a(frame_buffer,x,y,couleur);
d(frame_buffer,x,y,couleur);
g(frame_buffer,x,y,couleur);
}
void un(char matrix[MATRIX_WIDTH][MATRIX_HEIGHT],int x,int y,int couleur){
b(frame_buffer,x,y,couleur);
c(frame_buffer,x,y,couleur);
}
void deux(char matrix[MATRIX_WIDTH][MATRIX_HEIGHT],int x,int y,int couleur){
a(frame_buffer,x,y,couleur);
b(frame_buffer,x,y,couleur);
d(frame_buffer,x,y,couleur);
e(frame_buffer,x,y,couleur);
g(frame_buffer,x,y,couleur);
}
void trois(char matrix[MATRIX_WIDTH][MATRIX_HEIGHT],int x,int y,int couleur){
a(frame_buffer,x,y,couleur);
b(frame_buffer,x,y,couleur);
c(frame_buffer,x,y,couleur);
d(frame_buffer,x,y,couleur);
g(frame_buffer,x,y,couleur);
}
void quatre(char matrix[MATRIX_WIDTH][MATRIX_HEIGHT],int x,int y,int couleur){
b(frame_buffer,x,y,couleur);
c(frame_buffer,x,y,couleur);
f(frame_buffer,x,y,couleur);
g(frame_buffer,x,y,couleur);
}
void cinq(char matrix[MATRIX_WIDTH][MATRIX_HEIGHT],int x,int y,int couleur){
a(frame_buffer,x,y,couleur);
c(frame_buffer,x,y,couleur);
d(frame_buffer,x,y,couleur);
f(frame_buffer,x,y,couleur);
g(frame_buffer,x,y,couleur);
}
void six(char matrix[MATRIX_WIDTH][MATRIX_HEIGHT],int x,int y,int couleur){
a(frame_buffer,x,y,couleur);
c(frame_buffer,x,y,couleur);
d(frame_buffer,x,y,couleur);
e(frame_buffer,x,y,couleur);
f(frame_buffer,x,y,couleur);
g(frame_buffer,x,y,couleur);
}
void sept(char matrix[MATRIX_WIDTH][MATRIX_HEIGHT],int x,int y,int couleur){
a(frame_buffer,x,y,couleur);
b(frame_buffer,x,y,couleur);
c(frame_buffer,x,y,couleur);
}
void huit(char matrix[MATRIX_WIDTH][MATRIX_HEIGHT],int x,int y,int couleur){
a(frame_buffer,x,y,couleur);
b(frame_buffer,x,y,couleur);
c(frame_buffer,x,y,couleur);
d(frame_buffer,x,y,couleur);
e(frame_buffer,x,y,couleur);
f(frame_buffer,x,y,couleur);
g(frame_buffer,x,y,couleur);
}
void neuf(char matrix[MATRIX_WIDTH][MATRIX_HEIGHT],int x,int y,int couleur){
a(frame_buffer,x,y,couleur);
b(frame_buffer,x,y,couleur);
c(frame_buffer,x,y,couleur);
d(frame_buffer,x,y,couleur);
f(frame_buffer,x,y,couleur);
g(frame_buffer,x,y,couleur);
}
void zero(char matrix[MATRIX_WIDTH][MATRIX_HEIGHT],int x,int y,int couleur){
a(frame_buffer,x,y,couleur);
b(frame_buffer,x,y,couleur);
c(frame_buffer,x,y,couleur);
d(frame_buffer,x,y,couleur);
e(frame_buffer,x,y,couleur);
f(frame_buffer,x,y,couleur);
}
//barres des systèmes d'affichage 7 segments
void a(char matrix[MATRIX_WIDTH][MATRIX_HEIGHT],int x,int y,int couleur){
ligne(matrix,x,y,x+LCHAR+1,y,couleur);//haut
}
void b(char matrix[MATRIX_WIDTH][MATRIX_HEIGHT],int x,int y,int couleur){
ligne(matrix,x+LCHAR,y,x+LCHAR,y+(HCHAR/2),couleur);//haut
}
void c(char matrix[MATRIX_WIDTH][MATRIX_HEIGHT],int x,int y,int couleur){
ligne(matrix,x+LCHAR,y+(HCHAR/2),x+LCHAR,y+HCHAR+1,couleur);//haut
}
void d(char matrix[MATRIX_WIDTH][MATRIX_HEIGHT],int x,int y,int couleur){
ligne(matrix,x,y+HCHAR,x+LCHAR+1,y+HCHAR,couleur);//haut
}
void e(char matrix[MATRIX_WIDTH][MATRIX_HEIGHT],int x,int y,int couleur){
ligne(matrix,x,y+(HCHAR/2),x,y+HCHAR+1,couleur);//haut
}
void f(char matrix[MATRIX_WIDTH][MATRIX_HEIGHT],int x,int y,int couleur){
ligne(matrix,x,y,x,y+(HCHAR/2),couleur);//haut
}
void g(char matrix[MATRIX_WIDTH][MATRIX_HEIGHT],int x,int y,int couleur){
ligne(matrix,x,y+(HCHAR/2),x+LCHAR+1,y+(HCHAR/2),couleur);//haut
}