Mesure de l'intensité lumineuse avec le module LDR ESP32
Suivi en temps réel sur le moniteur série de la valeur brute de l'ADC du module LDR et du pourcentage relatif de luminosité calculé à partir de références dans l'obscurité et à la lumière. Ce pourcentage n'est pas une mesure en lux. Permet de comprendre le principe de calibrage du module. Il est préférable de réaliser cet exercice avant le projet 10, car il sert à déterminer la valeur seuil.

Vidéo
Schéma du circuit

Code source
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// Mesure de l'intensité lumineuse avec le module LDR ESP32
4// ─────────────────────────────────────────
5// Lit la sortie analogique (AO) du module LDR avec l'ADC 12 bits et la
6// convertit en pourcentage de lumière 0-100 avec les valeurs de
7// calibration. Le résultat est affiché dans le Moniteur série (115200
8// bauds) toutes les 0.5 s.
9//
10// Broches :
11// GPIO 34 (ESP32 classique) / GPIO 1 (ESP32-S2/S3) -> AO du module LDR
12// VCC du module LDR -> 3V3, GND -> GND
13
14#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)
15 const int LDR_PIN = 1; // ESP32-S2/S3 : ADC1_CH0
16#else
17 // ESP32 DevKit V1 classique : ADC1_CH6, entrée seule. Le GPIO 1 entre en conflit avec le TX série
18 // ici
19 const int LDR_PIN = 34;
20#endif
21
22// Calibration : mesure dans ta propre pièce et saisis les valeurs ici. Sur le module LDR, la
23// tension AO (et la valeur brute) BAISSE quand la lumière augmente.
24const int RAW_DARK = 4000; // Valeur brute dans le noir
25const int RAW_LIGHT = 100; // Valeur brute de la lumière
26
27void setup() {
28 Serial.begin(115200);
29 analogReadResolution(12); // Forcer 12 bits
30 Serial.println("LDR Okuma / LDR Reading");
31 Serial.println("-----------------------------");
32}
33
34void loop() {
35 int raw = analogRead(LDR_PIN);
36 // Limiter à la plage de calibration, sombre = 0 %
37 int clipped = constrain(raw, RAW_LIGHT, RAW_DARK);
38 int percent = map(clipped, RAW_DARK, RAW_LIGHT, 0, 100);
39
40 Serial.print("Raw: ");
41 Serial.print(raw);
42 Serial.print(" | Light: %");
43 Serial.println(percent);
44
45 delay(500);
46}
47FAQ
Quelles valeurs l'ADC de l'ESP32 renvoie-t-il ?▾
L'ADC de l'ESP32 est un convertisseur 12 bits qui renvoie des valeurs comprises entre 0 et 4095. Comme cette plage diffère de celle de l'Arduino Uno (0–1023), vous devez ajuster les seuils et les calculs en conséquence.
Les mesures analogiques sont faussées lorsque le Wi-Fi est activé, pourquoi ?▾
Sur l'ESP32, le canal ADC2 (GPIO 0, 2, 4, 12 à 15, 25 à 27) n'est pas disponible lorsque le Wi-Fi est activé. Le fait de connecter les capteurs analogiques aux broches ADC1 (GPIO 32 à 39) permet d'éviter ce problème.
La valeur affichée correspond-elle à la valeur réelle en lux ?▾
Non, ce code ne calcule pas de valeur en lux ; il affiche la valeur brute de l'ADC et un pourcentage relatif de luminosité basé sur les références choisies dans l'obscurité et à la lumière. La réponse du LDR n'est pas linéaire et varie d'un modèle à l'autre. Pour une mesure précise du lux, on utilise un capteur calibré, tel que le BH1750.
Pourquoi l'ADC de l'ESP32 donne-t-il des mesures erronées aux extrémités ?▾
L'ADC de l'ESP32 n'est pas linéaire dans les plages proches de 0 V et 3,3 V. La fonction `analogReadMilliVolts()` renvoie une valeur calibrée ; pour les mesures critiques, il est recommandé de l'utiliser dans la plage comprise entre 0,1 et 3,1 V afin d'obtenir les résultats les plus précis.
