// Définition des broches de sélection (S0 à S3)
// S0 est le bit de poids faible
const int SELECT_PINS[] = {4, 5, 18, 19};
// Broche de signal (COM) - ADC1_CH6 sur ESP32 (GPIO34)
const int SIG_PIN = 34;
// Canaux MUX utilisés
const int BLUE_LED_CH = 0; // Sortie Numérique (LED Bleue - Mode Actif)
const int GREEN_LED_CH = 1; // Sortie Numérique (LED Verte - Sous Seuil)
const int RED_LED_CH = 2; // Sortie Numérique (LED Rouge - Au-dessus Seuil)
const int BUTTON_CH = 3; // Entrée Numérique (Bouton Poussoir)
const int POT_CH = 4; // Entrée Analogique (Potentiomètre)
// Seuil du Potentiomètre (ADC sur ESP32 est 0-4095)
const int SEUIL_POT = 2048;
// État de l'application
volatile bool isRunning = false;
volatile bool buttonState = false;
// ----------------------------------------------------
// Fonction pour sélectionner le canal sur le MUX
// ----------------------------------------------------
void setMuxChannel(int channel) {
// Écrit le code binaire du canal (0 à 15) sur S0, S1, S2, S3
for (int i = 0; i < 4; i++) {
digitalWrite(SELECT_PINS[i], bitRead(channel, i) ? HIGH : LOW);
}
}
// ----------------------------------------------------
// Fonctions de lecture/écriture du MUX
// ----------------------------------------------------
int readMuxDigital(int channel) {
setMuxChannel(channel);
// Le Mux a besoin d'un léger délai pour commuter
delayMicroseconds(5);
return digitalRead(SIG_PIN);
}
int readMuxAnalog(int channel) {
setMuxChannel(channel);
delayMicroseconds(5);
return analogRead(SIG_PIN);
}
void writeMuxDigital(int channel, int value) {
setMuxChannel(channel);
delayMicroseconds(5);
digitalWrite(SIG_PIN, value);
}
// ----------------------------------------------------
// Configuration
// ----------------------------------------------------
void setup() {
Serial.begin(115200);
// Initialisation des broches de sélection en sortie
for (int pin : SELECT_PINS) {
pinMode(pin, OUTPUT);
}
// Le SIG_PIN sert d'entrée/sortie, mais pour le bouton (CH3),
// nous devons l'utiliser en INPUT_PULLUP (puisque le bouton est côté Mux)
pinMode(SIG_PIN, INPUT_PULLUP);
// Éteindre toutes les LEDs au démarrage
writeMuxDigital(BLUE_LED_CH, LOW);
writeMuxDigital(GREEN_LED_CH, LOW);
writeMuxDigital(RED_LED_CH, LOW);
}
// ----------------------------------------------------
// Boucle principale
// ----------------------------------------------------
void loop() {
// 1. Gestion du Bouton Poussoir (CH3)
// Nous devons changer temporairement le mode du SIG_PIN en INPUT_PULLUP
pinMode(SIG_PIN, INPUT_PULLUP);
int currentButtonState = readMuxDigital(BUTTON_CH);
// Détection de Flanc Descendant (appui sur le bouton)
if (currentButtonState == LOW && buttonState == HIGH) {
isRunning = !isRunning; // Inverse l'état (Démarrer/Arrêter)
// Mise à jour de la LED Bleue
pinMode(SIG_PIN, OUTPUT); // Changement en mode sortie pour la LED
writeMuxDigital(BLUE_LED_CH, isRunning ? HIGH : LOW);
// Éteindre les autres LEDs lors du changement d'état
if (!isRunning) {
writeMuxDigital(GREEN_LED_CH, LOW);
writeMuxDigital(RED_LED_CH, LOW);
}
Serial.print("Statut: ");
Serial.println(isRunning ? "DEMARRE" : "ARRETE");
delay(200); // Anti-rebond simple après le changement d'état
}
buttonState = currentButtonState;
// 2. Logique de Contrôle Potentiomètre (Si Démarré)
if (isRunning) {
// A. Lecture du Potentiomètre (CH4)
// Le SIG_PIN doit être en mode INPUT (pour l'analogRead)
pinMode(SIG_PIN, INPUT);
int potValue = readMuxAnalog(POT_CH);
Serial.print("Potentiomètre: ");
Serial.println(potValue);
// B. Contrôle des LEDs Rouge/Verte
// Le SIG_PIN doit être en mode OUTPUT
pinMode(SIG_PIN, OUTPUT);
if (potValue < SEUIL_POT) {
// Sous le seuil: LED Verte ON, Rouge OFF
writeMuxDigital(GREEN_LED_CH, HIGH);
writeMuxDigital(RED_LED_CH, LOW);
} else {
// Au-dessus ou égal au seuil: LED Rouge ON, Verte OFF
writeMuxDigital(GREEN_LED_CH, LOW);
writeMuxDigital(RED_LED_CH, HIGH);
}
}
delay(10); // Délai de boucle
}