Aller au contenu

Photorésistance (ou LDR) : symbole, caractéristiques, fonctionnement, et schéma de montage arduino

Tutorial photorésistance LDR avec théorie et pratique, montages, explications de fonctionnement et exemples avec photoresistor branché sur Arduino

Par définition, une photorésistance est un composant électronique dont la résistance varie en fonction de la luminosité auquel il est soumis. Oui, mais : quelle est la valeur de cette résistance en fonction de l’intensité lumineuse reçue ? Comment la raccorder au reste du circuit électronique ? Peut-on tirer du courant sur celle-ci comme on veut ? Eh bien, voila certaines des questions que je vous propose de découvrir aujourd’hui, au travers de cet article !

Comme toujours, nous verrons tout d’abord les notions de base se rattachant à ce composant, puis passerons aux caractéristiques techniques, pour enfin aborder son utilisation pratique (bien plus sympa !). À ce stade, je vous proposerai de découvrir des schémas de branchement typiques de photorésistances, notamment avec Arduino.

Ce contenu vous plaît ? Alors abonnez-vous à la Newsletter pour ne rien louper !

Ceci n’est pas un cours d’électronique à proprement parler, mais simplement une introduction-découverte à un composant électronique « de base ». C’est pourquoi certaines notions ne seront pas approfondies ici, afin de rester concentré sur « l’essentiel », tant d’un point de vue théorique, que pratique. Du reste, rappelez-vous que je ne suis pas un expert en ce domaine, et qu’il peut donc y avoir des imprécisions ou erreurs qui se sont glissées. D’ailleurs, n’hésitez pas à m’en faire part en commentaire, si c’est le cas ! Merci 😉

Module Description Lien
Ensemble de photorésistances à souder pour montages électroniques, plusieurs modèles possibles avec caractéristiques différentes Ensemble de photorésistances courantes
(GL5506, GL5516, GL5528, GL5537, GL5539, et GL5549)

Photorésistance (aussi appelée LDR) : définition, symbole, fonctionnement, et utilité en pratique

Comme vu en intro, une photorésistance (aussi appelée LDR, pour « Light Dependent Resistor », ou encore « Photoresistor ») est un composant électronique dont la valeur ohmique varie en fonction de la luminosité auquel il est soumis. Au passage, il ne faut pas la confondre avec une photodiode ou un phototransistor, qui sont des composants électroniques différents.

Au niveau d’un schéma électronique, voici comment on le symbolise (et aussi, à quoi il ressemble !) :

Symbole photorésistance, avec brochage de la LDR non polarisé, représentation électronique d'un photoresistor type GL 5528, avec photo composant

Comme vous pouvez le voir, il s’agit d’un composant comportant seulement 2 broches, sans polarité aucune (comme une résistance « classique », en somme).

Basiquement :

  • la valeur de cette résistance diminue lorsque la luminosité augmente
  • la valeur de cette résistance augmente lorsque la luminosité diminue

Sa valeur ohmique (résistivité) est donc faible en plein soleil, et élevée dans le noir (obscurité).

Sachant cela, il est donc tout naturel d’utiliser une photorésistance dans les cas suivants, qui sont des applications typiques de ce composant, en pratique :

  • détecteur jour/nuit
  • tracker solaire (pour panneaux photovoltaïques, par exemple)

Par contre, si vous souhaitez « précisément » mesurer la luminosité ambiante, mieux vaut alors vous tourner vers un circuit spécialisé (comme le BH1750, par exemple), plutôt que d’utiliser une « simple » photorésistance. Car cette dernière est vraiment peu précise, et donc vraiment pas fiable dans ce cas !

Caractéristiques principales et secondaires

La principale caractéristique d’une photorésistance est sa relation résistivité / luminosité. En fait, ceci donne la valeur ohmique de la photorésistance, en fonction de l’intensité lumineuse auquel elle est soumise.

D’ailleurs, voici un exemple de courbe caractéristique (résistivité / luminosité) :

Courbe caractéristique photorésistance selon lumière reçu par la LDR, valeur ohmique en fonction du jour ou de la nuit, de l'obscurité ou plein soleil, avec dessin

Comme vous pouvez le constater, la relation entre valeur ohmique et luminosité n’est pas linéaire. En clair, par exemple : si la luminosité est divisée par 2, alors la valeur ohmique ne sera pas multipliée par 2.

À noter que, à ma connaissance, les constructeurs ne communiquent généralement pas d’équation mathématique permettant de déterminer par calcul la valeur ohmique d’une photorésistance (qui d’ailleurs, dépend de nombreux facteurs). C’est pourquoi nous devons nous fier aux courbes caractéristiques, qu’ils veulent bien nous communiquer (avec toutes les imprécisions que cela peut comporter !).

Maintenant, pour bien visualiser à quoi correspondent les valeurs d’éclairement ci-dessus, exprimées en lux, voici un tableau indicatif, qui devrait vous aider :

Tableau ensoleillement en lux selon luminosité extérieure, valeur d'éclairement en fonction de la nuit, très nuageux, ciel couvert, ou en plein soleil

