Non, pas directement et de manière fiable, pour deux raisons majeures : la tension logique de l’ESP32 et le courant requis par les solénoïdes.
Voici pourquoi cela pose problème et comment y remédier :
Le problème de la tension (3,3V vs 5V)
Le Schéma Électrique pour un canal (KiCad)
Pour piloter les MOSFETs directement en 3.3V, vous devez utiliser des modèles dits « Logic-Level ».
Le IRLZ44N est parfait, très courant et bon marché.
Voici les composants nécessaires pour une bobine d’aiguillage :
MOSFET : IRLZ44N (ou AO3400 en montage de surface SMD).
Résistance de Grille ((R_{G}\
La règle d’or avec les solénoïdes est l’impulsion brève. Si le code plante et laisse la sortie active, la bobine brûle (sauf si le CDU limite le courant de recharge, mais la prudence l’emporte).
#include <Arduino.h>
// Définition des broches GPIO de l'ESP32
const int PIN_AIGUILLAGE_DIRECT = 12;
const int PIN_AIGUILLAGE_DEVLE = 13;
// Temps d'impulsion en millisecondes (ajustable selon l'aiguillage, généralement entre 50 et 100ms)
const unsigned long DUREE_IMPULSION = 80;
// Structure pour gérer l'activation asynchrone
struct Solenoide {
int pin;
unsigned long activeDepuis;
bool enCours;
};
Solenoide bobineDirecte = {PIN_AIGUILLAGE_DIRECT, 0, false};
Solenoide bobineDeviee = {PIN_AIGUILLAGE_DEVLE, 0, false};
// Fonction pour déclencher un aiguillage
void actionnerAiguillage(Solenoide &bobine) {
if (!bobine.enCours) {
digitalWrite(bobine.pin, HIGH);
bobine.activeDepuis = millis();
bobine.enCours = true;
}
}
// Sécurité : Vérifie s'il faut couper le courant
void verifierSecuriteBobine(Solenoide &bobine) {
if (bobine.enCours && (millis() - bobine.activeDepuis >= DUREE_IMPULSION)) {
digitalWrite(bobine.pin, LOW);
bobine.enCours = false;
}
}
void setup() {
pinMode(bobineDirecte.pin, OUTPUT);
pinMode(bobineDeviee.pin, OUTPUT);
digitalWrite(bobineDirecte.pin, LOW);
digitalWrite(bobineDeviee.pin, LOW);
}
void loop() {
// Exemple d'action (déclenché par un bouton, du Wi-Fi ou du MQTT)
// actionnerAiguillage(bobineDirecte);
// Vérification permanente des timers de coupure
verifierSecuriteBobine(bobineDirecte);
verifierSecuriteBobine(bobineDeviee);
}