1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
//--Définitions
//Constantes:
//Temps
const byte ledsIndexMax = 24; // Numeratotation maximum des LED
//!!!
const byte compteRebours = 1; //45 ; // durée en minutes du programme en minutes
byte ledRougeIndex, ledBleueIndex; // Pour memoriser la position de la led "en travail"
const byte ledPinOnValue = LOW; // Quel valeur sur le port pour allumer la LED
//!!!
const int photoSeuil=200;
unsigned long ledRougePeriode = (compteRebours*60000)/ledsIndexMax+1 ; //(compteRebours*60000)/ledsIndexMax+1 ; // durée en minutes d'un intervale entre l'allumage de la led rouge suivante
unsigned long ledRougePeriodeStart = millis(); // Chrono de la periode des LED rouges
const int photoRcapture = 50; /* durée en ms du passage du jeton devant le faisceau pour être compté
comme évènement déclenchant ( a tester sur maquette)*/
const int photoRcaptureoff=150; /* durée en ms du NON passage de jeton devant le faisceau pour permettre un nouveau comptage d'évènement,
en repassant par le seuil haut , un nouvel enregistrement de seuil bas permet alors d'être compté comme évènement déclenchant
( valeurs a tester sur maquette)*/
//Sorties
const byte pinOutRed[] = {4,5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29};
// Déclaration et initialisation d'un tableau leds rouges (qui doivent évoluer avec le temps), connectées au broches repérées 4 (pos.Tabl.0) à 28(pos.Tabl.24)
const byte pinOutBlue[] = {29,30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54};
// Déclaration et initialisation d'un tableau Bleues (qui doivent évoluer avec les évènements), connectées au broches repérées 29 (pos.Tabl.0) à 53 (pos.Tabl.24)
//const byte pinOutBuzz = 0 ; // le pin 4 (repéré 3)sera utilisé pour allumer un buzzer =>> option
//Entrées
const byte pinInBpStart = A1; // Le Pin (repéré 0) est affecté au démarrage
const byte pinInBpRAZ = A2 ; // Le pin (repéré 1)sert à l'arret et la réinitialisation du compte à rebours
const byte pinInBpEvent = A3 ; // le pin (repéré 2)sera utilisé pour ajouter un évènement, et augmenter le nombre de Led Bleues alumées
const byte pinInPhotoR = A0 ; // le pin A0 (repéré A0)sera utilisé pour ajouter un évènement sur rupture du faisceau de la photorésistance, et augmenter le nombre de Led Bleues alumées
//Variables
int evCountBPStart = 0 ; // comptage du nombre de pression démarrage => 0 au début
int evCountBPRAZ = 0 ; // comptage du nombre de pression remise à Zero de la boucle principale => 0 au début
int evCountBPEvent = 0 ; // comptage du nombre de pression sur le bouton évènement manuel => 0 au début
int evCountPhotoR = 0 ; // comptage du nombre de passage devant le faisceau de la photorésistance => 0 au début
int valPhotoR = 0;
//-- Initialisation
void setup() {
Serial.begin(115200);
for (int i = 0; i <= ledsIndexMax; i++) {//pour les entiers de 0 à 24, définissons,pour chacun d'eux, un par un de plus:
pinMode(pinOutRed[i], OUTPUT); // Toutes les pins ROUGES sont commutées en OUT
digitalWrite(pinOutRed[i], !ledPinOnValue); // Toutes les pins ont pour valeur HIGH => éteintes
pinMode(pinOutBlue[i], OUTPUT); // Toutes les pins BLEUES sont commutées en OUT
digitalWrite(pinOutBlue[i], !ledPinOnValue); // Toutes les pins ont pour valeur HIGH => éteintes
} // Fin de la boucle for
{// initialisation en tant que BP sans résistance additionnelle
pinMode(pinInBpStart,INPUT_PULLUP);
pinMode(pinInBpRAZ,INPUT_PULLUP);
pinMode(pinInBpEvent,INPUT_PULLUP);
pinMode(pinInPhotoR, INPUT_PULLUP);
}//fin intialisation BP + photorésistance
ledRougeIndex = -1; ledBleueIndex = -1;
Serial.println(valPhotoR);
// nombre de led bleues à allumer :
// int ledBleueIndex = evCountBPEvent + evCountPhotoR; //***
} // Fin Setup
//--Boucle Principale
void loop() {
valPhotoR = analogRead(pinInPhotoR) ;
// ------------ Démmarage du compte à rebours
if(digitalRead (pinInBpStart) == LOW) {// si le bouton START est appuyé
delay (1000); // pendant au moins 1 seconde
if(digitalRead (pinInBpStart) == LOW){ //le bouton est encore appuyé
evCountBPStart ++;// ajoute 1 au compteur d'évènements
Serial.println("Start");}}
if(evCountBPStart > 0){// démarrage du programme
//--------------------------------- Tempo des LED rouges
if (millis() - ledRougePeriodeStart >= ledRougePeriode)
{
ledRougeIndex ++;
if (ledRougeIndex > ledsIndexMax)
{
ledRougeIndex = 0;
}
ledsAllumerJusqua(pinOutRed, ledsIndexMax, ledRougeIndex, "r");
//digitalWrite(pinOutRed[ledRougeIndex], ledPinOnValue); // Allumer la LED courante
ledRougePeriodeStart = millis(); // Redemarrage du chrono de la periode
}
//---------- Allummage LED Bleues par Bouton
if(digitalRead (pinInBpEvent) == LOW )
{// si le bouton Event est appuyé ou événement faisceau //***
delay (1000); // pendant au moins 1 secondes
if(digitalRead (pinInBpEvent) == LOW ) { //le bouton est encore appuyé //***
evCountBPEvent = evCountBPEvent + 1;// ajoute 1 au compteur d'évènements
ledsAllumerJusqua(pinOutBlue, ledsIndexMax, evCountBPEvent, "b");
while(digitalRead (pinInBpEvent) == LOW){}; // Tant que le bouton est pressé pour éviter la répétition
}}
//---------- Allummage LED Bleues par photoRésistance
if(digitalRead (pinInPhotoR) == LOW ) {// si le bouton Event est appuyé ou événement faisceau //***
delay (300); // pendant au moins 50 milisecondes
if(digitalRead (pinInPhotoR) == LOW ){ //le jeton est encore appuyé //***
evCountBPEvent = evCountBPEvent + 1;// ajoute 1 au compteur d'évènements
ledsAllumerJusqua(pinOutBlue, ledsIndexMax, evCountBPEvent, "b");
while(digitalRead (pinInPhotoR) == LOW ){}; // Tant que le bouton est pressé pour éviter la répétition
}}
// ------- Redémarrage par bouton poussoir : reset-----
if(digitalRead (pinInBpRAZ) == LOW) {// si le bouton RAZ est appuyé
delay (2000); // pendant au moins 2 secondes
if(digitalRead (pinInBpRAZ) == LOW){ //le bouton est encore appuyé
evCountBPRAZ ++;// ajoute 1 au compteur d'évènements
}}
if(evCountBPRAZ > 0){
// Redémarre le programme depuis le début mais ne
// réinitialiser pas les périphériques et les registres
asm volatile (" jmp 0");
}
}}
/*------------------------------------------------------------------------
Allumer les LED jusqu'a une position
Si position < 0 = tout eteindre
Entrée, tableau, dimension du tableau, jusqu'à quelle LED, couleur en texte
------------------------------------------------------------------------
*/
void ledsAllumerJusqua(byte tableauPin[], byte tableauPinDim, byte ledJusqua, String colStr)
{
String pseudoLeds = "";
if (ledJusqua > tableauPinDim) {ledJusqua = tableauPinDim;}
for (byte i = 0; i <= tableauPinDim; i ++)
{
if (i > ledJusqua) // Si pas dans la zone allumée donc éteindre
{
colStr.toLowerCase();
digitalWrite(tableauPin[i], !ledPinOnValue);
pseudoLeds += colStr;
}
else
{
colStr.toUpperCase();
digitalWrite(tableauPin[i], ledPinOnValue);
pseudoLeds += colStr;
}
}
Serial.println(pseudoLeds);
} |
Partager