Cela étant dit, la caractéristique résistivité/luminosité n’est pas la seule chose à prendre en compte, lorsque vous cherchez un modèle de photorésistance adaptée à vos besoins. En effet, il faut également prendre en compte, quand bien même cela pourrait paraître secondaire :

  • la tension maximum supportable par cette LDR
  • la puissance dissipable par la LDR en elle-même (dont nous reparlerons un plus loin, car à ne surtout pas négliger)
  • la température supportable par le capteur (température de service)
  • le temps de réponse du capteur, lorsque la luminosité varie

Quelle photorésistance choisir ? (avec extrait datasheet des LDR série GL)

Comme vu précédemment, la caractéristique principale d’une LDR est celle qui donne sa résistance en fonction de l’éclairement. C’est donc tout naturellement que cela détermine principalement le choix d’un modèle de résistance plutôt qu’un autre (mais sans occulter pour autant les caractéristiques « secondaires » que nous venons de voir, au paragraphe précédent).

Pour vous illustrer tout cela, prenons le datasheet des photorésistances série GL (lien vers le datasheet LDR série GL), on remarque que le fabricant propose 6 déclinaisons, en fonction des besoins. C’est ainsi qu’on retrouve différentes références disponibles, selon la valeur ohmique souhaitée :

Caractéristiques électriques photorésistance type LDR modèle GL 5528, avec résistivité dans le noir ou à 10 ou 100 lux, gamma, tension et puissance maxi

À noter qu’ici, à l’aide du coefficient noté ɣ, on peut déterminer la valeur ohmique de cette photorésistance à 100 lux de lumière, à partir de la valeur donnée à 10 lux, dans le tableau. En effet :

→ comme ɣ = log(R10/R100), avec R10 la valeur ohmique de la photorésistance à 10 lux, et R100 sa valeur à 100 lux
→ alors 10ɣ = R10 / R100
→ d’où R100 = R10 / 10ɣ

Application numérique :

  • si on prend par exemple un modèle GL-5528, on note que R10 sera égale à 10k (si on prend la valeur basse), et que le coefficient ɣ sera égal à 0,6
  • alors la valeur ohmique sous 100 lux de lumière sera dans ce cas égale à :
    • R100 = R10 / 10ɣ
    • R100 = 10000 / 100,6
    • d’où R100 = 2512 Ω

Cela permet donc d’avoir une indication supplémentaire, quant à la valeur ohmique de ces photorésistances, à 100 lux d’éclairement.

Ainsi, cela nous permettra d’orienter notre choix vers tel ou tel modèle de photorésistance, sans oublier, encore une fois, les caractéristiques que l’on pourrait qualifier de secondaires, mais qui ont toutes leur importance (puissance max dissipable, plage de température d’utilisation, temps de réponse aux variations de luminosité, …).

Cela étant dit, ce choix se fera aussi en fonction des composants qui viendront aux alentours de cette photorésistance. Car effectivement, une LDR ne s’utilise pas seule, mais le plus souvent de paire avec une résistance fixe. C’est ce que je vous propose de découvrir à présent 😉

Comment brancher un capteur LDR, au sein d’un montage électronique ? (schéma)

Comme nous venons de le voir, une photorésistance est un composant électronique à 2 broches, dont la valeur ohmique varie avec la luminosité ambiante. Et un simple ohmmètre permet de mesurer cette valeur, lorsque cette LDR n’est reliée à rien d’autre.

Bien entendu, au sein d’un montage électronique, nulle question d’utiliser un ohmmètre. En fait, il va donc falloir trouver un moyen détourné, pour retrouver la valeur de cette photorésistance. Et c’est chose particulièrement facile, avec la loi d’ohm. En effet, comme celle-ci dit que « U = R * i », alors U peut être la tension de notre photorésistance, R sa valeur ohmique, et i le courant qui la traverse. Donc si on connaît U et i, alors on peut déterminer la valeur résistive de la LDR. Mais là, il faudra un voltmètre ET un ampèremètre, pour retrouver cette valeur.

Du coup, on préfère plutôt cette solution : créer un pont diviseur de tension. Ici, il s’agit simplement de mettre la LDR en série avec une résistance de valeur fixe, afin d’avoir une tension en point milieu qui varie en fonction de la résistivité de la photorésistance. Ainsi, comme nous connaissons la valeur de cette résistance fixe et de la tension qui les alimente, nous n’avons qu’à mesurer la tension du pont diviseur de tension pour déterminer la résistance de la LDR. Simple, non ?

En pratique, voila comment cela se traduit :

LDR dans pont diviseur de tension, pour retrouver valeur photorésistance en fonction de la luminosité extérieure, avec formules de calcul dans tuto photoresistor

Notez que la photorésistance peut être branchée aussi bien en amont (du côté du « + »), qu’en aval (du côté du « -« ). Seul change le comportement de la tension de sortie, dans ce cas.

Dans le 1er cas :

Comme Vs = Vcc * R / (R + LDR) dans ce cas, qui est la formule de base d’un pont diviseur de tension
alors Vs * (R + LDR) = Vcc * R
d’où Vs * R + Vs * LDR = Vcc * R
d’où Vs * LDR = Vcc * R – Vs * R
d’où Vs * LDR = R(Vcc – Vs)
d’où LDR = R*(Vcc – Vs) / Vs

Dans le 2ème cas :

Comme Vs = Vcc * LDR / (R + LDR) dans ce cas, qui est la formule de base d’un pont diviseur de tension
alors Vs * (R + LDR) = Vcc * LDR
d’où Vs * R + Vs * LDR = Vcc * LDR
d’où Vs * R = Vcc * LDR – Vs * LDR
d’où Vs * R = LDR (Vcc – Vs)
d’où LDR = Vs * R / (Vcc – Vs)

Comme vous pouvez le voir, on peut donc aisément déterminer la valeur ohmique d’une photorésistance, à partir de la tension mesurée en Vs, et en appliquant la formule adéquat (Vcc et R étant des constantes, fixes et connues à l’avance, seul Vs varie).

En résulte le tableau suivant :

Tableau valeur LDR branché en pont diviseur de tension, valeur ohmique de la photorésistance en fonction de l'ensoleillement, selon différents cas

Au final, on peut donc dire qu’un des meilleurs moyens de mesurer la valeur ohmique d’une photorésistance est de l’insérer dans un pont diviseur de tension. Ainsi, on obtient une tension qui varie en fonction de la luminosité ambiante. Par contre, côté précision de mesure, on perd forcément en qualité, du fait qu’on intègre un élément de plus (la résistance fixe notée R, qui a elle aussi sa propre tolérance, et ses propres variations, notamment en fonction de la température).

Module Description Lien
Ensemble de photorésistances à souder pour montages électroniques, plusieurs modèles possibles avec caractéristiques différentes Ensemble de photorésistances courantes
(GL5506, GL5516, GL5528, GL5537, GL5539, et GL5549)

Code arduino #1 : exemple de branchement photorésistance arduino, avec lecture de tension

Le premier exemple de montage à réaliser permet de déterminer la valeur ohmique d’une photorésistance, branchée au sein d’un pont diviseur de tension, en lisant la tension issue de ce dernier, via une entrée analogique d’Arduino. Cette valeur sera communiquée en temps réel, sur le moniteur série de l’IDE arduino.

En pratique, voici l’ensemble du montage à réaliser :

Branchement photorésistance arduino uno, avec mesure de l'éclairement reçu par la LDR GL5528, sur entrée analogique de l'ATmega328P, avec résistance

Au niveau des composants, voici ce que j’ai utilisé :

À noter que l’ensemble du montage sera alimenté par le câble USB de programmation de l’Arduino, qui permettra par la même de lire les valeurs retournées par ce dernier, via le moniteur série de l’IDE arduino.

Côté programme, voici ce que j’ai écrit, afin d’arriver au résultat souhaité :

/*
   ______               _                  _///_ _           _                   _
  /   _  \             (_)                |  ___| |         | |                 (_)
  |  [_|  |__  ___  ___ _  ___  _ __      | |__ | | ___  ___| |_ _ __ ___  _ __  _  ___  _   _  ___
  |   ___/ _ \| __|| __| |/ _ \| '_ \_____|  __|| |/ _ \/  _|  _| '__/   \| '_ \| |/   \| | | |/ _ \
  |  |  | ( ) |__ ||__ | | ( ) | | | |____| |__ | |  __/| (_| |_| | | (_) | | | | | (_) | |_| |  __/
  \__|   \__,_|___||___|_|\___/|_| [_|    \____/|_|\___|\____\__\_|  \___/|_| |_|_|\__  |\__,_|\___|
                                                                                      | |
                                                                                      \_|
  Fichier :       prgPhotoresistance-1-LectureTensionLdrAvecArduino.ino
  
  Description :   Programme permettant d'afficher, sur le moniteur série de l'IDE arduino, la valeur ohmique
                  de la photorésistance branchée sur l'entrée A0 d'un Arduino Uno (via un pont diviseur de tension)
                  
  Auteur :        Jérôme TOMSKI (https://passionelectronique.fr/)
  Créé le :       09.05.2022

*/

#define valeurDeLaResistanceFixe                      9970  // Mettre ici la "vraie" valeur (mesurée) de la résistance fixe de 10 kohms que vous allez utiliser
#define brocheEntreePointMilieuPontDiviseurDeTension  A0    // L'entrée A0 de l'arduino uno sera utilisée pour lire la tension en point milieu du pont diviseur
#define tensionAlimentationMicrocontroleurArduino     5     // Ici, on utilise un Arduino Uno, donc un modèle équipé du µC ATmega328P, fonctionnant sous 5 volts

int valeurDeLentreeAnalogique;          // Contiendra la valeur lue sur l'entrée analogique ; pour rappel, il s'agit d'une valeur 10 bits (0..1023)
float tensionDeLentreeAnalogique;       // Contiendra la valeur de calcul de tension, exprimée en volt, à partir de la "valeurDeLentreeAnalogique"
long valeurOhmiqueDeLaLDR;              // Contiendra la valeur ohmique calculée de la photorésistance, à partir de la "tensionDeLentreeAnalogique"
                                        // et de la résistance fixe (constante nommée "valeurDeLaResistanceFixe", dans ce programme)

// ========================
// Initialisation programme
// ========================
void setup() {

  // Initialise la liaison série (arduino uno -> PC)
  Serial.begin(9600);
  Serial.println(F("================================================================================"));
  Serial.println(F("PHOTORESISTANCE / Programme exemple 1"));
  Serial.println(F("- Lecture de la tension en point milieu du pont diviseur"));
  Serial.println(F("- Détermination de la valeur ohmique de la LDR"));
  Serial.println(F("================================================================================"));
  Serial.println("");

}

// =================
// Boucle principale
// =================
void loop() {
  
  // Lecture de l'entrée analogique (pour rappel, cela retourne une valeur sur 10 bits, comprise entre 0 et 1023)
  valeurDeLentreeAnalogique = analogRead(brocheEntreePointMilieuPontDiviseurDeTension);

  // Détermination de la tension présente sur l'entrée analogique
  tensionDeLentreeAnalogique = float(tensionAlimentationMicrocontroleurArduino * valeurDeLentreeAnalogique) / 1023;

  // Détermination de la valeur de la LDR, en fonction de la valeur de la résistance fixe, et de la tension précédemment trouvée
      // Nota : je reprends ici la formule de calcul développée un peu plus haut dans ce tuto, à savoir :
      //   → LDR = R*(Vcc – Vs) / Vs
      //   → d'où valLDR = R * (tensionAlimArduino – tensionEntreeAnalogique) / tensionEntreeAnalogique
  valeurOhmiqueDeLaLDR = valeurDeLaResistanceFixe * (tensionAlimentationMicrocontroleurArduino - tensionDeLentreeAnalogique) / tensionDeLentreeAnalogique;

  // Puis on affiche ces valeurs sur le moniteur série de l'interface arduino
  Serial.print(F("Tension au milieu du pont diviseur : "));
  Serial.print(tensionDeLentreeAnalogique);
  Serial.println(F(" V"));

  Serial.print(F("Estimation de la valeur de la LDR (par calcul) : "));
  Serial.print(valeurOhmiqueDeLaLDR);
  Serial.println(F(" ohms"));

  Serial.println("");

  // Et on reboucle cette fonction loop, après 5 secondes de "pause"
  delay(5000);
  
}

Au niveau du moniteur série de l’interface arduino, voici ce que j’ai relevé (en faisant un « maximum d’ombre » sur la LDR, puis en la mettant en « plein jour », afin de bien montrer l’impact en sortie) :

Lecture valeur ohmique photorésistance selon luminosité ambiante avec arduino uno, vue depuis moniteur série, avec tension divisée et calcul valeur

Remarque : avec ce programme, on s’aperçoit que la précision n’est pas extraordinaire, il faut bien l’avouer ! Car :

  • on passe par l’ADC 10 bits de l’Arduino (convertisseur analogique vers numérique) qui n’est pas forcément des plus précis
  • la tension d’alimentation USB 5V n’est jamais exactement à cette valeur (on peut donc être plus ou moins en-dessous, par exemple)
  • la résistance fixe de 10K ohms ne fait pas exactement 10k, car également en fonction de la température (entre autres choses)
  • les arrondis de calculs, au sein du code arduino, vont par ailleurs induire un manque de précision (et oui !)
  • et la photorésistance, elle aussi, est sensible à la chaleur (qui, par exemple en plein soleil, peut avoir par une valeur ohmique « altérée », comparé à la valeur attendue)

On le remarque d’ailleurs « dans le noir », où cette résistance était donnée à 1 Mohm par le constructeur. Or là, avec le programme qui « lit » une tension de 0,01 volt en point milieu du pont diviseur de tension, donnant une résistance de 3,3 Mohms (donc bien au-dessus de ce que spécifie le fabricant de cette photorésistance !).

Nota : pour le pont diviseur de tension, j’ai opté une résistance de 10k ohms. J’ai fait le choix d’une telle valeur :
– parce qu’elle correspond à la valeur donnée à 10 lux par le fabricant (ce qui ferait un pivot à Vcc/2 à cette éclairement donné)
– pour limiter le courant de façon suffisante (par soucis d’économie d’énergie, et vis à vis de la puissance max dissipable, dans la LDR en elle-même)

En parlant de la puissance maximum dissipable par la photorésistance, celle-ci est de (si on considère qu’en plein soleil, la LDR finit à 0 ohm) :

→ comme P = U² / R (formule de calcul de puissance, à partir de P = U * i, et de U = R * i)
→ alors P = 5² / (10000 + 0)
→ d’où P = 2,5 mW

En sachant qu’un modèle GL-5525 peut dissiper jusqu’à 100 mW, on est donc pleinement dans les clous, ici !

Bon… à présent : faisons évoluer ce montage, afin d’en faire une application plus concrète, et surtout, bien plus sympa ! Alors en route pour l’exemple suivant 😉

Module Description Lien
Ensemble de photorésistances à souder pour montages électroniques, plusieurs modèles possibles avec caractéristiques différentes Ensemble de photorésistances courantes
(GL5506, GL5516, GL5528, GL5537, GL5539, et GL5549)

Code arduino #2 : exemple de réalisation d’un interrupteur crépusculaire, avec pilotage relais arduino

Second exemple que je vous propose de découvrir ici, et qui illustre bien l’utilisation de photorésistances en pratique : l’interrupteur crépusculaire. Petite parenthèse pour ceux qui ne sauraient pas ce que c’est : un interrupteur crépusculaire est un système permettant la mise en route d’éléments électriques (un éclairage de nuit, par exemple), en fonction de la luminosité ambiante. En clair : cela permet par exemple de faire allumer un éclairage extérieur, une fois la nuit tombée, et de le couper automatiquement au lever du soleil, le lendemain.

Pour vous illustrer cela, je vous propose de voir ensemble le montage suivant, qui permet d’actionner un relais de puissance, en fonction d’un seuil de luminosité donné, qu’on aura soi-même défini à l’aide d’un potentiomètre :

Schéma interrupteur crépusculaire arduino nano, avec photorésistance 5528 en série avec résistance de 10k ohms, plus relais de puissance 230V éclairage extérieur

Au niveau des composants utilisés ici, les voici en détail :

Je ne vous préciserai ici aucune valeur pour le disjoncteur de protection côté courant alternatif, car cela est à choisir en fonction de installation, et de la charge que vous prévoyez d’alimenter. Au passage, ne vous approchez jamais du 230 VAC, à moins de savoir exactement ce que vous faites, pour tout éviter tout risque électrique (pouvant aller jusqu’à l’électrocution).

À noter que le modèle de relais utilisé ici se pilote « à l’envers », si je puis dire, car il faut lui envoyer « 0 volt » sur son entrée IN pour l’activer, et « +5V » pour le mettre au repos.

Au niveau du programme arduino, voici ce que j’ai rédigé, pour donner vie à cet interrupteur crépusculaire :

/*
   ______               _                  _///_ _           _                   _
  /   _  \             (_)                |  ___| |         | |                 (_)
  |  [_|  |__  ___  ___ _  ___  _ __      | |__ | | ___  ___| |_ _ __ ___  _ __  _  ___  _   _  ___
  |   ___/ _ \| __|| __| |/ _ \| '_ \_____|  __|| |/ _ \/  _|  _| '__/   \| '_ \| |/   \| | | |/ _ \
  |  |  | ( ) |__ ||__ | | ( ) | | | |____| |__ | |  __/| (_| |_| | | (_) | | | | | (_) | |_| |  __/
  \__|   \__,_|___||___|_|\___/|_| [_|    \____/|_|\___|\____\__\_|  \___/|_| |_|_|\__  |\__,_|\___|
                                                                                      | |
                                                                                      \_|
  Fichier :       prgPhotoresistance-2-InterrupteurCrepusculaire.ino
  
  Description :   Programme permettant de réaliser un interrupteur crépusculaire (éclairage de nuit, j'entends ici), à partir
                  d'une photorésistance GL-5528, d'un Arduino Nano, et d'un potentiomètre de fixation de seuil de basculement.
                  Un relais de puissance permettra de simuler l'actionnement du système, en fonction de l'éclairement.

  Fonctionnement : Dès qu'il fait nuit, le relais "colle", et permet d'allumer un éclairage nocture. Dès que le jour revient, tout s'éteint !
                  
  Auteur :        Jérôme TOMSKI (https://passionelectronique.fr/)
  Créé le :       09.05.2022

*/

#define brocheDentreePointMilieuPontDiviseurDeTension   A0    // L'entrée A0 de l'arduino nano sera utilisée pour lire la tension en point milieu du pont diviseur de tension
#define brocheDentreePointMilieuPotentiometre           A1    // L'entrée A1 de l'arduino nano sera utilisée pour lire la tension en point milieu du potentiomètre de réglage de seuil
#define brocheDeSortieRelaisDePuissance                 6     // La sortie D6 de l'arduino nano permettra d'actionner le relais de puissance

#define seuilHysteresisBasculementCrepusculaire         20    // Définition d'un hystérésis, afin que le relais ne se mette pas à "osciller", à proximité du seuil de basculement

int valeurAnalogiquePontDiviseurDeTension;    // Contiendra la valeur lue au niveau du pont diviseur de tension ; pour rappel, il s'agit d'une valeur 10 bits (0..1023)
int valeurAnalogiquePotentiometre;            // Contiendra la valeur lue au niveau du potentiomètre de réglage (idem : valeur 10 bits, donc variant de 0 à 1023)

boolean etatDuRelais;           // Contiendra l'état du relais (true ou false, selon si allumé ou éteint)

#define relaisEteint  false     // Indiquera que le relais est au repos
#define relaisAllume  true      // Indiquera que le relais est en marche


// ========================
// Initialisation programme
// ========================
void setup() {

  // Initialisation de la liaison série (arduino nano -> PC), si besoin de faire du débuggage (non indispensable)
  Serial.begin(9600);
  Serial.println(F("==================================================================================="));
  Serial.println(F("PHOTORESISTANCE - Programme exemple 2 : réalisation d'un interrupteur crépusculaire"));
  Serial.println(F("==================================================================================="));
  Serial.println("");

  // Définition de la broche attaquant le relais en "sortie"
  pinMode(brocheDeSortieRelaisDePuissance, OUTPUT);

  // On met le relais au repos au démarrage du programme, on attend une demi-seconde, et on passe à la boucle loop !
  eteindreRelais();
  delay(500);
}

