Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Programme de l'afficheur géant d'Experimentboy
- // Vidéo --> http://youtu.be/pH1GlNIYR24
- //Indice = digit, sous indice = n° du bit
- //Premier digit (indice 0) = droite
- //Premier bit (sous-indice 0) = poids FAIBLE
- byte digit[]={14,15,16,17}; //4 pins de l'écriture des 4 bits des décodeurs (en parallèle)
- byte latch[] = {10,9,8,7,6,5}; // 6 pins des latch des décodeurs
- int nombre[] = {0,0,0,0,0,0}; //nombres à afficher en façade
- volatile unsigned long t0, t1, tv0, tv1;
- long trest1, trest2, tecoul, tadd1, tadd2, tfin1, tfin2; //tadd1 et 2 sont les temps à ajouter
- unsigned long intervalle;
- volatile bool trigged1 = false, trigged2 = false;
- bool termine; //parametre de fin
- bool ptiml; //parametre de modification du temps en mode timelapse
- bool again = false; // si appui sur OK au lieu de retour a la fin, recommence avec les mêmes reglages
- bool timlphase = false; //false pour mode OFF, true pour ON
- bool timlchg = false; // passage a true lors d'un changement de mode du cycle (timelapse)
- int tempo = 80; //vitesse de defilement des valeurs en reglage
- byte antirebond = 60;
- byte vmode = 1, vsmode = 1, vunit = 0, reg = 0; //types de reglages
- const byte cpt = 1, dcpt = 2, vit = 3, timl = 4; //types de mode
- const byte tps = 1, nb = 2, itrv = 3, svit = 4; // types de sous-mode
- const byte aucune = 0, hms = 1, msc = 2, ms = 3, mps = 4, kmh = 5, cm = 6; //types d'unite
- unsigned int dist = 100, rnbmax = 0; // variables pour le reglage de la distance et du nb de passages max (final)
- unsigned int rnb = 0; //variable compteur de passages courant
- float rvitesse = 0; // variable pour le resultat de la vitesse ou de l'intervalle
- int rtemps1[3] = {0,0,0}; //listes contenant HH,MM,SS ou MM,SS,dc pour cpt, dcpt, timelapse OFF
- int atemps1[3] = {0,0,0}; //liste contenant le temps rtemps1 mais modifiee pour l'affichage
- int rtemps12[3] = {0,0,0}; // liste contenant HH,MM,SS ou MM,SS,dc le temps pour timelapse ON
- int atemps12[3] = {0,0,0};
- int rtemps2[2] = {0,0}; // liste contenant SSS,ms pour cpt, dcpt, timelapse OFF
- int atemps2[2] = {0,0};
- int rtemps22[2] = {0,0};// liste contenant SSS,ms pour timelapse ON
- int atemps22[2] = {0,0};
- //Sorties
- const byte dpt0 = 30, dpt1 = 31, pt0 = 34, pt1 = 35, pt2 = 36, rgb_r = 40, rgb_g = 41, rgb_b0 = 42, rgb_b1 = 43, SIG = 50;
- byte pin_out[] = {dpt0, dpt1, pt0, pt1, pt2, rgb_r, rgb_g, rgb_b0, rgb_b1, SIG};
- //Entrees
- const byte haut = 22, bas = 23, gauche = 24, droite = 25, retour = 26, ok = 27, TR1 = 2, TR2 = 3, PAUSE = 18, RESET = 19;
- byte pin_in[] = {haut, bas, gauche, droite, retour, ok, TR1, TR2, PAUSE, RESET};
- #include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
- void setup()
- {
- interrupts();
- attachInterrupt(0,trigger1,RISING);
- attachInterrupt(1,trigger2,RISING);
- attachInterrupt(5,pause,RISING);
- lcd.begin(20,4);
- lcd.blink();
- //Serial.begin(115200);
- for(byte b = 0; b<6; b++)
- {
- pinMode(latch[b], OUTPUT); digitalWrite(latch[b],0); // sorties latch
- }
- for(byte a = 0; a < 4; a++)
- pinMode(digit[a],OUTPUT); //Sorties bits
- for(byte a = 0; a<10; a++)
- pinMode(pin_out[a],OUTPUT); //sorties pins autres
- digitalWrite(SIG,0);
- for(byte a = 0; a<10; a++)
- pinMode(pin_in[a],INPUT); //entrees
- reset_digits();
- if(digitalRead(retour)) test();
- digitalWrite(rgb_r,1);
- }
- void test()
- {
- //TESTE TOUT AU DEMARRAGE SI APPUI RETOUR
- lcd.print("Test...");
- for(byte n = 0; n < 10; n++)
- {
- for(byte i = 0; i<6; i++)
- nombre[i] = n;
- affiche_digits();
- delay(400);
- }
- for(byte i = 0; i<6; i++)
- nombre[i] = 0;
- affiche_digits();
- delay(400);
- for(byte n = 0; n < 10; n++)
- {
- digitalWrite(pin_out[n],1);
- delay(400);
- digitalWrite(pin_out[n],0);
- }
- //Easter Egg trop swag
- nombre[0] = 2;
- nombre[1] = 4;
- for(byte n = 2; n<6; n++)
- nombre[n] = 10;
- affiche_digits();
- lcd.clear();
- lcd.print("Test fini !");
- lcd.setCursor(0,2); lcd.print("Experimentboy");
- delay(2000);
- for(byte i = 0; i<6; i++)
- nombre[i] = 0;
- affiche_digits();
- }
- void menu()
- {
- // Affiche les reglages du menu
- lcd.clear();
- lcd.print(" -TIMER-");
- lcd.setCursor(0,1); lcd.print("Mode:");
- lcd.setCursor(17,3); lcd.print(">OK");
- lcd.setCursor(4,1);
- }
- void mode()
- {
- affiche_mode();
- if (again) return;
- while(!digitalRead(ok))
- {
- if(digitalRead(droite))
- {
- if(vmode == timl)
- vmode = cpt;
- else vmode ++;
- affiche_mode();
- while(digitalRead(droite)) {}
- delay(antirebond);
- }
- else if (digitalRead(gauche))
- {
- if(vmode == cpt)
- vmode = timl;
- else vmode --;
- affiche_mode();
- while(digitalRead(gauche)) {}
- delay(antirebond);
- }
- }
- }
- void affiche_mode()
- {
- lcd.setCursor(5,1);
- switch (vmode)
- {
- case cpt:
- lcd.print("CPT ");
- break;
- case dcpt:
- lcd.print("DCPT");
- break;
- case vit:
- lcd.print("VIT ");
- break;
- case timl:
- lcd.print("CYCL");
- break;
- default:
- lcd.print("ERR");
- }
- lcd.setCursor(4,1);
- }
- void smode()
- {
- if(again)
- {
- affiche_smode();
- return;
- }
- if(vmode == vit) vsmode = svit;
- else if (vmode == cpt || vmode == dcpt) vsmode = tps;
- // EN TIMELAPSE, LE SMODE EST DEFINI SUR TPS PAR DEFAUT
- else if (vmode == timl)
- {
- vsmode = tps;
- return;
- }
- lcd.setCursor(10,1); lcd.print("|");
- affiche_smode();
- while(digitalRead(ok)) {}
- delay(antirebond);
- while(!digitalRead(ok))
- {
- switch(vmode)
- {
- case cpt:
- if(digitalRead(droite) || digitalRead(gauche))
- {
- if(vsmode == tps) vsmode = nb; // changement du sous-mode entre Temps et Nombre de passage
- else vsmode = tps;
- affiche_smode();
- while(digitalRead(droite) || digitalRead(gauche)) {}
- delay(antirebond);
- }
- break;
- case dcpt:
- if(digitalRead(droite) || digitalRead(gauche))
- {
- if(vsmode == tps) vsmode = nb; // changement du sous-mode entre Temps et Nombre de passage
- else vsmode = tps;
- affiche_smode();
- while(digitalRead(droite) || digitalRead(gauche)) {}
- delay(antirebond);
- }
- break;
- case vit:
- if(digitalRead(droite) || digitalRead(gauche))
- {
- if(vsmode == itrv) vsmode = svit; // changement du sous-mode entre intervalle et vitesse
- else vsmode = itrv;
- affiche_smode();
- while(digitalRead(droite) || digitalRead(gauche)) {}
- delay(antirebond);
- }
- break;
- case timl:
- break;
- }
- }
- }
- void affiche_smode()
- {
- lcd.setCursor(11,1);
- switch (vsmode)
- {
- case tps:
- lcd.print("Temps ");
- break;
- case nb:
- lcd.print("Passage");
- break;
- case itrv:
- lcd.print("Intrvl ");
- break;
- case svit:
- lcd.print("Vitesse");
- break;
- default:
- lcd.print("ERR");
- }
- lcd.setCursor(10,1);
- }
- void unite()
- {
- if(vsmode == nb || vsmode == itrv)
- {
- vunit = aucune;
- return;
- }
- if(again)
- {
- affiche_unit();
- return;
- }
- else if(vsmode == tps) vunit = msc;
- else if(vsmode == svit) vunit = mps;
- affiche_unit();
- while(digitalRead(ok)) {};
- delay(antirebond);
- while(!digitalRead(ok))
- {
- switch(vsmode)
- {
- case tps:
- if(digitalRead(droite))
- {
- if(vunit == ms) vunit = hms; // changement unite de temps
- else vunit++;
- affiche_unit();
- while(digitalRead(droite)) {}
- delay(antirebond);
- }
- else if(digitalRead(gauche))
- {
- if(vunit == hms) vunit = ms;
- else vunit --;
- affiche_unit();
- while(digitalRead(gauche)) {};
- delay(antirebond);
- }
- break;
- case svit:
- if(digitalRead(droite) || digitalRead(gauche))
- {
- if(vunit == kmh) vunit = mps; // changement unite km/h ou m/s
- else vunit = kmh;
- affiche_unit();
- while(digitalRead(droite) || digitalRead(gauche)) {}
- delay(antirebond);
- }
- break;
- }
- }
- }
- void affiche_unit()
- {
- lcd.setCursor(0,2);
- affiche_points();
- lcd.print("Unit:");
- switch (vunit)
- {
- case hms:
- lcd.print("HH:MM:SS");
- break;
- case msc:
- lcd.print("MM:SS.dc");
- break;
- case ms:
- lcd.print("SSS.dcm ");
- break;
- case mps:
- lcd.print("m/s ");
- break;
- case kmh:
- lcd.print("km/h");
- break;
- case aucune:
- break;
- default:
- lcd.print("ERR");
- break;
- }
- lcd.setCursor(4,2);
- }
- void reglage()
- {
- if(vmode == vit && vsmode == itrv)
- {
- return;
- }
- //pre affichage selon le sous mode ou l'unite, evite de l'ecrire a chaque passage d'affiche_reglage()
- lcd.setCursor(0,2);
- if(vsmode == svit) lcd.print("D= ");
- else if(vsmode == tps && vmode == timl)
- {
- lcd.print("OFF :");
- lcd.setCursor(0,3);
- lcd.print("ON :");
- lcd.setCursor(5,2);
- }
- else lcd.print("Set :");
- if(again)
- {
- affiche_reglage();
- return;
- }
- ptiml = false;
- affiche_points();
- affiche_reglage();
- while(digitalRead(ok)) {}
- delay(antirebond);
- while(!digitalRead(ok))
- {
- if(vunit == hms || vunit == msc)
- {
- if(digitalRead(haut))
- {
- rtemps1[reg]++;
- //Verification du depassement en fonction de l'unite et de la valeur
- if(vunit == hms)
- {
- if(reg == 0) rtemps1[reg] %= 100; // heures
- else rtemps1[reg] %= 60; // minutes secondes
- }
- else
- {
- if(reg == 1) rtemps1[reg] %= 60; //secondes
- else rtemps1[reg] %= 100; // minutes et centiemes
- }
- affiche_reglage();
- delay(tempo); //En restant appuye, defilement
- }
- else if(digitalRead(bas))
- {
- rtemps1[reg]--;
- //Verification du depassement en fonction de l'unite et de la valeur
- if(vunit == hms)
- {
- if(reg == 0 && rtemps1[reg] < 0) rtemps1[reg] = 99;
- else if ((reg == 2 || reg == 1 ) && rtemps1[reg] < 0) rtemps1[reg] = 59; // heures en modulo 100
- }
- else
- {
- if(reg == 1 && rtemps1[reg] < 0) rtemps1[reg] = 59; //minutes et
- else if ((reg == 0 || reg == 2) && rtemps1[reg] < 0) rtemps1[reg] = 99;
- }
- affiche_reglage();
- delay(tempo); //En restant appuye, defilement
- }
- if (digitalRead(droite))
- {
- if (reg == 2) reg = 0;
- else reg++;
- affiche_reglage();
- while(digitalRead(droite)){}
- delay(antirebond);
- }
- else if (digitalRead(gauche))
- {
- if (reg == 0) reg = 2;
- else reg--;
- affiche_reglage();
- while(digitalRead(gauche)){}
- delay(antirebond);
- }
- }
- else if(vunit == ms)
- {
- //cas de l'unite de temps ms
- if(digitalRead(haut))
- {
- rtemps2[reg]++;
- //Verification du depassement
- rtemps2[reg] %= 1000;
- affiche_reglage();
- delay(tempo); //En restant appuye, defilement
- }
- else if(digitalRead(bas))
- {
- rtemps2[reg]--;
- //Verification du depassement en fonction de l'unite et de la valeur
- if(rtemps2[reg] < 0) rtemps2[reg] = 999;
- affiche_reglage();
- delay(tempo); //En restant appuye, defilement
- }
- if (digitalRead(droite) || digitalRead(gauche))
- {
- if (reg == 0) reg = 1;
- else reg = 0;
- affiche_reglage();
- while(digitalRead(droite) || digitalRead(gauche)){}
- delay(antirebond);
- }
- }
- else if(vunit == aucune)
- {
- if(digitalRead(haut))
- {
- rnbmax++;
- affiche_reglage();
- delay(tempo); //En restant appuye, defilement
- }
- else if(digitalRead(bas))
- {
- //if(rnbmax > 0 )
- rnbmax--;
- affiche_reglage();
- delay(tempo); //En restant appuye, defilement
- }
- }
- else if (vunit == kmh || vunit == mps)
- {
- if(digitalRead(haut))
- {
- dist++;
- affiche_reglage();
- delay(tempo); //En restant appuye, defilement
- }
- else if(digitalRead(bas))
- {
- if(dist > 0) dist--;
- affiche_reglage();
- delay(tempo); //En restant appuye, defilement
- }
- }
- }
- //egalisation des listes parametres et listes affichages
- for(byte n = 0; n<3; n++)
- atemps1[n] = rtemps1[n];
- for(byte n = 0; n<2; n++)
- atemps2[n] = rtemps2[n];
- //Deuxieme reglage si mode timelapse
- if(vmode == timl)
- {
- ptiml = true;
- reg=0;
- affiche_reglage();
- while(digitalRead(ok)) {}
- delay(antirebond);
- while(!digitalRead(ok))
- {
- if(vunit == hms || vunit == msc)
- {
- if(digitalRead(haut))
- {
- rtemps12[reg]++;
- //Verification du depassement en fonction de l'unite et de la valeur
- if(vunit == hms)
- {
- if(reg == 0) rtemps12[reg] %= 100; // heures
- else rtemps12[reg] %= 60; // minutes secondes
- }
- else
- {
- if(reg == 1) rtemps12[reg] %= 60; //secondes
- else rtemps12[reg] %= 100; // minutes et centiemes
- }
- affiche_reglage();
- delay(tempo); //En restant appuye, defilement
- }
- else if(digitalRead(bas))
- {
- rtemps12[reg]--;
- //Verification du depassement en fonction de l'unite et de la valeur
- if(vunit == hms)
- {
- if(reg == 0 && rtemps12[reg] < 0) rtemps12[reg] = 99;
- else if ((reg == 2 || reg == 1 ) && rtemps12[reg] < 0) rtemps12[reg] = 59; // heures en modulo 100
- }
- else
- {
- if(reg == 1 && rtemps12[reg] < 0) rtemps12[reg] = 59; //minutes et
- else if ((reg == 0 || reg == 2) && rtemps12[reg] < 0) rtemps12[reg] = 99;
- }
- affiche_reglage();
- delay(tempo); //En restant appuye, defilement
- }
- if (digitalRead(droite))
- {
- if (reg == 2) reg = 0;
- else reg++;
- affiche_reglage();
- while(digitalRead(droite)){}
- delay(antirebond);
- }
- else if (digitalRead(gauche))
- {
- if (reg == 0) reg = 2;
- else reg--;
- affiche_reglage();
- while(digitalRead(gauche)){}
- delay(antirebond);
- }
- }
- else if(vunit == ms)
- {
- //cas de l'unite de temps ms
- if(digitalRead(haut))
- {
- rtemps22[reg]++;
- //Verification du depassement
- rtemps22[reg] %= 1000;
- affiche_reglage();
- delay(tempo); //En restant appuye, defilement
- }
- else if(digitalRead(bas))
- {
- rtemps22[reg]--;
- //Verification du depassement en fonction de l'unite et de la valeur
- if(rtemps22[reg] < 0) rtemps22[reg] = 999;
- affiche_reglage();
- delay(tempo); //En restant appuye, defilement
- }
- if (digitalRead(droite) || digitalRead(gauche))
- {
- if (reg == 0) reg = 1;
- else reg = 0;
- affiche_reglage();
- while(digitalRead(droite) || digitalRead(gauche)){}
- delay(antirebond);
- }
- }
- }
- //egalisation des listes reglage et affichage
- for(byte n = 0; n<3; n++)
- atemps12[n] = rtemps12[n];
- for(byte n = 0; n<2; n++)
- atemps22[n] = rtemps22[n];
- }
- }
- void affiche_reglage()
- {
- if(!ptiml)
- {
- lcd.setCursor(5,2);
- if(vunit == hms || vunit == msc)
- {
- if(rtemps1[0] < 10) lcd.print("0"); lcd.print(rtemps1[0]); lcd.print(":");
- if(rtemps1[1] < 10) lcd.print("0"); lcd.print(rtemps1[1]);
- if(vunit == hms)
- lcd.print(":");
- else
- lcd.print(".");
- if(rtemps1[2] < 10) lcd.print("0"); lcd.print(rtemps1[2]);
- lcd.setCursor(reg*3+4,2); //placement du curseur en fonction du parametre courant
- if(vmode == dcpt || vmode == timl)
- {
- nombre[0] = rtemps1[2] % 10;
- nombre[1] = rtemps1[2] / 10;
- nombre[2] = rtemps1[1] % 10;
- nombre[3] = rtemps1[1] / 10;
- nombre[4] = rtemps1[0] % 10;
- nombre[5] = rtemps1[0] / 10;
- affiche_digits();
- }
- }
- else if(vunit == ms)
- {
- if(rtemps2[0] < 100) lcd.print("0"); if(rtemps2[0] < 10) lcd.print("0"); lcd.print(rtemps2[0]);
- lcd.print(".");
- if(rtemps2[1] < 100) lcd.print("0"); if(rtemps2[1] < 10) lcd.print("0"); lcd.print(rtemps2[1]);
- lcd.print("s");
- lcd.setCursor(reg*4+4,2);
- if(vmode == dcpt || vmode == timl)
- {
- nombre[0] = rtemps2[1] % 10;
- nombre[1] = (rtemps2[1] % 100) / 10;
- nombre[2] = rtemps2[1] / 100;
- nombre[3] = rtemps2[0] % 10;
- nombre[4] = (rtemps2[0] % 100) / 10;
- nombre[5] = rtemps2[0] / 100;
- affiche_digits();
- }
- }
- else if (vunit == aucune)
- {
- lcd.print(rnbmax); lcd.print(" fois ");
- lcd.setCursor(4,2);
- if(vmode == dcpt || vmode == timl)
- {
- nombre[5] = 0;
- nombre[4] = rnbmax / 10000;
- nombre[3] = (rnbmax / 1000) %10;
- nombre[2] = (rnbmax / 100) %10;
- nombre[1] = (rnbmax / 10) %10;
- nombre[0] = rnbmax %10;
- affiche_digits();
- }
- }
- else if (vunit == kmh || vunit == mps)
- {
- lcd.setCursor(2,2);
- lcd.print(dist); lcd.print("cm ");
- lcd.setCursor(1,2);
- }
- }
- //DEUXIEME REGLAGE TIMELAPSE
- else
- {
- lcd.setCursor(5,3);
- //deuxieme reglage timelapse
- if(vunit == hms || vunit == msc)
- {
- if(rtemps12[0] < 10) lcd.print("0"); lcd.print(rtemps12[0]); lcd.print(":");
- if(rtemps12[1] < 10) lcd.print("0"); lcd.print(rtemps12[1]);
- if(vunit == hms)
- {
- lcd.print(":");
- // CODE EVENTUEL POUR AFFICHER AUSSI LES POINTS SUR LE PANNEAU
- }
- else
- {
- lcd.print(".");
- // CODE EVENTUEL POUR AFFICHER AUSSI LES POINTS SUR LE PANNEAU
- }
- if(rtemps12[2] < 10) lcd.print("0"); lcd.print(rtemps12[2]);
- lcd.setCursor(reg*3+4,3); //placement du curseur en fonction du parametre courant
- }
- else if(vunit == ms)
- {
- if(rtemps22[0] < 100) lcd.print("0"); if(rtemps22[0] < 10) lcd.print("0"); lcd.print(rtemps22[0]);
- lcd.print(".");
- if(rtemps22[1] < 100) lcd.print("0"); if(rtemps22[1] < 10) lcd.print("0"); lcd.print(rtemps22[1]);
- lcd.print("s");
- lcd.setCursor(reg*4+4,3);
- affiche_digits();
- }
- }
- }
- void stb_ok()
- {
- while(digitalRead(ok)) {}
- delay(antirebond*3);
- lcd.setCursor(17,3);
- while(!digitalRead(ok)) {}
- }
- void stb()
- {
- lcd.setCursor(14,3); lcd.print(">READY"); lcd.setCursor(14,3);
- trigged1 = false;
- trigged2 = false;
- if(vsmode == tps)
- {
- switch (vunit)
- {
- //Calcul du temps a ajouter a millis() au moment du trigger, pour aller plus vite
- case hms:
- tadd1 = 3600000 * (long)rtemps1[0] + 60000*(long)rtemps1[1] + 1000*(long)rtemps1[2];
- break;
- case msc:
- tadd1 = 60000*(long)rtemps1[0] + 1000*(long)rtemps1[1] + 10*(long)rtemps1[2];
- break;
- case ms:
- tadd1 = 1000*(long)rtemps2[0] + rtemps2[1];
- break;
- }
- if(vmode == timl)
- {
- switch (vunit)
- {
- //Calcul du temps a ajouter a millis() au moment du trigger, pour aller plus vite
- case hms:
- tadd2 = 3600000 * (long)rtemps12[0] + 60000* (long)rtemps12[1] + 1000* (long)rtemps12[2];
- break;
- case msc:
- tadd2 = 60000*(long)rtemps12[0] + 1000*(long)rtemps12[1] + 10*rtemps12[2];
- break;
- case ms:
- tadd2 = 1000*(long)rtemps22[0] + rtemps22[1];
- break;
- }
- }
- //lancement de la fonction de standby correspondant au mode sachant que le sous mode est un temps
- if(vmode == cpt) stb_cpt_tps();
- else if(vmode == dcpt) stb_dcpt_tps();
- else stb_timl();
- }
- else if(vsmode == nb)
- {
- if(vmode == cpt) stb_cpt_nb();
- else
- {
- rnb = rnbmax;
- stb_dcpt_nb();
- }
- }
- else if(vsmode == svit) stb_vit_vit();
- else if(vsmode == itrv) stb_vit_itrv();
- }
- void stb_cpt_tps()
- {
- if(vunit == hms)
- {
- while(!trigged1){} //attente du trigger
- tfin1 = t0 + tadd1;
- trigged1 = true;
- while(!termine)
- {
- calcul_cpt_hms();
- affiche_digits();
- }
- //APRES FIN
- }
- else if(vunit == msc)
- {
- while(!trigged1){} //attente du trigger
- tfin1 = t0 + tadd1;
- trigged1 = true;
- while(!termine)
- {
- calcul_cpt_msc();
- affiche_digits();
- }
- //APRES FIN
- }
- else if(vunit == ms)
- {
- while(!trigged1){} //attente du trigger
- tfin1 = t0 + tadd1;
- trigged1 = true;
- while(!termine)
- {
- calcul_cpt_ms();
- affiche_digits();
- }
- //APRES FIN
- }
- }
- void calcul_cpt_hms()
- {
- //calcul du temps ecoule
- tecoul = millis() - t0;
- if(millis() >= tfin1)
- {
- relais();
- nombre[0] = rtemps1[2] % 10;
- nombre[1] = rtemps1[2] / 10;
- nombre[2] = rtemps1[1] % 10;
- nombre[3] = rtemps1[1] / 10;
- nombre[4] = rtemps1[0] % 10;
- nombre[5] = rtemps1[0] / 10;
- termine = true;
- return;
- }
- //decoupage puis soustraction des heures
- atemps1[0] = tecoul / 3600000;
- tecoul %= 3600000;
- //minutes
- atemps1[1] = tecoul / 60000;
- tecoul %= 60000;
- //secondes
- atemps1[2] = tecoul / 1000;
- nombre[0] = atemps1[2] % 10;
- nombre[1] = atemps1[2] / 10;
- nombre[2] = atemps1[1] % 10;
- nombre[3] = atemps1[1] / 10;
- nombre[4] = atemps1[0] % 10;
- nombre[5] = atemps1[0] / 10;
- }
- void calcul_cpt_msc()
- {
- //calcul du temps ecoule
- tecoul = millis() - t0;
- if(millis() >= tfin1)
- {
- relais();
- nombre[0] = rtemps1[2] % 10;
- nombre[1] = rtemps1[2] / 10;
- nombre[2] = rtemps1[1] % 10;
- nombre[3] = rtemps1[1] / 10;
- nombre[4] = rtemps1[0] % 10;
- nombre[5] = rtemps1[0] / 10;
- termine = true;
- return;
- }
- //decoupage puis soustraction des minutes
- atemps1[0] = tecoul / 60000;
- tecoul %= 60000;
- //secondes
- atemps1[1] = tecoul / 1000;
- tecoul %= 1000;
- //centiemes
- atemps1[2] = tecoul / 10;
- nombre[0] = atemps1[2] % 10;
- nombre[1] = atemps1[2] / 10;
- nombre[2] = atemps1[1] % 10;
- nombre[3] = atemps1[1] / 10;
- nombre[4] = atemps1[0] % 10;
- nombre[5] = atemps1[0] / 10;
- }
- void calcul_cpt_ms()
- {
- //calcul du temps ecoule
- tecoul = millis() - t0;
- if(millis() >= tfin1)
- {
- relais();
- nombre[0] = rtemps2[1] % 10;
- nombre[1] = (rtemps2[1] % 100) / 10;
- nombre[2] = rtemps2[1] / 100;
- nombre[3] = rtemps2[0] % 10;
- nombre[4] = (rtemps2[0] % 100) / 10;
- nombre[5] = rtemps2[0] / 100;
- termine = true;
- return;
- }
- //decoupage puis soustraction des secondes
- atemps2[0] = tecoul / 1000;
- tecoul %= 1000;
- //millisecondes
- atemps2[1] = tecoul;
- nombre[0] = atemps2[1] % 10;
- nombre[1] = (atemps2[1] % 100) / 10;
- nombre[2] = atemps2[1] / 100;
- nombre[3] = atemps2[0] % 10;
- nombre[4] = (atemps2[0] % 100) / 10;
- nombre[5] = atemps2[0] / 100;
- }
- void stb_dcpt_tps()
- {
- if(vunit == hms)
- {
- while(!trigged1){} //attente du trigger
- tfin1 = t0 + tadd1;
- trigged1 = true;
- while(!termine)
- {
- calcul_dcpt_hms();
- affiche_digits();
- }
- //APRES FIN
- }
- else if(vunit == msc)
- {
- while(!trigged1){} //attente du trigger
- tfin1 = t0 + tadd1;
- trigged1 = true;
- while(!termine)
- {
- calcul_dcpt_msc();
- affiche_digits();
- }
- //APRES FIN
- }
- else if(vunit == ms)
- {
- while(!trigged1){} //attente du trigger
- tfin1 = t0 + tadd1;
- trigged1 = true;
- while(!termine)
- {
- calcul_dcpt_ms();
- affiche_digits();
- }
- //APRES FIN
- }
- }
- void calcul_dcpt_hms()
- {
- //calcul du temps restant
- trest1 = tfin1 - millis();
- if(trest1 <= 0)
- {
- relais();
- //affiche 00:00:00
- for(byte i = 0; i<6; i++)
- nombre[i] = 0;
- termine = true;
- return;
- }
- //decoupage puis soustraction des heures
- atemps1[0] = trest1 / 3600000;
- trest1 %= 3600000;
- //minutes
- atemps1[1] = trest1 / 60000;
- trest1 %= 60000;
- //secondes
- atemps1[2] = trest1 / 1000;
- nombre[0] = atemps1[2] % 10;
- nombre[1] = atemps1[2] / 10;
- nombre[2] = atemps1[1] % 10;
- nombre[3] = atemps1[1] / 10;
- nombre[4] = atemps1[0] % 10;
- nombre[5] = atemps1[0] / 10;
- }
- void calcul_dcpt_msc()
- {
- //calcul du temps restant
- trest1 = tfin1 - millis();
- if(trest1 <= 0)
- {
- relais();
- //affiche 00:00.00
- for(byte i = 0; i<6; i++)
- nombre[i] = 0;
- termine = true;
- return;
- }
- //decoupage puis soustraction des minutes
- atemps1[0] = trest1 / 60000;
- trest1 %= 60000;
- //secondes
- atemps1[1] = trest1 / 1000;
- trest1 %= 1000;
- //centiemes
- atemps1[2] = trest1 / 10;
- nombre[0] = atemps1[2] % 10;
- nombre[1] = atemps1[2] / 10;
- nombre[2] = atemps1[1] % 10;
- nombre[3] = atemps1[1] / 10;
- nombre[4] = atemps1[0] % 10;
- nombre[5] = atemps1[0] / 10;
- }
- void calcul_dcpt_ms()
- {
- //calcul du temps restant
- trest1 = tfin1 - millis();
- if(trest1 <= 0)
- {
- relais();
- //affiche 000.000
- for(byte i = 0; i<6; i++)
- nombre[i] = 0;
- termine = true;
- return;
- }
- //decoupage puis soustraction des secondes
- atemps2[0] = trest1 / 1000;
- trest1 %= 1000;
- //millisecondes
- atemps2[1] = trest1;
- nombre[0] = atemps2[1] % 10;
- nombre[1] = (atemps2[1] % 100) / 10;
- nombre[2] = atemps2[1] / 100;
- nombre[3] = atemps2[0] % 10;
- nombre[4] = (atemps2[0] % 100) / 10;
- nombre[5] = atemps2[0] / 100;
- }
- void stb_cpt_nb()
- {
- while(!termine)
- {
- calcul_cpt_nb();
- affiche_digits();
- }
- }
- void calcul_cpt_nb()
- {
- if(trigged1)
- {
- delayMicroseconds(5000);
- trigged1 = false;
- rnb++;
- if(rnb >= rnbmax)
- {
- relais();
- termine = true;
- }
- nombre[5] = 0;
- nombre[4] = rnb / 10000;
- nombre[3] = (rnb / 1000) %10;
- nombre[2] = (rnb / 100) %10;
- nombre[1] = (rnb / 10) %10;
- nombre[0] = rnb%10;
- }
- }
- void stb_dcpt_nb()
- {
- while(!termine)
- {
- calcul_dcpt_nb();
- affiche_digits();
- }
- }
- void calcul_dcpt_nb()
- {
- if(trigged1)
- {
- delayMicroseconds(5000);
- trigged1 = false;
- rnb--;
- nombre[5] = 0;
- nombre[4] = rnb / 10000;
- nombre[3] = (rnb / 1000) %10;
- nombre[2] = (rnb / 100) %10;
- nombre[1] = (rnb / 10) %10;
- nombre[0] = rnb%10;
- if(rnb <= 0)
- {
- relais();
- termine = true;
- }
- }
- }
- void stb_vit_vit()
- {
- digitalWrite(rgb_r,0);
- lcd.setCursor(0,3);
- lcd.print("V=");
- if(dist < 10) lcd.setCursor(6,2);
- else if(dist < 100) lcd.setCursor(7,2);
- else if(dist < 1000) lcd.setCursor(8,2);
- lcd.print("T=");
- while(!trigged1 || !trigged2)
- {
- if(trigged1) digitalWrite(rgb_b0, 1);
- if(trigged2) digitalWrite(rgb_b1, 1);
- }
- digitalWrite(rgb_b0, 1);
- digitalWrite(rgb_b1, 1);
- calcul_vit_vit();
- affiche_digits();
- //Precision d'affichage selon temps
- (intervalle < 100000) ?
- lcd.print(((float)intervalle)/1000,3):
- lcd.print(((float)intervalle)/1000);
- lcd.print("ms");
- lcd.setCursor(14,3); lcd.print(">RESET");
- lcd.setCursor(2,3);
- lcd.print(rvitesse);
- (vunit == mps)? lcd.print("m/s"): lcd.print("km/h");
- lcd.setCursor(1,3);
- float vkmh, vmps;
- if (vunit == mps)
- {
- vmps = rvitesse;
- vkmh = rvitesse*3.6;
- }
- else
- {
- vkmh = rvitesse;
- vmps = rvitesse / 3.6;
- }
- while(!digitalRead(ok))
- {
- if(digitalRead(gauche) || digitalRead(droite))
- {
- lcd.setCursor(2,3);
- if(vunit == mps)
- {
- vunit = kmh;
- lcd.print(vkmh);
- lcd.print("km/h");
- }
- else
- {
- vunit = mps;
- lcd.print(vmps);
- lcd.print("m/s ");
- }
- calcul_vit_vit();
- affiche_digits();
- lcd.setCursor(1,3);
- while(digitalRead(gauche) || digitalRead(droite)) {}
- delay(antirebond);
- }
- }
- while(digitalRead(ok)) {}
- delay(antirebond*2);
- }
- void calcul_vit_vit()
- {
- (tv1 > tv0)?
- intervalle = tv1 - tv0:
- intervalle = tv0 - tv1;
- rvitesse = ((float)dist/100.0)/((float)(intervalle)/1000000.0);
- if(vunit == kmh) rvitesse *= 3.6;
- if(rvitesse < 1000)
- {
- digitalWrite(pt0,0);
- digitalWrite(pt1,1);
- nombre[5] = (int)(rvitesse / 100);
- nombre[4] = ((int)(rvitesse / 10)) % 10;
- nombre[3] = ((int)(rvitesse)) % 10;
- nombre[2] = ((int)(rvitesse * 10)) % 10;
- nombre[1] = ((long)(rvitesse * 100)) % 10;
- nombre[0] = ((long)(rvitesse * 1000)) % 10;
- }
- else if(rvitesse < 10000)
- {
- digitalWrite(pt1,0);
- digitalWrite(pt0,1);
- nombre[5] = (int)(rvitesse / 1000);
- nombre[4] = ((int)(rvitesse / 100)) % 10;
- nombre[3] = ((int)(rvitesse /10)) % 10;
- nombre[2] = ((int)rvitesse) % 10;
- nombre[1] = ((long)(rvitesse * 10)) % 10;
- nombre[0] = ((long)(rvitesse * 100)) % 10;
- }
- else
- {
- digitalWrite(pt0,1);
- nombre[5] = 9;
- nombre[4] = 9;
- nombre[3] = 9;
- nombre[2] = 9;
- nombre[1] = 9;
- nombre[0] = 9;
- }
- }
- void stb_vit_itrv()
- {
- digitalWrite(rgb_r,0);
- lcd.setCursor(0,2); lcd.print("T=");
- while(!trigged1 || !trigged2)
- {
- if(trigged1) digitalWrite(rgb_b0, 1);
- if(trigged2) digitalWrite(rgb_b1, 1);
- }
- digitalWrite(rgb_b1, 1);
- digitalWrite(rgb_b0, 1);
- calcul_vit_itrv();
- affiche_digits();
- lcd.print(((float)intervalle)/1000.0,3); lcd.print("ms");
- }
- void calcul_vit_itrv()
- {
- (tv1 > tv0)? intervalle = tv1-tv0: intervalle = tv0-tv1;
- if(intervalle < 10000000)
- {
- //0.00000
- digitalWrite(pt2,1);
- nombre[5] = intervalle/1000000;
- nombre[4] = (intervalle/100000)%10;
- nombre[3] = (intervalle/10000)%10;
- nombre[2] = (intervalle/1000)%10;
- nombre[1] = (intervalle/100)%10;
- nombre[0] = (intervalle/10)%10;
- }
- else if(intervalle < 1000000000)
- {
- //000.000
- digitalWrite(pt1,1);
- nombre[5] = intervalle/100000000;
- nombre[4] = (intervalle/10000000)%10;
- nombre[3] = (intervalle/1000000)%10;
- nombre[2] = (intervalle/100000)%10;
- nombre[1] = (intervalle/10000)%10;
- nombre[0] = (intervalle/1000)%10;
- }
- else
- {
- //0000.00
- digitalWrite(pt0,1);
- nombre[5] = intervalle/1000000000;
- nombre[4] = (intervalle/100000000)%10;
- nombre[3] = (intervalle/10000000)%10;
- nombre[2] = (intervalle/1000000)%10;
- nombre[1] = (intervalle/100000)%10;
- nombre[0] = (intervalle/10000)%10;
- }
- }
- void stb_timl()
- {
- timlphase = false; //start en mode off
- while(!trigged1){} //attente du trigger
- trigged1 = true;
- while(!digitalRead(RESET)) //condition d'arret du timelapse ?
- {
- timlchg = false;
- if(!timlphase)
- {
- //Reset des compteurs de fin lorsqu'un cycle est termine
- tfin1 = millis() + tadd1;
- tfin2 = tfin1 + tadd2;
- }
- digitalWrite(SIG,timlphase);
- digitalWrite(rgb_g,timlphase);
- digitalWrite(rgb_r,!timlphase);
- while(!timlchg)
- {
- switch (vunit)
- {
- case hms: calcul_timl_hms(); break;
- case msc: calcul_timl_msc(); break;
- case ms: calcul_timl_ms(); break;
- }
- affiche_digits();
- }
- }
- }
- void calcul_timl_hms()
- {
- if(!timlphase)
- {
- //Phase OFF
- //calcul du temps restant
- trest1 = tfin1 - millis();
- if(trest1 <= 0)
- {
- timlchg = true;
- timlphase = true;
- return;
- }
- //decoupage puis soustraction des heures
- atemps1[0] = trest1 / 3600000;
- trest1 %= 3600000;
- //minutes
- atemps1[1] = trest1 / 60000;
- trest1 %= 60000;
- //secondes
- atemps1[2] = trest1 / 1000;
- nombre[0] = atemps1[2] % 10;
- nombre[1] = atemps1[2] / 10;
- nombre[2] = atemps1[1] % 10;
- nombre[3] = atemps1[1] / 10;
- nombre[4] = atemps1[0] % 10;
- nombre[5] = atemps1[0] / 10;
- }
- else
- {
- //Phase ON
- //calcul du temps restant
- trest2 = tfin2 - millis();
- if(trest2 <= 0)
- {
- timlchg = true;
- timlphase = false;
- return;
- }
- //decoupage puis soustraction des heures
- atemps12[0] = trest2 / 3600000;
- trest2 %= 3600000;
- //minutes
- atemps12[1] = trest2 / 60000;
- trest2 %= 60000;
- //secondes
- atemps12[2] = trest2 / 1000;
- nombre[0] = atemps12[2] % 10;
- nombre[1] = atemps12[2] / 10;
- nombre[2] = atemps12[1] % 10;
- nombre[3] = atemps12[1] / 10;
- nombre[4] = atemps12[0] % 10;
- nombre[5] = atemps12[0] / 10;
- }
- }
- void calcul_timl_msc()
- {
- if(!timlphase)
- {
- //Phase OFF
- //calcul du temps restant
- trest1 = tfin1 - millis();
- if(trest1 <= 0)
- {
- timlchg = true;
- timlphase = true;
- return;
- }
- //decoupage puis soustraction des minutes
- atemps1[0] = trest1 / 60000;
- trest1 %= 60000;
- //secondes
- atemps1[1] = trest1 / 1000;
- trest1 %= 1000;
- //centiemes
- atemps1[2] = trest1 / 10;
- nombre[0] = atemps1[2] % 10;
- nombre[1] = atemps1[2] / 10;
- nombre[2] = atemps1[1] % 10;
- nombre[3] = atemps1[1] / 10;
- nombre[4] = atemps1[0] % 10;
- nombre[5] = atemps1[0] / 10;
- }
- else
- {
- //Phase ON
- //calcul du temps restant
- trest2 = tfin2 - millis();
- if(trest2 <= 0)
- {
- timlchg = true;
- timlphase = false;
- return;
- }
- //decoupage puis soustraction des minutes
- atemps12[0] = trest2 / 60000;
- trest2 %= 60000;
- //secondes
- atemps12[1] = trest2 / 1000;
- trest2 %= 1000;
- //centiemes
- atemps12[2] = trest2 / 10;
- nombre[0] = atemps12[2] % 10;
- nombre[1] = atemps12[2] / 10;
- nombre[2] = atemps12[1] % 10;
- nombre[3] = atemps12[1] / 10;
- nombre[4] = atemps12[0] % 10;
- nombre[5] = atemps12[0] / 10;
- }
- }
- void calcul_timl_ms()
- {
- if(!timlphase)
- {
- //Phase ON
- //calcul du temps restant
- trest1 = tfin1 - millis();
- if(trest1 <= 0)
- {
- timlchg = true;
- timlphase = true;
- return;
- }
- //decoupage puis soustraction des secondes
- atemps2[0] = trest1 / 1000;
- trest1 %= 1000;
- //millisecondes
- atemps2[1] = trest1;
- nombre[0] = atemps2[1] % 10;
- nombre[1] = (atemps2[1] % 100) / 10;
- nombre[2] = atemps2[1] / 100;
- nombre[3] = atemps2[0] % 10;
- nombre[4] = (atemps2[0] % 100) / 10;
- nombre[5] = atemps2[0] / 100;
- }
- else
- {
- //Phase OFF
- //calcul du temps restant
- trest2 = tfin2 - millis();
- if(trest2 <= 0)
- {
- timlchg = true;
- timlphase = false;
- return;
- }
- //decoupage puis soustraction des secondes
- atemps22[0] = trest2 / 1000;
- trest2 %= 1000;
- //millisecondes
- atemps22[1] = trest2;
- nombre[0] = atemps22[1] % 10;
- nombre[1] = (atemps22[1] % 100) / 10;
- nombre[2] = atemps22[1] / 100;
- nombre[3] = atemps22[0] % 10;
- nombre[4] = (atemps22[0] % 100) / 10;
- nombre[5] = atemps22[0] / 100;
- }
- }
- void affiche_digits()
- {
- for(byte i=0; i<6; i++)
- {
- for(byte n=0; n<4; n++)
- digitalWrite(digit[n], bitRead(nombre[i],n));
- //Latch
- digitalWrite(latch[i],1);
- digitalWrite(latch[i],0);
- }
- }
- void trigger1()
- {
- if(!trigged1)
- {
- t0 = millis();
- tv0 = micros();
- trigged1 = true;
- }
- }
- void trigger2()
- {
- if(!trigged2)
- {
- t1 = millis();
- tv1 = micros();
- trigged2 = true;
- }
- }
- void pause()
- {
- while(digitalRead(PAUSE)) {}
- }
- void affiche_points()
- {
- reset_pts();
- switch(vunit)
- {
- case hms:
- digitalWrite(dpt0,1);
- digitalWrite(dpt1,1);
- break;
- case msc:
- digitalWrite(dpt1,1);
- digitalWrite(pt0,1);
- break;
- case ms:
- digitalWrite(pt1,1);
- break;
- default:
- break;
- }
- }
- void reset_pts()
- {
- //Eteint tous les points
- digitalWrite(pt0,0); digitalWrite(pt1,0); digitalWrite(pt2,0);
- digitalWrite(dpt0,0); digitalWrite(dpt1,0);
- }
- void reset_digits()
- {
- for(byte n=0; n<4; n++)
- digitalWrite(digit[n],0);
- for(byte i=0; i<6; i++)
- {
- digitalWrite(latch[i],1);
- digitalWrite(latch[i],0);
- }
- }
- void reset_rgb()
- {
- //Remet les RGB sur Rouge
- digitalWrite(rgb_g,0); digitalWrite(rgb_b0,0); digitalWrite(rgb_b1,0); digitalWrite(rgb_r,1);
- }
- void reset_all()
- {
- termine = false; trigged1 = false; trigged2 = false;
- reset_pts();
- reset_digits();
- reset_rgb();
- digitalWrite(SIG,0);
- digitalWrite(rgb_g,0); digitalWrite(rgb_r,1);
- }
- void relais()
- {
- digitalWrite(SIG,1);
- digitalWrite(rgb_r,0);
- digitalWrite(rgb_g,1);
- }
- void loop()
- {
- menu();
- mode();
- smode();
- unite();
- reglage();
- stb_ok();
- stb();
- lcd.setCursor(14,3); lcd.print(">RESET"); lcd.setCursor(14,3);
- while(!digitalRead(retour) && !digitalRead(ok)){}
- if (digitalRead(retour)) again = false; else if(digitalRead(ok)) again = true;
- reset_all();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement