Contrôler la Luminosité de LEDs par PWM avec un Bouton Poussoir sur Arduino Mega
Composants et Fournitures
| Composant | Quantité | Notes |
|---|---|---|
| Arduino Mega 2560 | 1 | |
| Plaque d'essai (breadboard) | 1 | |
| Fils de liaison (jumper wires) | 11 | Selon méthode de câblage |
| LED (générique) | 3 | 3 couleurs différentes recommandées |
| Bouton poussoir 12 mm (SparkFun) | 1 | |
| Résistance 330 Ω | 4 | 3 pour LEDs + 1 pour pull-down bouton |
Applications et Services en Ligne
- Arduino IDE
À Propos du Projet
Ce tutoriel progressif en trois étapes vous apprend à faire varier l'intensité de LEDs (fondu/« fade ») grâce à la modulation de largeur d'impulsion (PWM) sur Arduino :
- Fade simple : enchaînement automatique rouge → jaune → vert → jaune
- Fade déclenché par bouton : une pression lance la séquence
- Fade réactif : la séquence s'arrête dès que le bouton est relâché
Étape 1 : Fade Simple (Séquence Automatique)
Schéma
Les trois LEDs sont connectées sur des pins PWM : D9 (rouge), D6 (jaune), D3 (vert). Chaque anode via une résistance 330 Ω, cathodes au GND.
Code
On définit les pins, on les configure en sortie, puis dans loop() on utilise deux boucles for par LED : montée 0→255 puis descente 255→0, avec analogWrite() et un délai constant.
int ledRed = 9;
int ledYellow = 6;
int ledGreen = 3;
const int fadeDelay = 10; // ms entre chaque pas (vitesse du fondu)
void setup() {
pinMode(ledRed, OUTPUT);
pinMode(ledYellow, OUTPUT);
pinMode(ledGreen, OUTPUT);
}
void loop() {
// Rouge
for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); delay(fadeDelay); }
for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); delay(fadeDelay); }
// Jaune
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fadeDelay); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fadeDelay); }
// Vert
for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); delay(fadeDelay); }
for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); delay(fadeDelay); }
// Jaune (retour)
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fadeDelay); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fadeDelay); }
}
Astuce : la constante fadeDelay permet de modifier la vitesse globalement sans toucher à chaque delay().
Étape 2 : Fade Déclenché par Bouton Poussoir
Schéma
Ajout d'un bouton poussoir sur D7 (pull-down 10 kΩ vers GND, ou utilisation de INPUT_PULLUP avec logique inversée). Les LEDs restent sur D9, D6, D3.
Code
On extrait la séquence de fondu dans une fonction fadeLights(). Dans loop(), on détecte une pression (avec anti-rebond logiciel 15 ms) pour l'appeler. Si le bouton n'est pas pressé, la LED verte reste allumée (état par défaut).
int ledRed = 9, ledYellow = 6, ledGreen = 3;
int button = 7;
const int fadeDelay = 10;
void setup() {
pinMode(ledRed, OUTPUT);
pinMode(ledYellow, OUTPUT);
pinMode(ledGreen, OUTPUT);
pinMode(button, INPUT); // ou INPUT_PULLUP avec câblage inverse
digitalWrite(ledRed, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledGreen, HIGH); // état initial : vert allumé
}
void loop() {
if (digitalRead(button) == HIGH) {
delay(15); // anti-rebond
if (digitalRead(button) == HIGH) {
fadeLights(); // lance la séquence complète
}
} else {
digitalWrite(ledRed, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledGreen, HIGH);
}
}
void fadeLights() {
// Vert s'éteint
for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); delay(fadeDelay); }
// Jaune monte/descend
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fadeDelay); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fadeDelay); }
// Rouge monte/descend
for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); delay(fadeDelay); }
for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); delay(fadeDelay); }
// Jaune monte/descend
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fadeDelay); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fadeDelay); }
// Vert rallume
for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); delay(fadeDelay); }
}
⚠ Une fois fadeLights() lancée, elle s'exécute entièrement même si on relâche le bouton.
Étape 3 : Fade Réactif (Arrêt au Relâchement du Bouton)
Schéma
Identique à l'étape 2.
Code
On remplace les delay(fadeDelay) par une boucle active qui teste l'état du bouton à chaque micro-itération. Si le bouton est relâché (LOW), return quitte immédiatement fadeLights() et le else du loop() rétablit l'état par défaut (vert allumé).
int ledRed = 9, ledYellow = 6, ledGreen = 3;
int button = 7;
// const int fadeDelay = 10; // plus nécessaire
void setup() {
pinMode(ledRed, OUTPUT);
pinMode(ledYellow, OUTPUT);
pinMode(ledGreen, OUTPUT);
pinMode(button, INPUT);
digitalWrite(ledRed, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledGreen, HIGH);
}
void loop() {
if (digitalRead(button) == HIGH) {
delay(15);
if (digitalRead(button) == HIGH) {
fadeLights();
}
} else {
digitalWrite(ledRed, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledGreen, HIGH);
}
}
void fadeLights() {
// Vert s'éteint
for (int i = 255; i >= 0; i--) {
analogWrite(ledGreen, i);
for (int y = 0; y < 1000; y++) if (digitalRead(button) == LOW) return;
}
// Jaune monte
for (int i = 0; i <= 255; i++) {
analogWrite(ledYellow, i);
for (int y = 0; y < 400; y++) if (digitalRead(button) == LOW) return;
}
// Jaune descend
for (int i = 255; i >= 0; i--) {
analogWrite(ledYellow, i);
for (int y = 0; y < 400; y++) if (digitalRead(button) == LOW) return;
}
// Rouge monte
for (int i = 0; i <= 255; i++) {
analogWrite(ledRed, i);
for (int y = 0; y < 1000; y++) if (digitalRead(button) == LOW) return;
}
// Rouge descend
for (int i = 255; i >= 0; i--) {
analogWrite(ledRed, i);
for (int y = 0; y < 1000; y++) if (digitalRead(button) == LOW) return;
}
// Jaune monte
for (int i = 0; i <= 255; i++) {
analogWrite(ledYellow, i);
for (int y = 0; y < 400; y++) if (digitalRead(button) == LOW) return;
}
// Jaune descend
for (int i = 255; i >= 0; i--) {
analogWrite(ledYellow, i);
for (int y = 0; y < 400; y++) if (digitalRead(button) == LOW) return;
}
// Vert rallume
for (int i = 0; i <= 255; i++) {
analogWrite(ledGreen, i);
for (int y = 0; y < 1000; y++) if (digitalRead(button) == LOW) return;
}
}
Note : les boucles internes (y < 1000 ou 400) remplacent delay() ; leur nombre détermine la durée apparente de chaque pas. Ajustez selon la réactivité souhaitée.
Codes Complets
1. Fade Simple
int ledRed = 9; int ledYellow = 6; int ledGreen = 3; const int fade = 10;
void setup() { pinMode(ledRed, OUTPUT); pinMode(ledYellow, OUTPUT); pinMode(ledGreen, OUTPUT); }
void loop() {
for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
}
2. Fade avec Bouton
int ledRed = 9; int ledYellow = 6; int ledGreen = 3; int button = 7; const int fade = 10;
void setup() {
pinMode(ledRed, OUTPUT); pinMode(ledYellow, OUTPUT); pinMode(ledGreen, OUTPUT);
pinMode(button, INPUT);
digitalWrite(ledRed, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledGreen, HIGH);
}
void loop() {
if (digitalRead(button) == HIGH) { delay(15); if (digitalRead(button) == HIGH) fadeLights(); }
else { digitalWrite(ledRed, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledGreen, HIGH); }
}
void fadeLights() {
for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); delay(fade); }
}
3. Fade Réactif (Amélioration Délai)
int ledRed = 9; int ledYellow = 6; int ledGreen = 3; int button = 7; const int fade = 10;
void setup() {
pinMode(ledRed, OUTPUT); pinMode(ledYellow, OUTPUT); pinMode(ledGreen, OUTPUT);
pinMode(button, INPUT);
digitalWrite(ledRed, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledGreen, HIGH);
}
void loop() {
if (digitalRead(button) == HIGH) { delay(15); if (digitalRead(button) == HIGH) fadeLights(); }
else { digitalWrite(ledRed, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledGreen, HIGH); }
}
void fadeLights() {
for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); for (int y = 0; y < 1000; y++) if (digitalRead(button) == LOW) return; }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); for (int y = 0; y < 400; y++) if (digitalRead(button) == LOW) return; }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); for (int y = 0; y < 400; y++) if (digitalRead(button) == LOW) return; }
for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); for (int y = 0; y < 1000; y++) if (digitalRead(button) == LOW) return; }
for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); for (int y = 0; y < 1000; y++) if (digitalRead(button) == LOW) return; }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); for (int y = 0; y < 400; y++) if (digitalRead(button) == LOW) return; }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); for (int y = 0; y < 400; y++) if (digitalRead(button) == LOW) return; }
for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); for (int y = 0; y < 1000; y++) if (digitalRead(button) == LOW) return; }
}
Schémas
Processus de fabrication
- Construire un jeu gyroscopique temps réel avec Arduino Nano et capteur MPU-6050
- Système de pointage RFID fiable avec Arduino et Python (base de données phpMyAdmin)
- Projet capteur DHT11 température/humidité avec indicateurs LED et buzzer piézo
- Construire un dispositif de lévitation ultrasonique avec Arduino – Guide étape par étape
- Unopad : contrôleur MIDI Arduino fluide pour Ableton Live
- Système d'arrosage automatique pour plantes piloté par Arduino
- Capteur d'obstacle IR simple avec Arduino — LED IR + Photodiode
- Find Me : Localisateur d'objets intelligent avec Arduino et Bluetooth
- Contrôle de ventilateur PWM 4 broches 25 kHz avec Arduino Uno – Construction, code et test