// =================
// Boucle principale
// =================
void loop() {
  
  // Lecture des entrées analogiques (pour rappel, celles-ci retournent des valeurs sur 10 bits, donc comprises entre 0 et 1023)
  valeurAnalogiquePontDiviseurDeTension = analogRead(brocheDentreePointMilieuPontDiviseurDeTension);
  valeurAnalogiquePotentiometre = analogRead(brocheDentreePointMilieuPotentiometre);

  // Réduction des valeurs précédentes, en fonction de l'hystérésis (on passe d'une valeur 0…1023 à 0+hystérsis…1023-hytérésis)
  valeurAnalogiquePontDiviseurDeTension = map(valeurAnalogiquePontDiviseurDeTension, 0, 1023, 0+seuilHysteresisBasculementCrepusculaire, 1023-seuilHysteresisBasculementCrepusculaire);
  valeurAnalogiquePotentiometre = map(valeurAnalogiquePotentiometre, 0, 1023, 0+seuilHysteresisBasculementCrepusculaire, 1023-seuilHysteresisBasculementCrepusculaire);

  // Pour débuggage
  Serial.print(F("Valeur lue sur l'entrée analogique du pont diviseur de tension : "));
  Serial.println(valeurAnalogiquePontDiviseurDeTension);
  Serial.print(F("Valeur lue sur l'entrée analogique du potentiomètre : "));
  Serial.println(valeurAnalogiquePotentiometre);

  // Ensuite, on agit différemment selon si le relais est déjà allumé ou non (pour mise en oeuvre de l'hystérésis, pour éviter toute instabilité)
  switch(etatDuRelais) {
    
    // ================================ 
    // Cas où le relais est déjà éteint
    // ================================
    case relaisEteint :

      // Ici, on allume le relais, si la valeur du pont diviseur de tension passe en dessous de celle du potentiomètre (-hystérésis)
      if(valeurAnalogiquePontDiviseurDeTension < (valeurAnalogiquePotentiometre - seuilHysteresisBasculementCrepusculaire)) {
        Serial.println("→ mise en marche du relais");
        allumerRelais();
      }
      break;

    // ================================ 
    // Cas où le relais est déjà allumé
    // ================================
    case relaisAllume :
    
      // Ici, on éteint le relais, si la valeur du pont diviseur de tension dépasse celle du potentiomètre (+hystérésis)
      if(valeurAnalogiquePontDiviseurDeTension > (valeurAnalogiquePotentiometre + seuilHysteresisBasculementCrepusculaire)) {
        Serial.println("→ mise au repos du relais");
        eteindreRelais();
      }
      break;
  }
  
  // Et on reboucle cette fonction loop, après une petite "pause" à chaque passage
  delay(1500);
}

void allumerRelais() {
  // On met le relais en marche
  digitalWrite(brocheDeSortieRelaisDePuissance, LOW);       // Dans mon cas, il faut envoyer un état bas (0V) pour faire coller le relais
  etatDuRelais = relaisAllume; 
}

void eteindreRelais() {
  // On met le relais au repos
  digitalWrite(brocheDeSortieRelaisDePuissance, HIGH);      // Dans mon cas, il faut envoyer un état haut (+5V) pour mettre le relais au repos
  etatDuRelais = relaisEteint; 
}

Une fois uploadé dans votre arduino, vous n’aurez plus qu’à régler le potentiomètre à la valeur de basculement souhaitée, et faire vos essais. À partir de là :

  • s’il y a moins de luminosité que définit (moins un certain hystérésis), alors le relais s’enclenchera
  • s’il y a plus de luminosité que définit (plus un certain hystérésis), alors le relais se mettra au repos

Remarque : au sein du code arduino ci-dessus, j’ai laissé toutes mes lignes de débuggage. Ceci vous permettra également de suivre les différentes valeurs mesurées par l’arduino, aussi bien côté photorésistance, que du côté potentiomètre. Ainsi, vous comprendrez peut-être un peu mieux comment fonctionne ce programme. À noter que ce programme gère en automatique l’ajout ou le retrait d’un hystérésis, afin d’éviter toute instabilité du montage, au moment du basculement jour-nuit.

Du coup, si jamais vous laissez votre ordi branché à votre Arduino, et que vous ouvrez le moniteur série, vous devriez voir quelque chose de semblable à ceci (issu de mes essais) :

Moniteur série IDE arduino avec photorésistance servant à faire un interrupteur crépusculaire, données mesurées par Arduino Nano, pilotage relais de puissance 230 VAC

Au final, si vous utilisez les mêmes composants que moi, vous devriez voir :

  • la LED verte du relais s’allumer lorsque l’ensoleillement devient insuffisant, comparé à la consigne, cette dernière étant définie par le potentiomètre
  • la LED verte du relais s’éteindre lorsque l’éclairement devient supérieur à la consigne, qui est définie par le potentiomètre

Quelques remarques, au passage :

  • on aurait pu opter pour un potentiomètre logarithmique plutôt qu’un potentiomètre linéaire, afin de mieux coller à la caractéristique valeur ohmique/luminosité de la photorésistance (à voir, en pratique…)
  • on aurait pu ajouter un second potentiomètre de réglage (plus « fin »), de valeur moins importante que le premier, afin d’avoir un réglage plus fin de la consigne
  • l’ajout d’un détecteur de présence type PIR à ce montage, couplé à une temporisation, en ferait un « bon » système d’éclairage automatique nocturne (qui permettrait d’allumer une lumière pour un temps donné, en cas de présence, lorsqu’il fait nuit)

