#include <LiquidCrystal.h>
// Définition des broches pour les boutons
const int boutonA = 0; // Broche pour le bouton A
const int boutonB = 1; // Broche pour le bouton B
// Définition des broches pour l'écran LCD
const int rs = 5, en = 6, d4 = 9, d5 = 10, d6 = 11, d7 = 12;
// Initialiser l'objet LCD
LiquidCrystal ecranLCD(rs, en, d4, d5, d6, d7);
// Variables pour stocker les états des boutons et le temps des appuis
int etatBoutonA = 0; // État actuel du bouton A
int etatBoutonB = 0; // État actuel du bouton B
int dernierEtatBoutonA = LOW; // Dernier état du bouton A
int dernierEtatBoutonB = LOW; // Dernier état du bouton B
unsigned long tempsAppuiA = 0; // Temps d'appui du bouton A
unsigned long tempsAppuiB = 0; // Temps d'appui du bouton B
float intervalle = 0; // Intervalle de temps entre les appuis
bool boutonAppuye = false; // Indicateur pour savoir si un bouton a été appuyé
int compteurScooter = 0; // Nombre de scooters
int compteurVelo = 0; // Nombre de vélos
int compteurTrotinette = 0; // Nombre de trotinettes
int compteurPieton = 0; // Nombre de piétons
void setup() {
// Initialiser les broches des boutons comme entrées
pinMode(boutonA, INPUT);
pinMode(boutonB, INPUT);
// Initialiser l'écran LCD
ecranLCD.begin(16, 2);
// Afficher le tableau initial
mettreAJourAffichage();
}
void loop() {
// Lire l'état actuel des boutons poussoirs
etatBoutonA = digitalRead(boutonA);
etatBoutonB = digitalRead(boutonB);
// Vérifier si le bouton A a été pressé
if (etatBoutonA == HIGH && dernierEtatBoutonA == LOW) {
gererAppuiBouton(1); // Gérer l'appui du bouton A
}
// Vérifier si le bouton B a été pressé
if (etatBoutonB == HIGH && dernierEtatBoutonB == LOW) {
gererAppuiBouton(2); // Gérer l'appui du bouton B
}
// Mettre à jour l'état précédent des boutons
dernierEtatBoutonA = etatBoutonA;
dernierEtatBoutonB = etatBoutonB;
}
// Fonction pour gérer l'appui sur un bouton
void gererAppuiBouton(int bouton) {
if (!boutonAppuye) {
// Si aucun bouton n'a été pressé auparavant
tempsAppuiA = millis(); // Enregistrer le temps d'appui
boutonAppuye = true; // Mettre à jour l'indicateur
} else {
// Si un bouton a déjà été pressé auparavant
tempsAppuiB = millis(); // Enregistrer le temps d'appui du deuxième bouton
// Calculer l'intervalle de temps entre les appuis des deux boutons
intervalle = (tempsAppuiB - tempsAppuiA) / 1000.0; // Convertir en secondes
// Incrémenter le compteur correspondant au type de véhicule
if (intervalle <= 1) {
compteurScooter++;
} else if (intervalle <= 2) {
compteurVelo++;
} else if (intervalle <= 3) {
compteurTrotinette++;
} else if (intervalle <= 4) {
compteurPieton++;
}
// Mettre à jour l'affichage du tableau
mettreAJourAffichage();
// Réinitialiser les temps d'appui pour un nouveau calcul
tempsAppuiA = 0;
tempsAppuiB = 0;
boutonAppuye = false; // Réinitialiser l'indicateur
}
delay(250); // Délai pour anti-rebond
}
// Fonction pour mettre à jour l'affichage du tableau
void mettreAJourAffichage() {
// Effacer l'écran LCD
ecranLCD.clear();
// Variables pour stocker les chaînes formatées
char bufferScooter[8];
char bufferVelo[8];
char bufferTrotinette[8];
char bufferPieton[8];
// Formater les chaînes avec des zéros devant pour avoir toujours 5 chiffres
sprintf(bufferScooter, "S:%05d", compteurScooter);
sprintf(bufferVelo, "V:%05d", compteurVelo);
sprintf(bufferTrotinette, "T:%05d", compteurTrotinette);
sprintf(bufferPieton, "P:%05d", compteurPieton);
// Afficher le nombre de véhicules comptabilisés dans un tableau
ecranLCD.setCursor(0, 0); // Placer le curseur au début de la première ligne
ecranLCD.print(bufferScooter); // Afficher le nombre de scooters
ecranLCD.setCursor(8, 0); // Placer le curseur au milieu de la première ligne
ecranLCD.print(bufferVelo); // Afficher le nombre de vélos
ecranLCD.setCursor(0, 1); // Placer le curseur au début de la deuxième ligne
ecranLCD.print(bufferTrotinette); // Afficher le nombre de trottinettes
ecranLCD.setCursor(8, 1); // Placer le curseur au milieu de la deuxième ligne
ecranLCD.print(bufferPieton); // Afficher le nombre de piétons
}