Dans ce tutoriel, vous apprendrez à utiliser le capteur de proximité et de lumière APDS-9930 avec un Arduino ou tout autre microcontrôleur courant (ESP32/ESP8266).
L’APDS-9930 est un capteur très petit souvent utilisé dans les smartphones et tablettes pour l’ajustement automatique de la luminosité de l’écran et la détection de proximité lors des appels. Vous pouvez également l’utiliser comme détecteur de gestes simple qui active des lumières ou d’autres appareils lorsque vous agitez la main devant lui.
Pièces requises
Pour ce projet, vous aurez besoin d’un capteur APDS-9930 et d’un microcontrôleur. J’ai utilisé un Arduino Uno, mais tout autre Arduino ou ESP32/ESP8266 fonctionnera également, tant qu’il fournit une sortie d’alimentation 3,3 V.

Capteur APDS-9930

Arduino Uno

Câble USB pour Arduino UNO

Jeu de fils Dupont

Plaque d’essai (breadboard)
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Caractéristiques du capteur de proximité et de lumière APDS-9930
L’APDS-9930 est un capteur minuscule (3,94 x 2,36 x 1,35 mm) pour la détection de proximité et la mesure numérique de la lumière ambiante. L’image ci-dessous montre le verso et le recto de la puce APDS-9930.

Le capteur mesure la proximité d’un objet en émettant une impulsion IR via la LED IR intégrée et en mesurant l’intensité de la lumière réfléchie. La lumière ambiante est détectée par deux photodiodes. Une photodiode détecte la lumière visible plus infrarouge (Ch0) et l’autre détecte uniquement l’infrarouge (Ch1). Un microprocesseur intégré combine les deux signaux pour calculer un niveau de lumière ambiante (ALS) qui approxime la réponse de l’œil humain. Voir l’image ci-dessous avec le schéma fonctionnel de l’APDS-9930 :

L’APDS-9930 vous permet également de définir des seuils supérieurs et inférieurs pour les valeurs de lumière et de proximité, et envoie un signal d’interruption (INT) si ces seuils sont dépassés. Pour la communication et la programmation, l’APDS-9930 dispose d’une interface I2C (SCL, SDA).
La liste suivante résume les principales caractéristiques de l’APDS-9930 :
- Mesure de la lumière ambiante (ALS)
- Réponse visuelle humaine approximative
- Capacité d’interruption programmable avec seuils supérieurs et inférieurs
- Résolution jusqu’à 16 bits
- Fonctionnement haute sensibilité derrière un verre teinté
- Performance basse luminosité à 0,1 lux
- Détection de proximité
- Entièrement calibré pour une détection jusqu’à 100 mm
- LED infrarouge intégrée et pilote LED synchrone
- Élimine la calibration usine du capteur de proximité
- Minuterie d’attente programmable
- Consommation en mode attente – typiquement 90 μA
- Plage programmable de 2,7 ms à plus de 8 secondes
- Interface compatible I2C
- Jusqu’à 400 kHz (mode rapide I2C)
- Broche d’interruption dédiée
- Consommation en mode veille – typiquement 2,2 μA
Pour plus d’informations détaillées, consultez la fiche technique liée ci-dessous :
Carte breakout pour APDS-9930
La puce APDS-9930 est trop petite pour être connectée directement à un Arduino. En général, vous aurez besoin d’une carte breakout comme celle montrée ci-dessous :

Les cartes breakout pour l’APDS-9930 ont généralement six broches :
- VCC: Alimentation (2,4 – 3,6 V)
- GND: Masse
- VL: Alimentation de la LED IR
- SDA: Signal de données I2C
- SCL: Signal d’horloge I2C
- INT: Broche d’interruption
Dans la plupart des cas, vous n’aurez besoin que des broches d’alimentation (VCC, GND) et des broches pour la communication I2C (SCL, SDA). La broche INT s’active si la lumière ambiante ou la proximité dépasse les seuils programmables.
VL vous permet d’alimenter la LED IR en externe. Au dos de la carte breakout, il y a un cavalier à souder que vous devez fermer si vous souhaitez utiliser VL pour l’alimentation de la LED IR.
Notez que l’APDS-9930 fonctionne en 3,3 V et que la plupart des cartes breakout n’ont généralement pas de régulateur de tension. Cela signifie que vous devez connecter VCC à 3,3 V et ne pouvez pas utiliser la sortie 5 V d’un Arduino !
Connexion de l’APDS-9930 à l’Arduino
Grâce à l’interface I2C de l’APDS-9930, le connecter à un Arduino est simple. D’abord, connectez la broche SCL de la carte breakout APDS-9930 à A5 de l’Arduino. De même, connectez SDA à A4 de l’Arduino. Ensuite, connectez la masse à GND et le 3,3 V à VCC de l’APDS-9930.

Assurez-vous d’utiliser 3,3 V comme alimentation. Le capteur APDS-9930 n’est pas conçu pour du 5 V et les cartes breakout typiques pour l’APDS-9930 ne possèdent pas de régulateur de tension.
Installation de la bibliothèque APDS-9930
Avant de pouvoir utiliser l’APDS-9930, nous devons installer une bibliothèque. La seule bibliothèque que j’ai trouvée est celle de APDS-9930 Library par Depau, qui n’est plus maintenue mais fonctionne toujours bien. Pour l’installer, allez dans le repo et cliquez sur le bouton vert « Code ». Puis cliquez sur « Download Zip » comme montré ci-dessous :

Ensuite, allez dans « Sketch » -> « Include Library » -> « Add .Zip Library.. » et sélectionnez le fichier « APDS9930-master.zip » que vous venez de télécharger :

Alternativement, vous pouvez simplement télécharger tout le code du dépôt, le zipper, puis inclure la bibliothèque de la même manière que décrite ci-dessus. Maintenant, nous sommes prêts à écrire du code.
Mesurer la lumière ambiante avec l’APDS-9930
Le code suivant lit les mesures de lumière ambiante du capteur APDS-9930.
#include "Wire.h"
#include "APDS9930.h"
APDS9930 sensor = APDS9930();
void setup() {
Serial.begin(9600);
sensor.init();
sensor.enableLightSensor(false);
delay(500);
}
void loop() {
static float light = 0;
if (sensor.readAmbientLightLux(light)) {
Serial.print("light:");
Serial.println(light);
}
delay(500);
}
Nous commençons par inclure les bibliothèques nécessaires et créer l’objet capteur. Dans la fonction setup, le capteur est initialisé et le capteur de lumière activé.
Le false dans enableLightSensor(false) signifie que nous n’utilisons pas d’interruptions lors de la mesure de la lumière ambiante. Vous pouvez connecter la sortie INT de l’APDS-9930 à une entrée digitale de l’Arduino et activer une routine de service d’interruption (ISR) lorsqu’un certain niveau de lumière est détecté. L’APDS-9930 dispose de example code pour cela.
Dans la fonction loop, nous lisons le niveau de lumière via readAmbientLightLux(light) et, si la lecture réussit, l’affichons sur le moniteur série. Voici quelques exemples de mesures :

Et si vous ouvrez le traceur série et pointez l’APDS-9930 vers une source lumineuse, par exemple une lampe de bureau dans ce cas, vous devriez voir un pic dans le graphique :

Mesurer la proximité avec l’APDS-9930
L’APDS-9930 détecte la proximité d’un objet en envoyant une impulsion IR depuis la LED IR interne et en mesurant la quantité d’énergie IR réfléchie. Plus l’objet est proche, plus l’énergie réfléchie est importante.
Le code pour mesurer la proximité est très similaire à celui pour mesurer la lumière ambiante. Les deux seules différences sont que nous appelons enableProximitySensor(false), dans la fonction setup et readProximity(proximity) dans la fonction loop. Voir l’exemple ci-dessous :
#include "Wire.h"
#include "APDS9930.h"
APDS9930 sensor = APDS9930();
void setup() {
Serial.begin(9600);
sensor.init();
sensor.enableProximitySensor(false);
delay(500);
}
void loop() {
static uint16_t proximity = 0;
if (sensor.readProximity(proximity)) {
Serial.print("proximity:");
Serial.println(proximity);
}
delay(500);
}
Comme précédemment, le false dans enableProximitySensor(false) signifie que nous n’utilisons pas d’interruptions mais lisons continuellement les valeurs de proximité. Les valeurs typiques de proximité varient entre environ 300 (aucun objet) et 1023 lorsque l’objet est très proche.
Si vous ouvrez le traceur série et placez votre main plusieurs fois plus près ou plus loin du capteur, vous devriez voir un motif ondulant similaire à celui montré ci-dessous :