Et pour finir, une photo du montage que j’ai réalisé de mon côté, sur breadboard :

Photo montage interrupteur crépusculaire arduino avec relais de puissance, déclenchement selon luminosité mesurée par photorésistance LDR 5528

Avantages et inconvénients des LDR

Maintenant que nous avons vu des exemples d’application pratique, et avant de conclure, j’aimerai vous glisser quelques mots sur les avantages et inconvénients des photorésistances (LDR), en pratique.

Au niveau des avantages, je dirai que :

  • c’est un composant peu cher
  • très facile à mettre en œuvre
  • la sensibilité est vraiment élevée

Et au niveau des inconvénients, en voici quelques uns :

  • c’est un composant qui manque cruellement de précision (pouvant sans problème atteindre 40% « d’erreur », au niveau de la tolérance !), et sans parler du fait, qu’en plus, tout ceci varie également en fonction de la température …
  • sa réponse ohmique n’est pas linéaire, en fonction du flux lumineux reçu
  • sa « bande passante » est limitée (vis à vis du spectre lumineux, j’entends, même si c’est quelque chose que je n’ai pas détaillé ici)
  • vieilli mal avec le temps (oxydation si laissé à l’air libre, détérioration par échauffements excessifs si laissé en plein soleil, …)
Module Description Lien
Ensemble de photorésistances à souder pour montages électroniques, plusieurs modèles possibles avec caractéristiques différentes Ensemble de photorésistances courantes
(GL5506, GL5516, GL5528, GL5537, GL5539, et GL5549)

Tuto photorésistance : conclusion !

Nous voici au terme de cet article introductif aux photorésistances (LDR, en anglais). J’espère que vous aurez pu découvrir suffisamment de choses ici, afin que vous puissiez à l’avenir vous servir de ce composant, dans vos futurs montages ! À noter que je ne suis volontairement pas entré dans les détails ici, afin de ne pas vous noyer d’informations, pour rester « focus » sur l’essentiel 😉

Il est temps pour moi de vous laisser, et de vous dire à bientôt !
Jérôme.

À découvrir aussi : une introduction aux amplificateurs opérationnels !

Ce contenu vous plaît ? Alors abonnez-vous à la Newsletter pour ne rien louper !

(*) Mis à jour le 16/01/2024

