// input pins int entranceSensor = 8, exitSensor = 9, resetButton = 10; // output pins int display1 = 20, display2 = 30, display3 = 40; /* correspondances pins <-> segments (0) ---- |(5) |(1) | | (6) ---- |(4) |(2) | | (3) ---- */ // globals int counter = 0; void reset() { if(digitalRead(resetButton) == LOW) // Si le bouton resetButton est appuyé alors on remet à zéro le compteur { counter = 0; } } // ************ Gestion de l'afficheur ************ // void displayLED(int displayPin, int value) { // LOW : allumée // HIGH : éteinte switch (value) { case 0 : { digitalWrite(displayPin + 0, LOW); digitalWrite(displayPin + 1, LOW); digitalWrite(displayPin + 2, LOW); digitalWrite(displayPin + 3, LOW); digitalWrite(displayPin + 4, LOW); digitalWrite(displayPin + 5, LOW); digitalWrite(displayPin + 6, HIGH); } break; case 1 : { digitalWrite(displayPin + 0, HIGH); digitalWrite(displayPin + 1, LOW); digitalWrite(displayPin + 2, LOW); digitalWrite(displayPin + 3, HIGH); digitalWrite(displayPin + 4, HIGH); digitalWrite(displayPin + 5, HIGH); digitalWrite(displayPin + 6, HIGH); } break; case 2 : { digitalWrite(displayPin + 0, LOW); digitalWrite(displayPin + 1, LOW); digitalWrite(displayPin + 2, HIGH); digitalWrite(displayPin + 3, LOW); digitalWrite(displayPin + 4, LOW); digitalWrite(displayPin + 5, HIGH); digitalWrite(displayPin + 6, LOW); } break; case 3 : { digitalWrite(displayPin + 0, LOW); digitalWrite(displayPin + 1, LOW); digitalWrite(displayPin + 2, LOW); digitalWrite(displayPin + 3, LOW); digitalWrite(displayPin + 4, HIGH); digitalWrite(displayPin + 5, HIGH); digitalWrite(displayPin + 6, LOW); } break; case 4 : { digitalWrite(displayPin + 0, HIGH); digitalWrite(displayPin + 1, LOW); digitalWrite(displayPin + 2, LOW); digitalWrite(displayPin + 3, HIGH); digitalWrite(displayPin + 4, HIGH); digitalWrite(displayPin + 5, LOW); digitalWrite(displayPin + 6, LOW); } break; case 5 : { digitalWrite(displayPin + 0, LOW); digitalWrite(displayPin + 1, HIGH); digitalWrite(displayPin + 2, LOW); digitalWrite(displayPin + 3, LOW); digitalWrite(displayPin + 4, HIGH); digitalWrite(displayPin + 5, LOW); digitalWrite(displayPin + 6, LOW); } break; case 6 : { digitalWrite(displayPin + 0, LOW); digitalWrite(displayPin + 1, HIGH); digitalWrite(displayPin + 2, LOW); digitalWrite(displayPin + 3, LOW); digitalWrite(displayPin + 4, LOW); digitalWrite(displayPin + 5, LOW); digitalWrite(displayPin + 6, LOW); } break; case 7 : { digitalWrite(displayPin + 0, LOW); digitalWrite(displayPin + 1, LOW); digitalWrite(displayPin + 2, LOW); digitalWrite(displayPin + 3, HIGH); digitalWrite(displayPin + 4, HIGH); digitalWrite(displayPin + 5, HIGH); digitalWrite(displayPin + 6, HIGH); } break; case 8 : { digitalWrite(displayPin + 0, LOW); digitalWrite(displayPin + 1, LOW); digitalWrite(displayPin + 2, LOW); digitalWrite(displayPin + 3, LOW); digitalWrite(displayPin + 4, LOW); digitalWrite(displayPin + 5, LOW); digitalWrite(displayPin + 6, LOW); } break; case 9 : { digitalWrite(displayPin + 0, LOW); digitalWrite(displayPin + 1, LOW); digitalWrite(displayPin + 2, LOW); digitalWrite(displayPin + 3, LOW); digitalWrite(displayPin + 4, HIGH); digitalWrite(displayPin + 5, LOW); digitalWrite(displayPin + 6, LOW); } break; default: digitalWrite(displayPin + 0, HIGH); digitalWrite(displayPin + 1, HIGH); digitalWrite(displayPin + 2, HIGH); digitalWrite(displayPin + 3, HIGH); digitalWrite(displayPin + 4, HIGH); digitalWrite(displayPin + 5, HIGH); digitalWrite(displayPin + 6, HIGH); break; } } void display3Digits() { int counterCopy = counter; int digit1, digit2, digit3; // split the number into each digit by using modulo operation digit3 = counterCopy % 10; counterCopy /= 10; digit2 = counterCopy % 10; counterCopy /= 10; digit1 = counterCopy % 10; Serial.print("Counter value "); Serial.print(counter); Serial.println(); Serial.print("try to display number "); Serial.print(digit1); Serial.print(digit2); Serial.print(digit3); Serial.println(); // display a 0 only for unit number displayLED(display1, digit1 > 0 ? digit1 : 10); displayLED(display2, digit2 > 0 ? digit2 : 10); displayLED(display3, digit3); } void count(){ boolean entranceValue = digitalRead(entranceSensor); // mesure du entranceSensoreur delay(5); // Temps d'attente de 5ms if (entranceValue == LOW) // Si l'état est bas { counter ++; } bool exitValue = digitalRead(exitSensor); // mesure du entranceSensoreur delay(5); // Temps d'attente de 5ms if (exitValue == LOW && counter > 0) // Si l'état est bas { counter --; } if(entranceValue || exitValue) { delay(400); // temps d'attente de 400ms pour ne pas créer de fausse mesures } } void setup() { Serial.begin(9600); // Ouverture du port série à 9600bps digitalWrite(resetButton, HIGH); // Active les résistances de pull-up internes afin de pouvoir détecter une pression sur le bouton resetButton pinMode(entranceSensor, INPUT); pinMode(exitSensor, INPUT); for(int i = 0; i < 7; ++i) { pinMode(display1 + i, OUTPUT); pinMode(display2 + i, OUTPUT); pinMode(display3 + i, OUTPUT); } } void loop() { count(); reset(); display3Digits(); }