Arduino & Optocoupleurs NeoPixel : Contrôle Efficace de Multiples Relais sur une Seule Broche
Composants et fournitures
| Bandeau LED NeoPixel WS2812B (5050 RGB, adressables individuellement) – ex. bande 5m 300 LED (60 LED/m), découper 10 LED (4 utilisées) | 1 |
| Résistances 27 kΩ (en série avec chaque LDR) | 4 |
| Photorésistances (LDR – Light Dependent Resistor) | 4 |
| Module relais 5V (4 canaux) – ex. RobotGeek ou équivalent Conrad 095841 | 4 |
| Lampe LED 230V (pour test) | 1 |
| Arduino UNO / NodeMCU ESP32 (tout modèle Arduino compatible) | 1 |
Outils nécessaires
- Fer à souder
- Outils courants (disponibles dans tout atelier/foyer)
Applications et services
- Vidéo de démonstration
À propos de ce projet
Ce projet montre comment contrôler plusieurs relais (ou autres actionneurs) depuis une seule broche de sortie Arduino.
Cette solution s'applique quand le nombre de broches de sortie disponibles est insuffisant pour piloter plusieurs actionneurs (relais, etc.) en parallèle.
Principe de fonctionnement
On utilise un bandeau de NeoPixels (LED SMD5050 avec contrôleur WS2812B intégré). Chaque pixel est associé à une photorésistance (LDR), formant un optocoupleur « fait maison ». On peut ainsi créer autant d'optocoupleurs que de LED disponibles (ex. 300 sur une bande 5m), limité par l'alimentation 5V.
Chaque LED est adressée individuellement depuis une seule broche Arduino. Chaque LDR (en série avec une résistance 27 kΩ) commande un relais 5V. C'est une conversion série → parallèle (1 vers N).
Au lieu de relais, d'autres actionneurs peuvent être pilotés via les LDR comme entrées de n'importe quel circuit.
Dans ce projet (partie d'un ensemble plus vaste), un ESP32 NodeMCU est utilisé, mais un Arduino Uno (ou presque tout autre modèle) fonctionne tout aussi bien.
Étape 1 : Fabrication des optocoupleurs NeoPixel
Matériaux :
- Morceau de bande LED de 10 WS2812 (découpé d'une bande plus longue) – 4 utilisés ici
- Mousse grise foncée (isolant optique)
- Bande de breadboard
- Ruban adhésif noir (duct tape)


Important : L'espacement des LDR correspond à celui des LED. Il est crucial d'isoler optiquement chaque couple LED/LDR pour éviter le « crosstalk » (fuite de lumière vers les LDR voisins). En pratique, c'est quasi impossible à éliminer totalement ; le niveau de lumière des LED « allumées » est donc réduit au minimum dans le logiciel, juste suffisant pour déclencher le relais via le LDR.

La bande fait 10 LED mais seulement 4 couples LED/LDR sont utilisés (simplicité).
Étape 2 : Montage électronique
Le montage sur breadboard utilise un ESP32s (NodeMCU), mais tout Arduino convient.


Une seule broche de sortie contrôle 4 relais en parallèle. Ce nombre peut monter jusqu'à 300 (longueur bande 5m).
L'ESP32 fonctionne en logique 3,3V (régulateur intégré), la bande NeoPixel en 5V. L'ESP32 est alimenté en 5V via USB (adaptateur ou powerbank). Les NeoPixels prennent le 5V directement sur la broche 5V de l'ESP32 ; les relais sont aussi en 5V.
Dans cet exemple, 4 circuits optocoupleurs pilotent 4 relais commandant chacun une lampe 230V.
Broche de sortie : GPIO 21 ; relais pilotés via pixels n° 1, 2, 3, 4.
Étape 3 : Logiciel
La fonction loop() enchaîne des boucles for pour démontrer différents séquencements de commutation des lampes via les relais.
Pour commander un relais précis, on appelle :
void ControlRelais(int RelaisNo, bool RelaisState) {
strip.setPixelColor(RelaisNo, RelaisState*15, RelaisState*15, RelaisState*15);
strip.show();
Serial.print(" RelaisNo ");
Serial.print(RelaisNo);
Serial.print(" = ");
Serial.println(RelaisState);
}
Cette fonction allume/éteint une LED spécifique. L'adresse LED correspond au numéro de relais. L'intensité est faible (valeur 15/255) – juste assez pour déclencher le LDR, évitant le crosstalk lumineux.
Le résultat est visible dans la vidéo de démonstration.
Code complet
/* Contrôle multiples relais/actionneurs depuis 1 broche Arduino
Développé par Pierre Pennings (décembre 2018)
Licence GPL3+ */
#include <Adafruit_NeoPixel.h>
#define NUM_LEDS 10
const int RelaisPin = 21; // GPIO 21 sur ESP32 (adapter selon carte)
int RelaisNo = 0;
bool RelaisState = false;
int r = 0;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, RelaisPin, NEO_RGB + NEO_KHZ800);
void setup() {
Serial.begin(115200);
pinMode(RelaisPin, OUTPUT);
strip.begin();
// Test LEDs au démarrage
for (int t = 0; t < 10; t++) {
strip.setPixelColor(t, 15, 15, 15); // Blanc faible
strip.show();
delay(500);
strip.setPixelColor(t, 0, 0, 0);
}
}
void loop() {
// Séquence 1 : allumage séquentiel 1→4
for (int r = 1; r < 5; r++) {
delay(500);
ControlRelais(r, true);
delay(500);
ControlRelais(r, false);
}
// Séquence 2 : allumage séquentiel 4→1
for (int k = 4; k > 0; k--) {
delay(500);
ControlRelais(k, true);
delay(500);
ControlRelais(k, false);
}
// Séquence 3 : motifs croisés
for (int r = 1; r < 5; r++) {
for (int k = 4; k > 0; k--) {
delay(500);
ControlRelais(r, true);
ControlRelais(k, true);
delay(500);
ControlRelais(r, false);
ControlRelais(k, false);
}
}
}
void ControlRelais(int RelaisNo, bool RelaisState) {
strip.setPixelColor(RelaisNo, RelaisState*15, RelaisState*15, RelaisState*15);
strip.show();
Serial.print(" RelaisNo ");
Serial.print(RelaisNo);
Serial.print(" = ");
Serial.println(RelaisState);
}
Schémas
Fichier Fritzing : neopixel_optocoupler_relais__hNIrhGIMtD.fzz
Processus de fabrication
- Créer des effets audio pilotés par capteurs avec le kit Satellite CCRMA
- Panneau de contrôle Arduino Nano pour Flight Simulator 2020 – Affichage LCD et CDI
- Panneau commutateurs et LED pour Microsoft Flight Simulator 2020 basé sur Arduino
- Affichage LED Interactif Gyroscopique avec Anneau NeoPixel et Arduino
- Stores intelligents : contrôle automatisé de la lumière avec Arduino et énergie solaire
- Contrôler une LED par Bluetooth avec Arduino et MIT App Inventor
- Capteur d'obstacle IR simple avec Arduino — LED IR + Photodiode
- Contrôlez votre Roomba Create 2 avec Arduino et Android – Guide pas à pas
- Construire un robot quadrupède Arduino intelligent : guide étape par étape