#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Configuration de l'écran I2C (adresse 0x27 et écran 16x2)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Définir les boutons poussoirs
const int injuryButtonPin = 2; // Bouton pour sélectionner la blessure
const int timerButtonPin = 3; // Bouton pour démarrer le timer
int lastInjuryButtonState = HIGH;
int currentInjuryButtonState;
bool buttonPressed = false;
int lastTimerButtonState = HIGH;
int currentTimerButtonState = HIGH;
bool timerRunning = false;
bool injurySelected = false; // Indique si une blessure a été sélectionnée
bool selectionLocked = false; // Empêche un nouveau choix tant que le timer n'est pas fini
unsigned long timerStart = 0;
int randomTimerDuration = 0;
bool outSelected = false; // Vérifie si "Out" a été sélectionné
// Les différentes blessures possibles
String injuries[] = {"Jambe", "Pied", "Main", "Bras", "Tête", "Out"};
int numInjuries = sizeof(injuries) / sizeof(injuries[0]);
String chosenInjury = "";
// Délai pour éviter les rebonds du bouton
const int debounceDelay = 50;
void setup() {
// Initialisation de l'écran LCD
lcd.init();
lcd.backlight();
// Configuration des boutons en entrée
pinMode(injuryButtonPin, INPUT);
pinMode(timerButtonPin, INPUT);
// Message de bienvenue
lcd.setCursor(6, 0);
lcd.print("ROLE");
lcd.setCursor(4, 1);
lcd.print("MEDECIN");
}
void loop() {
// Lecture de l'état du bouton blessure
currentInjuryButtonState = digitalRead(injuryButtonPin);
// Si le bouton blessure est pressé (sans timer en cours ni blessure verrouillée)
if (currentInjuryButtonState == HIGH && lastInjuryButtonState == LOW && !timerRunning && !selectionLocked) {
buttonPressed = true;
delay(debounceDelay); // Anti-rebond
}
// Si une blessure doit être sélectionnée
if (buttonPressed) {
// Choisir une blessure aléatoirement
int randomIndex = random(0, numInjuries);
chosenInjury = injuries[randomIndex];
// Effacer l'écran et afficher la blessure choisie
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("Blessure :");
lcd.setCursor(0, 1);
lcd.print(chosenInjury);
// Si la blessure est "Out", on démarre un timer spécifique
if (chosenInjury == "Out") {
outSelected = true;
timerStart = millis();
timerRunning = true;
} else {
// Sinon, on sélectionne une blessure avec un timer aléatoire
randomTimerDuration = random(10, 61); // Timer aléatoire entre 10 et 60 secondes
injurySelected = true; // Blessure sélectionnée
lcd.setCursor(12, 1); // Affichage du temps initial
lcd.print(randomTimerDuration);
lcd.print("s");
}
selectionLocked = true; // Verrouiller la sélection jusqu'à la fin du timer
buttonPressed = false; // Fin de la gestion de l'appui du bouton
}
// Mettre à jour l'état du bouton blessure
lastInjuryButtonState = currentInjuryButtonState;
// Lecture de l'état du bouton timer
currentTimerButtonState = digitalRead(timerButtonPin);
// Si le bouton timer est pressé (et le timer n'est pas déjà en cours)
if (currentTimerButtonState == LOW && lastTimerButtonState == HIGH && !timerRunning && injurySelected) {
timerStart = millis(); // Démarrer le timer
timerRunning = true;
delay(debounceDelay); // Anti-rebond
}
// Si le bouton timer est relâché pendant que le timer est en cours, on réinitialise le timer
if (timerRunning && currentTimerButtonState == HIGH && lastTimerButtonState == LOW) {
timerRunning = false; // Arrêter le timer
delay(debounceDelay); // Anti-rebond
}
// Mettre à jour l'état du bouton timer
lastTimerButtonState = currentTimerButtonState;
// Gestion du timer pour la blessure sélectionnée
if (timerRunning && injurySelected) {
unsigned long elapsedTime = (millis() - timerStart) / 1000; // Temps écoulé en secondes
int remainingTime = randomTimerDuration - elapsedTime;
if (remainingTime <= 0) {
// Timer terminé, réinitialisation
timerRunning = false;
injurySelected = false;
selectionLocked = false; // Permet de choisir une nouvelle blessure
// Afficher message de remise en jeu
lcd.clear();
lcd.setCursor(5, 0);
lcd.print("REMISE");
lcd.setCursor(5, 1);
lcd.print("EN JEU");
delay(2000); // Pause pour l'affichage
lcd.clear(); // Nettoyer l'écran
lcd.setCursor(6, 0);
lcd.print("ROLE");
lcd.setCursor(4, 1);
lcd.print("MEDECIN");
} else {
// Mise à jour du temps restant sur l'écran
lcd.setCursor(12, 1);
lcd.print(remainingTime);
lcd.print("s "); // Effacement du temps précédent
}
}
// Gestion du timer pour le cas "Out" (30 secondes d'attente)
if (outSelected && timerRunning) {
unsigned long elapsedTime = (millis() - timerStart) / 1000; // Temps écoulé en secondes
int remainingTime = 30 - elapsedTime;
if (remainingTime <= 0) {
// Timer terminé pour "Out", réinitialisation
timerRunning = false;
outSelected = false;
selectionLocked = false; // Permet de choisir une nouvelle blessure
injurySelected = false;
// Afficher message de remise en jeu
lcd.clear();
lcd.setCursor(5, 0);
lcd.print("RETOUR");
lcd.setCursor(4, 1);
lcd.print("AU SPAWN");
delay(2000); // Pause pour l'affichage
lcd.clear(); // Nettoyer l'écran
lcd.setCursor(6, 0);
lcd.print("ROLE");
lcd.setCursor(4, 1);
lcd.print("MEDECIN");
} else {
// Mise à jour du temps restant pour "Out" sur l'écran
lcd.setCursor(12, 1);
lcd.print(remainingTime);
lcd.print("s ");
}
}
}