// octobre 2017 - Serge Pintout // afficheur 4x7+1, segments à anodes communes // // BIBLIOTHÈQUES // DÉCLARATIONS // AFFICHEUR // pour allumer un segment il faut positionner l'anode commune de l'afficheur à 1 et la cathode du segment à 0. // une résistance de 330 ohms est insérée entre la broche de l'arduino et le segment pour une limitation du courant à 10ma. const byte SEG[8] = {4,2,5,9,8,7,3,18}; // déclare un tableau de 8 constantes de broches segments (A,B,C,D,E,F,G,"dp") les poids forts sont à droite const byte AFF[4] = {16,11,10,19}; // déclare un tableau de 4 constantes des broches afficheurs 18,19,10,11 // --- tableau des segments traduis en valeurs numériques --- const byte CODEG[3] = {0,32,34}; // const byte CODED[3] = {0,16,20}; // DIVERS const byte CCOMA = 6 ; // cathode du "deux points" const byte ACOMA = 12; // anode du "deux points" bool coma = 1; volatile byte MOT[4] = {0,0,0,0}; int cpt = 0; const byte voyant = 13; //################################################################################################################# // FONCTION D'AFFICHAGE void affichageG(byte mot[4]) { for (byte af = 0; af <= 3; af++) { // balayage des 4 afficheurs digitalWrite(AFF[af],1); // activation des afficheurs à leur tour for (byte sg = 0; sg <= 7; sg++) { // balayage des 7 segments // "mot" contient les 4 caractères à afficher. On récupère dans CODE la séquence des segments à afficher // attention les bits sont inversés, c'est un 0 qui allume le segment digitalWrite(SEG[sg],!bitRead(CODEG[mot[af]],sg)); // Voilà, tout le secret est ici ! } delayMicroseconds(2380); // ~2,5ms par digit (caller sur la 1") digitalWrite(AFF[af],0); // l'afficheur en cours est éteint } } void affichageD(byte mot[4]) { for (byte af = 0; af <= 3; af++) { // balayage des 4 afficheurs digitalWrite(AFF[af],1); // activation des afficheurs à leur tour for (byte sg = 0; sg <= 7; sg++) { // balayage des 7 segments // "mot" contient les 4 caractères à afficher. On récupère dans CODE la séquence des segments à afficher // attention les bits sont inversés, c'est un 0 qui allume le segment digitalWrite(SEG[sg],!bitRead(CODED[mot[af]],sg)); // Voilà, tout le secret est ici ! } delayMicroseconds(2380); // ~2,5ms par digit (caller sur la 1") digitalWrite(AFF[af],0); // l'afficheur en cours est éteint } } //################################################################################################################# // INITIALISATION void setup() { Serial.begin(115200); // ------- Broches en sortie ------- // met les 8 broches des segments en sortie à 1 (éteint) for (int i=0; i<8; i++) { // boucle de défilement des 8 broches pinMode(SEG[i], OUTPUT); //met la broche en sortie digitalWrite(SEG[i],1); } // met les 4 broches des afficheurs en sortie à 0 (éteint) for (int i=0; i<4; i++) { // boucle de défilement des 8 broches pinMode(AFF[i], OUTPUT); //met la broche en sortie digitalWrite(AFF[i],0); } //pinMode(CCOMA, OUTPUT); //digitalWrite(CCOMA, 0); //pinMode(ACOMA, OUTPUT); //digitalWrite(ACOMA, coma); // TEST DE L'AFFICHEUR for (byte af=0; af<=3; af++) { // balayage des 4 afficheurs digitalWrite(AFF[af],1); // activation des afficheurs à leur tour for (byte sg=0; sg<=7; sg++) { // balayage des 7 segments digitalWrite(SEG[sg],0); // attention les bits sont inversés, c'est un 0 qui allume le segment delay(100); digitalWrite(SEG[sg],1); // } delay(100); // 100ms entre chaque digit digitalWrite(AFF[af],0); // l'afficheur en cours est éteint } digitalWrite(voyant, 1); } //################################################################################################################# // PROGRAMME PRINCIPAL void loop() { int vac = 0; int vas = 0 ; // boucle principale for (int phase=0; phase<360; phase=phase+15) { for (int a=0; a<360; a=a+8) { vac=(cos(a*PI/180)+1)*4; vas=(cos((a+phase)%360*PI/180)+1)*4; switch (vac) { case 8 : MOT[3]=2;MOT[2]=2;MOT[1]=2;MOT[0]=2; break ; case 7 : MOT[3]=1;MOT[2]=2;MOT[1]=2;MOT[0]=2; break ; case 6 : MOT[3]=0;MOT[2]=2;MOT[1]=2;MOT[0]=2; break ; case 5 : MOT[3]=0;MOT[2]=1;MOT[1]=2;MOT[0]=2; break ; case 4 : MOT[3]=0;MOT[2]=0;MOT[1]=2;MOT[0]=2; break ; case 3 : MOT[3]=0;MOT[2]=0;MOT[1]=1;MOT[0]=2; break ; case 2 : MOT[3]=0;MOT[2]=0;MOT[1]=0;MOT[0]=2; break ; case 1 : MOT[3]=0;MOT[2]=0;MOT[1]=0;MOT[0]=1; break ; default :MOT[3]=0;MOT[2]=0;MOT[1]=0;MOT[0]=0; break ; } affichageG(MOT); switch (vas) { case 8 : MOT[3]=2;MOT[2]=2;MOT[1]=2;MOT[0]=2; break ; case 7 : MOT[3]=1;MOT[2]=2;MOT[1]=2;MOT[0]=2; break ; case 6 : MOT[3]=0;MOT[2]=2;MOT[1]=2;MOT[0]=2; break ; case 5 : MOT[3]=0;MOT[2]=1;MOT[1]=2;MOT[0]=2; break ; case 4 : MOT[3]=0;MOT[2]=0;MOT[1]=2;MOT[0]=2; break ; case 3 : MOT[3]=0;MOT[2]=0;MOT[1]=1;MOT[0]=2; break ; case 2 : MOT[3]=0;MOT[2]=0;MOT[1]=0;MOT[0]=2; break ; case 1 : MOT[3]=0;MOT[2]=0;MOT[1]=0;MOT[0]=1; break ; default :MOT[3]=0;MOT[2]=0;MOT[1]=0;MOT[0]=0; break ; } affichageD(MOT); // appel de la fonction d'affichage avec passage du paramètre MOT à afficher } } }