16 commentaires sur “Photorésistance (ou LDR) : symbole, caractéristiques, fonctionnement, et schéma de montage arduino”

  1. Site passionelectronique.fr

    Merci pour ce tuto, très clair et bien intéressant.

    Une petite info, j’avais réalisé la fermeture/ouverture automatique de la porte d’un petit poulailler avec ce composant. Pour la mesure, il était a l’air libre. Mais au bout de quelques semaines, sans que je m’en aperçoive, il s’est fortement oxydé et a fini par ne plus fonctionner ! Le temps que je répare (je n’ai pas été très rapide), une fouine est venue me déguster trois de mes gentilles poules. Damned pas de chance.

    Depuis j’y ai mis trois photos résistances enfermées dans une petite bouteille de verre étanche, et ne déclenche une action qu’a partir de deux infos compatibles. Ça fonctionne sans problèmes depuis deux ans.

    Merci

    1. Site passionelectronique.fr

      Salut François,

      J’avoue que c’est une excellente idée d’avoir « doublé » (triplé, plus exactement) ce capteur, afin d’assurer le bon fonctionnement de l’ensemble, même en cas de défaillance d’un capteur !

      Après, rien ne t’empêche de changer toutes ces photorésistances au bout de 2 ans, pour plus de sécurité encore, vu le prix d’un lot de LDR de nos jours 😉

      En tout cas, merci pour ton retour !
      Jérôme.

  2. Site passionelectronique.fr

    Bonjour Jérôme,

    Article toujours aussi clair et pédagogique.
    J’ai toujours autant de plaisir à te lire.

    François

  3. Site passionelectronique.fr

    Bonjour Jérôme,

    Très bon article, assez complet pour comprendre et bien maîtriser la LDR.
    Un petit problème lié à sa mise en œuvre justement, limité par son oxydation à l’air libre.

    Merci encore une fois pour cet article digne d’une revue de vulgarisation d’électronique.

    Jean Basile

    1. Site passionelectronique.fr

      Salut Jean Basile !

      Je viens de m’apercevoir que j’avais oublié de le noter dans la liste des inconvénients des LDR … du coup, je complète ça de suite 😉
      Encore merci à toi !

      Jérôme.

  4. Site passionelectronique.fr

    Re-Bonjour Jérôme,

    Nous qui sommes à Madagascar (humide et chaud), c’est particulièrement embêtant d’utiliser la LDR qui pourtant, est pas chère et facile à mettre en œuvre.
    Je pense que la solution de François (l’enfermer dans une petite bouteille) me parait un bon compromis pour une réalisation pas trop compacte.

    Encore, merci Jérôme
    Jean Basile

  5. Site passionelectronique.fr

    Cela fait très longtemps que je n’ai pas eu à utiliser de LDR, mais cet article regroupe toutes les infos utiles, jusque l’application pure.

    Juste une idée : lister d’autres composants qui fonctionnent sur le même principe de mesure de résistance (CTN, …).
    Dans l’attente du prochain article !

    1. Site passionelectronique.fr

      Oui, bonne idée ! Mais il va falloir que j’arrive à me dégager du temps pour ça, pour entrer un minimum dans les détails de chacun de ces composants !

      À bientôt 😉
      Jérôme.

  6. Site passionelectronique.fr

    Bonjour,

    Dans le programme exemple 2, j’ai l’impression que tu comptes 2 fois le seuil hystérésis : une première fois avec la fonction map et une deuxième fois dans les boucles if. Est-ce nécessaire ?

    Merci
    Fabien

    1. Site passionelectronique.fr

      Salut Fabien,

      On pourrait effectivement croire qu’il y a doublon, mais en fait non. Pour faire simple :

      • le premier hystérésis, dans la fonction map, limite la valeur lue du potentiomètre entre la borne minimale « 0+hystérésis » et la borne maximale « 1023-hystérésis » (pour éviter ensuite le comparaison avec des nombres négatifs, ou supérieurs à 1023, lorsqu’on applique l’hystérésis)
      • le second hystérésis, dans la boucle if, permet que de comparer la valeur lue au niveau de la photorésistance avec + ou – l’hystérésis appliqué sur la valeur du potentiomètre ainsi rectifié

      Par contre, je comprends parfaitement ta question. Car la méthode que j’ai employé ici n’est franchement pas très claire, avec le recul … Peut-être y aurait-il eu une meilleure façon de faire les choses 😉

      Jérôme.

  7. Site passionelectronique.fr

    Bonjour Jérôme,

    D’abord, bravo pour ton article très complet et surtout très instructif !

    J’ai une question concernant ta partie 4 avec les deux cas pour le branchement de la LDR. Finalement, d’après ce que je comprends on peut utiliser indifféremment les deux cas pour un résultat identique en changeant simplement la condition avec le sens de l’inégalité dans le script. Or, j’ai parcouru pas mal d’articles et de livres et tous préconisent de faire le montage du cas 1 et, du coup, je ne comprends pas pourquoi ?

    Je te remercie par avance pour ta réponse
    Encore bravo pour tout !

    Chloé

    1. Site passionelectronique.fr

      Salut Chloé !

      Hum … là à froid, je ne vois pas pourquoi le cas 1 aurait la préférence « de tous ». Si ce n’est d’être plus « logique » pour le cas 1, d’un certain point de vue, en ce sens où :

      • plus la luminosité serait faible, et plus la tension de point milieu serait faible
      • plus la luminosité serait forte, et plus la tension de point milieu serait forte

      Par ailleurs, le cas 1 était peut-être plus pratique à une certaine époque, où on intégrait ça dans des circuits analogiques. Mais pour l’heure, avec nos circuits numériques (microcontrôleurs, etc), il est aisé d’inverser un signal, donc le câblage importe moins.

      Sinon je n’ai pas la réponse, ou quelque chose m’échappe ! Désolé…

      Bon courage à toi 😉
      Jérôme.

  8. Site passionelectronique.fr

    Bonjour Jérome

    Merci pour ces tutos tjs très clairs.

    Une petite question : quel est l’avantage d’utiliser l’argument F dans le serial.print ?
    Serial.print(F("Valeur lue sur l'entrée analogique du pont diviseur de tension : "));

    Merci d’avance pour ta réponse.
    j’ai vu qu’il s’agissait d’utiliser la mémoire flash ????

    1. Site passionelectronique.fr

      Salut Lucien !

      En fait, juste avant qu’un programme arduino démarre, les chaînes de caractères sont « automatiquement copiées » en mémoire RAM. Et comme la mémoire RAM (2 Ko) est « bien plus » limitée que la mémoire programme (32 Ko), sur un Arduino Uno ou Nano (µC ATmega328P), il faut veiller à ne pas saturer cette mémoire RAM (ce qui arrive « très vite », lorsque sont logées des chaînes de caractères dedans).

      La solution ? Utiliser la fonction « F », qui indique au compilateur que les chaînes de caractères ciblées dans notre programme ne doivent pas être recopiées en mémoire RAM. Elles seront donc uniquement présentes en mémoire FLASH (mémoire programme de l’arduino).

      Ainsi, cela permet d’économiser la place prise dans la mémoire RAM, lorsqu’on est limité (même si, dans le cas précis, je me sers juste de cette fonction « F » par habitude, et non par nécessité ici).

      Voilà !
      Jérôme.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Symbole danger point d'exclamation site PSE, triangle jaune avec contour noir, texte noir alerte au milieuAfin de filtrer au maximum les messages de type "spam" ou "inappropriés", chaque commentaire est soumis à modération, et validé manuellement. Du coup, il se peut que certains commentaires ne soient pas publiés, ou sinon, avec un peu de retard. Par ailleurs, j'ai malheureusement plus de messages à traiter que de temps pour y répondre ; c'est pourquoi je ne pourrais pas répondre à tout le monde. Désolé …

Étiquettes: