/*
* ==============================================================================
* Projet : Commande de Lampe Multi-mode (Télérupteur / Minuterie)
* Auteur : Bisimwa Kokomungu Rodriguez
* Description : Permet de piloter une lampe soit en mode bascule (on/off),
* soit avec une minuterie automatique via deux boutons distincts.
* ==============================================================================
*/
// Définition des broches
const int PIN_BOUTON_TELERUPTEUR = 2; // Bouton pour le mode télérupteur
const int PIN_BOUTON_MINUTERIE = 3; // Bouton pour le mode minuterie
const int PIN_LAMPE = 13; // Broche de la lampe (ou du relais)
// Variables d'état
bool etatLampe = LOW;
bool minuterieActive = false;
unsigned long tempsDebutMinuterie = 0;
// Configuration de la durée de la minuterie (ex: 15 secondes pour le test)
const unsigned long DUREE_MINUTERIE = 10000;
// Variables pour la détection des fronts (anti-rebond logiciel)
bool dernierEtatBoutonTel = HIGH;
bool dernierEtatBoutonMin = HIGH;
void setup() {
// Configuration des broches des boutons en entrée avec résistance de pull-up interne
// (Le bouton envoie un signal LOW lorsqu'il est pressé)
pinMode(PIN_BOUTON_TELERUPTEUR, INPUT_PULLUP);
pinMode(PIN_BOUTON_MINUTERIE, INPUT_PULLUP);
// Configuration de la broche de la lampe en sortie
pinMode(PIN_LAMPE, OUTPUT);
digitalWrite(PIN_LAMPE, etatLampe);
}
void loop() {
// Lecture de l'état actuel des boutons
bool lectureTel = digitalRead(PIN_BOUTON_TELERUPTEUR);
bool lectureMin = digitalRead(PIN_BOUTON_MINUTERIE);
// ==========================================
// LOGIQUE TÉLÉRUPTEUR (Bouton 1)
// ==========================================
// Détection d'un appui (passage de HIGH à LOW)
if (lectureTel == LOW && dernierEtatBoutonTel == HIGH) {
delay(50); // Anti-rebond temporel
if (digitalRead(PIN_BOUTON_TELERUPTEUR) == LOW) {
etatLampe = !etatLampe; // Inversion de l'état actuel de la lampe
minuterieActive = false; // Désactive la minuterie si elle était en cours
digitalWrite(PIN_LAMPE, etatLampe);
}
}
dernierEtatBoutonTel = lectureTel;
// ==========================================
// LOGIQUE MINUTERIE (Bouton 2)
// ==========================================
// Détection d'un appui (passage de HIGH à LOW)
if (lectureMin == LOW && dernierEtatBoutonMin == HIGH) {
delay(50); // Anti-rebond temporel
if (digitalRead(PIN_BOUTON_MINUTERIE) == LOW) {
etatLampe = HIGH; // Allume la lampe
minuterieActive = true; // Active le mode minuterie
tempsDebutMinuterie = millis(); // Enregistre le moment de l'appui
digitalWrite(PIN_LAMPE, etatLampe);
}
}
dernierEtatBoutonMin = lectureMin;
// ==========================================
// GESTION DU TEMPS DE LA MINUTERIE
// ==========================================
if (minuterieActive) {
// Vérifie si le temps imparti est écoulé sans bloquer le reste du programme
if (millis() - tempsDebutMinuterie >= DUREE_MINUTERIE) {
etatLampe = LOW; // Éteint la lampe
minuterieActive = false; // Réinitialise l'état de la minuterie
digitalWrite(PIN_LAMPE, etatLampe);
}
}
}