Mesurer la proximité et la lumière avec l’APDS-9930
Enfin, nous pouvons évidemment mesurer la proximité et les niveaux de lumière ambiante en même temps. L’exemple de code ci-dessous active le capteur de proximité et de lumière dans la fonction setup et lit les valeurs de proximité et de lumière dans la fonction loop :
#include "Wire.h"
#include "APDS9930.h"
APDS9930 sensor = APDS9930();
void setup() {
Serial.begin(9600);
sensor.init();
sensor.enableProximitySensor(false);
sensor.enableLightSensor(false);
}
void loop() {
static uint16_t proximity = 0;
static float light = 0;
if (sensor.readProximity(proximity)) {
Serial.print("proximity:");
Serial.println(proximity);
}
if (sensor.readAmbientLightLux(light)) {
Serial.print("light:");
Serial.println(light);
}
delay(500);
}
Si vous exécutez ce code et regardez le traceur série, vous remarquerez que le capteur de lumière et le capteur de proximité montrent un comportement corrélé négativement. Voir l’image ci-dessous.

Cela s’explique par le fait que, si vous approchez la main du capteur, la valeur de proximité est élevée mais, puisque la main bloque la lumière ambiante, le niveau de lumière mesuré est faible. Inversement, s’il n’y a pas d’objet proche du capteur, la valeur de proximité est faible, mais le niveau de lumière est plus élevé (en supposant qu’il y ait de la lumière).
Réglage automatique de la luminosité avec l’APDS-9930
Pour notre dernier exemple, implémentons l’application typique de l’APDS-9930. Nous activons une LED si un objet (main) est proche du capteur et ajustons la luminosité de la LED en fonction des niveaux de lumière ambiante.
Pour cela, il suffit d’ajouter une LED à notre circuit. Dans le câblage montré ci-dessous, j’ai ajouté une LED avec une résistance de 220 Ω à la broche 11. Vous pouvez utiliser une autre broche de sortie, mais elle doit être une broche PWM.

Dans le code ci-dessous, nous lisons les valeurs de proximité et de lumière. Si le seuil de proximité dépasse 500 (main proche du capteur), nous réglons la luminosité de la LED en fonction du niveau de lumière ambiante. Plus la lumière ambiante est forte, plus la LED est brillante.
#include "Wire.h"
#include "APDS9930.h"
APDS9930 sensor = APDS9930();
const int ledPin = 11; // PWM
void setup() {
Serial.begin(9600);
sensor.init();
sensor.enableProximitySensor(false);
sensor.enableLightSensor(false);
pinMode(ledPin, OUTPUT);
delay(500);
}
void loop() {
static uint16_t proximity = 0;
static float light = 0;
static float maxLight = 0;
sensor.readProximity(proximity);
sensor.readAmbientLightLux(light);
if (proximity > 500) {
maxLight = max(light, maxLight);
int brightness = map(light, 0, maxLight, 0, 1023);
analogWrite(ledPin, brightness);
} else {
analogWrite(ledPin, 0);
}
delay(100);
}
Comme nous ne savons pas à l’avance à quel point la lumière ambiante peut être intense, le code met aussi à jour le niveau maximal de lumière ambiante à chaque itération. Mais vous pouvez aussi faire des tests et choisir un niveau maximal fixe.
Et voilà. J’espère que vous vous êtes amusé à jouer avec le capteur de proximité et de lumière APDS-9930 – moi, c’était le cas ; )
Conclusions
Dans ce tutoriel, vous avez appris à utiliser le capteur de proximité et de lumière APDS-9930 avec un Arduino pour détecter des objets et mesurer les niveaux de lumière ambiante.
Notez que la bibliothèque APDS-9930 Library de Depau offre plus de fonctions que celles que nous avons démontrées ici. En particulier, vous pouvez lire les valeurs des deux photodiodes (Ch0, Ch1), définir des seuils pour la proximité et la lumière, et réagir aux interruptions. Consultez l’exemple code fourni avec la bibliothèque.
L’APDS-9930 est un bon capteur pour détecter des gestes simples et réagir à la lumière. Par exemple, si vous voulez activer un écran en agitant la main devant et ajuster la luminosité de l’écran en fonction de la lumière ambiante en même temps, l’APDS-9930 est parfait pour cela.
Cependant, si vous souhaitez mesurer précisément les distances aux objets, par exemple pour des applications robotiques, il vaut mieux utiliser des capteurs de distance infrarouges comme le GP2Y0A710K0F qui utilisent la triangulation pour déterminer la distance à un objet. Ou mieux encore, choisissez un capteur de distance laser Time-of-Flight (ToF) comme le TOF10120 ou le VL53L1X library, qui peuvent mesurer même de longues distances avec une grande précision.
Si vous avez des questions, n’hésitez pas à les laisser dans la section des commentaires.
Bon bricolage ; )

