ESP32: APDS9960 Proximité, Lumière, RVB, capteur de geste (Arduino)

ESP32: APDS9960 Proximité, Lumière, RVB, capteur de geste (Arduino)

Apprenez à utiliser le capteur APDS9960 avec l’ESP32 à l’aide d’Arduino IDE. Ce capteur combine la détection des gestes, la détection de proximité et la mesure de la lumière RVB ambiante sur I2C. Dans ce guide, nous vous montrerons comment câbler le capteur à l’ESP32 et le code pour utiliser chacune de ses fonctionnalités.

ESP32 avec APDS9960 Proximité, lumière, RVB et capteur gestuel Arduino IDE

Table des matières

Dans ce guide, nous couvrirons les sujets suivants:

Condition préalable

Ce tutoriel se concentre sur la programmation de l’ESP32 à l’aide du noyau Arduino. Avant de continuer, vous devriez avoir le noyau Arduino ESP32 installé dans votre IDE Arduino. Suivez le prochain tutoriel pour installer l’ESP32 sur l’ide Arduino, si vous ne l’avez pas déjà fait.

Présentation du capteur APDS9960

L’APDS9960 est un capteur 4 en un qui combine la détection des gestes, la détection de proximité, la lumière ambiante et la détection des couleurs RVB dans un petit module. Il est livré dans un package compact avec une LED IR intégrée et un pilote LED calibré en usine. Ce capteur est utilisé sur le smartphone Samsung Galaxy S5.

Pour nos projets ESP32, il est utile d’obtenir une planche de rupture avec le capteur. J’ai le tableau de rupture affiché sur l’image ci-dessous.

APDS9960 Proximité, Lumière, RVB, capteur geste

Vous pouvez obtenir des modules différents avec le même capteur, mais de différents fournisseurs. Ils peuvent être différents, mais ils fonctionneront de la même manière.

Le module utilise le protocole de communication I2C, ce qui rend assez simple à intégrer dans vos projets ESP32, ESP8266, Arduino ou Raspberry Pi Pico.

Pour des informations plus détaillées sur le fonctionnement du capteur, nous vous recommandons de jeter un œil à la fiche technique APDS9960.

Caractéristiques clés de l’APDS9960

Voici un résumé des principales caractéristiques du capteur APDS9960:

  • Détection des gestes: détecte, vers le haut, vers le bas, la gauche, la droite et d’autres gestes en utilisant la proximité basée sur IR.
  • Détection de proximité: mesure la distance à des objets généralement jusqu’à 20 cm> Sortie analogique: plage 0–255.
  • Détection de lumière ambiante: mesure l’intensité de la lumière ambiante, utile pour contrôler la luminosité des écrans.
  • Couleur RVB: détecte les niveaux de lumière rouge, vert, bleu et clair.
  • Interface I2C: intégration facile avec des microcontrôleurs comme Arduino, ESP32, ESP8266, etc.
  • Tension de fonctionnement: 2,4 V à 3,6 V.

Où acheter?

Vous pouvez consulter notre page d’outils de conseiller Maker pour comparer le prix du module APDS9960 dans différents magasins:

Pinout et câblage du module du capteur APDS9960

Jetons un coup d’œil à l’épinglage du module du capteur APDS9960. Si vous avez un module différent, l’épingle doit être similaire.

Épingle Fonction Câblage à l’ESP32
VCC Alimentation (2,4 V à 3,6 V) 3.3 V
GND Sol GND
SDA Ligne de données I2C GPIO 21
SCL Ligne d’horloge i2c GPIO 22
Int Interruption de sortie pour le capteur de proximité (actif bas) Toute épingle numérique
VL Alimentation supplémentaire pour la LED IR Habituellement, vous n’avez pas besoin de vous connecter

Lecture recommandée: ESP32 I2C Communication: Set Pins, plusieurs interfaces de bus et périphériques (Arduino IDE)

APDS9960 cavaliers:

Le module du capteur APDS9960 est livré avec deux cavaliers, que vous voudrez généralement quitter tels qu’ils sont:

APDS9960 cavaliers
  • PS Jumper: le cavalier PS relie la puissance du capteur et de sa LED IR. Par défaut, il est fermé (Solder Blob présente), ce qui signifie que la LED IR obtiendra sa puissance de la broche VCC. La broche VL peut être laissée sans lien.
  • Jumper PU I2C: connecte des résistances de traction 10k à SDA / SCL (vous n’avez pas besoin d’ajouter des résistances pour les lignes SDA et SCL à votre circuit).

Câblage du module APDS9960 à l’ESP32

ESP32 avec capteur APDS9960 - Câblage

Voici une liste des pièces requises pour ce tutoriel:

Vous pouvez utiliser les liens précédents ou aller directement à makeradvisor.com/tools pour trouver toutes les pièces de vos projets au meilleur prix!

ESP32 APDS9960 Proximite Lumiere RVB capteur de geste Arduino

Tirez le capteur APDS9960 à l’ESP32 comme indiqué dans le tableau / diagramme suivant.

Schéma de câblage du capteur ESP32 APDS9960
Épingle Câblage à l’ESP32
VCC 3.3 V
GND GND
SDA GPIO 21
SCL GPIO 22
Int GPIO 4 (ou toute broche numérique)
VL Ne vous connectez pas * (vérifiez vos cavaliers)

Lecture recommandée: ESP32 PINOOUT RÉFÉRENCE: Quelles broches GPIO devriez-vous utiliser?

Installation de bibliothèques pour le capteur APDS9960

Il existe plusieurs bibliothèques qui facilitent l’interface avec le capteur APDS9960. Nous utiliserons la bibliothèque APDS9960 par AdaFruit. Installez-le sur votre IDE Arduino.

Allez dans Sketch> Inclure la bibliothèque> Gérer les bibliothèques. Recherchez APDS9960 Adafruit et installez la bibliothèque correspondante et toutes les dépendances requises supplémentaires

Installez APDS9960 Library Arduino IDE ESP32

Obtenir l’ID d’adresse et de puce du capteur I2C

Le capteur APDS9960 utilise généralement l’adresse I2C 0x39 et a un ID de puce de 0XAB.

Cependant, certains modules de clone ou de contrefaçon peuvent utiliser une adresse I2C différente ou renvoyer un ID de puce différent. Pour éviter les problèmes, c’est une bonne idée d’exécuter le code ci-dessous pour confirmer l’adresse réelle et l’ID de votre capteur.

/*
  Rui Santos & Sara Santos - Raspberryme.com
  Complete project details at https://Raspberryme.com/esp32-apds9960-sensor-arduino/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.  
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include 

// Define APDS9960 chip ID register
#define APDS9960_ID_REG 0x92 // Chip ID register address

// Function to read chip ID from a given I2C address
uint8_t readChipID(uint8_t i2cAddress) {
  Wire.beginTransmission(i2cAddress);
  Wire.write(APDS9960_ID_REG); // Request chip ID register
  Wire.endTransmission(false); 
  Wire.requestFrom(i2cAddress, (uint8_t)1);
  if (Wire.available()) {
    return Wire.read(); // Read chip ID
  }
  return 0; // Return 0 if no data (invalid or no response)
}

void setup() {
  Serial.begin(115200);
  delay(1000);
  Serial.println("Starting I2C Scanner and Chip ID Reader");

  // Initialize I2C
  Wire.begin();
  Wire.setClock(100000); 

  // Scan I2C bus for devices
  Serial.println("\nScanning I2C bus...");
  bool deviceFound = false;

  for (uint8_t address = 0x08; address <= 0x7F; address++) {
    Wire.beginTransmission(address);
    uint8_t error = Wire.endTransmission();

    if (error == 0) {
      deviceFound = true;
      Serial.print("I2C device found at address 0x");
      if (address < 16) Serial.print("0");
      Serial.print(address, HEX);

      // Read and print chip ID
      uint8_t chipID = readChipID(address);
      Serial.print(" - Chip ID: 0x");
      if (chipID < 16) Serial.print("0");
      Serial.println(chipID, HEX);
    }
  }

  if (!deviceFound) {
    Serial.println("No I2C devices found. Check wiring or try again.");
  } else {
    Serial.println("\nScan complete.");
  }
}

void loop() {
}

Afficher le code brut

Après avoir téléchargé le code, ouvrez le moniteur série à un taux en bauds de 115200. Vous devriez obtenir votre ID d’adresse et de puce I2C de capteur.

APDS9960 Get ID et ID de puce I2C

Dans mon cas, l’adresse I2C est 0x39, qui est l’adresse attendue, et l’ID de puce est 0xa8, ce qui n’est pas ce qui est attendu (0xAB serait attendu). Cela signifie que j’ai un module contrefait.

Si vous avez également un module contrefait, ne vous inquiétez pas. Vous pouvez toujours l’utiliser et suivre le tutoriel. Il vous suffit de faire un petit changement dans l’un des fichiers de la bibliothèque.

APDS9960 – ID de puce non attendu

La bibliothèque Adafruit_APDS9960 a le codé en dur à ID de puce et il vérifie l’ID du capteur lors de l’initialisation du module. Si vous en avez un contrefait, il n’initialisera pas correctement.

Pour résoudre ce problème, suivez ces étapes:

  1. Ouvrez le dossier d’installation Arduino IDE et accédez au répertoire des bibliothèques.
  2. Localisez le dossier Adafruit_APDS9960_Library.
  3. À l’intérieur, ouvrez le fichier adafruit_apds9960.cpp.
  4. Commentez les lignes suivantes pour qu’il ignore que vous avez un ID de puce différent (lignes 100 à 104). Ou remplacez par votre ID de puce.
  /* Make sure we're actually connected */
  /*uint8_t x = read8(APDS9960_ID);
  if (x != 0xAB) {
    return false;
  }*/

Enregistrez le fichier adafruit_apds9960.cpp.

Maintenant que vous avez l’adresse du capteur, l’ID de puce et toutes les bibliothèques requises installées, testons quelques exemples pour comprendre le fonctionnement du capteur.

1) ESP32 avec APDS9960 – détection des gestes

L’APDS9960 peut détecter des gestes de base comme le haut, le bas, la droite et la gauche lorsque vous glissez votre main devant le capteur. Avec le bon code, vous pouvez également détecter des gestes plus complexes.

L’image suivante montre l’orientation du capteur pour la reconnaissance des gestes.

APDS9960 Orientation du capteur de détection des gestes

Le code suivant vous montre les commandes de base pour détecter les quatre gestes différents. Ceci est basé sur l’exemple fourni par la bibliothèque.

/* This is a library for the APDS9960 digital proximity, ambient light, RGB, and gesture sensor
   This sketch puts the sensor in gesture mode and decodes gestures. To use this, first put your hand close to the sensor to enable gesture mode. Then move your hand about 6" from the sensor in the up -> down, down -> up, left -> right, or right -> left direction.
   Designed specifically to work with the Adafruit APDS9960 breakout ----> http://www.adafruit.com/products/3595 These sensors use I2C to communicate. The device's I2C address is 0x39
   Adafruit invests time and resources providing this open source code, please support Adafruit andopen-source hardware by purchasing products from Adafruit! Written by Dean Miller for Adafruit Industries. BSD license, all text above must be included in any redistribution */

// Complete project details at https://Raspberryme.com/esp32-apds9960-sensor-arduino/

#include "Adafruit_APDS9960.h"
Adafruit_APDS9960 apds;

// the setup function runs once when you press reset or power the board
void setup() {
  Serial.begin(115200);
  
  if(!apds.begin()){
    Serial.println("failed to initialize device! Please check your wiring.");
  }
  else Serial.println("Device initialized!");

  //gesture mode will be entered once proximity mode senses something close
  apds.enableProximity(true);
  apds.enableGesture(true);
}

// the loop function runs over and over again forever
void loop() {
  uint8_t gesture = apds.readGesture();
  if (gesture == APDS9960_DOWN) { 
    Serial.println("v Moving DOWN"); 
  }
  if (gesture == APDS9960_UP) {
     Serial.println("^ Moving UP");
  }
  if (gesture == APDS9960_LEFT) { 
    Serial.println("< Moving LEFT"); 
  }
  if (gesture == APDS9960_RIGHT) {
    Serial.println("> Moving RIGHT"); 
  }
}

Afficher le code brut

Comment fonctionne le code

Continuez à lire pour savoir comment fonctionne le code ou passez à la section de démonstration.

Importation de la bibliothèque

Tout d’abord, importez la bibliothèque Adafruit_APDS9960 comme suit.

#include "Adafruit_APDS9960.h"

Créez un objet appelé APD pour interagir avec le capteur.

Adafruit_APDS9960 apds;

installation()

Dans la configuration (), initialisez le moniteur série.

Serial.begin(115200);

Ensuite, initialisez le capteur à l’aide de la méthode Begin () comme suit.

if(!apds.begin()){
  Serial.println("failed to initialize device! Please check your wiring.");
}
else Serial.println("Device initialized!");

Les lignes suivantes permettent la détection de proximité et la détection des gestes. La détection des gestes ne fonctionne que lorsque le capteur détecte la proximité.

apds.enableProximity(true);
apds.enableGesture(true);

boucle()

Dans la boucle (), vérifiez si un geste est détecté à l’aide de la fonction readlestture (). S’il détecte un geste, enregistrez-le dans la variable de geste.

uint8_t gesture = apds.readGesture();

Ensuite, vérifiez le geste détecté et imprimez-le dans le moniteur en série.

if (gesture == APDS9960_DOWN) { 
  Serial.println("v Moving DOWN"); 
}
if (gesture == APDS9960_UP) {
   Serial.println("^ Moving UP");
}
if (gesture == APDS9960_LEFT) { 
  Serial.println("< Moving LEFT"); 
}
if (gesture == APDS9960_RIGHT) {
  Serial.println("> Moving RIGHT"); 
}

Tester la détection des gestes

Après avoir téléchargé le code, ouvrez le moniteur série à un taux en bauds de 115200.

Glissez votre main près du capteur: en haut, en bas, à gauche et à droite.

ESP32 avec APDS9960 - Tester la détection des gestes

Le geste correspondant sera imprimé dans le moniteur série.

ESP32 avec APDS9960 Détection des gestes Arduino IDE - Démonstration du moniteur en série

2) ESP32 avec APDS9960 – détection des gestes et affichage sur OLED

Vous pouvez passer cet exemple précédent au niveau suivant et ajouter un écran OLED à votre circuit pour détecter les gestes. Cet exemple peut être facilement modifié pour afficher l’écran que vous aimez, selon le geste.

Pour ce projet, suivez ces prochaines étapes:

1) Ajoutez un écran OLED à votre circuit précédent:

Oled Câblage à l’ESP32
VCC 3.3 V
GND GND
SDA GPIO 21
SCL GPIO 22

2) Installez la bibliothèque Adafruit_SSD1306 et les dépendances correspondantes sur votre IDE Arduino.

3) Téléchargez le code suivant sur votre carte.

/*
  Rui Santos & Sara Santos - Raspberryme.com
  Complete project details at https://Raspberryme.com/esp32-apds9960-sensor-arduino/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.  
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include "Adafruit_APDS9960.h"
#include 
#include 

// OLED display settings
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET    -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// APDS9960 sensor
Adafruit_APDS9960 apds;

// Function to center text horizontally
void centerText(const char* text, int y) {
  int charCount = strlen(text);
  int textWidth = charCount * 6;
  int x = (SCREEN_WIDTH - textWidth) / 2;
  display.setCursor(x, y);
  display.println(text);
}

// Function to display UP gesture
void displayScreenUp() {
  display.clearDisplay();
  centerText("^", 10);
  centerText("Moving UP", 30);
  display.display();
  Serial.println("^ Moving UP");
}

// Function to display DOWN gesture
void displayScreenDown() {
  display.clearDisplay();
  centerText("v", 10);
  centerText("Moving DOWN", 30);
  display.display();
  Serial.println("v Moving DOWN");
}

// Function to display LEFT gesture
void displayScreenLeft() {
  display.clearDisplay();
  centerText("<", 10);
  centerText("Moving LEFT", 30);
  display.display();
  Serial.println("< Moving LEFT");
}

// Function to display RIGHT gesture
void displayScreenRight() {
  display.clearDisplay();
  centerText(">", 10);
  centerText("Moving RIGHT", 30);
  display.display();
  Serial.println("> Moving RIGHT");
}

void setup() {
  Serial.begin(115200);
  
  // Initialize OLED display
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
  // Clear the display
  display.clearDisplay();
  display.display();
  delay(500);

  display.setTextSize(1);      
  display.setTextColor(WHITE);
  display.setCursor(0,0); 
  display.println(F("Gesture Sensor"));
  display.display();
  delay(100);
  
  // Initialize APDS9960
  if(!apds.begin()){
    Serial.println("Failed to initialize APDS9960! Check wiring.");
    display.clearDisplay();
    display.setCursor(0,0);
    display.println(F("APDS9960 Failed"));
    display.display();
  } else {
    Serial.println("APDS9960 initialized!");
    apds.enableProximity(true);
    apds.enableGesture(true);
  }
}

void loop() {
  uint8_t gesture = apds.readGesture();
  if (gesture == APDS9960_DOWN) {
    displayScreenDown();
  }
  if (gesture == APDS9960_UP) {
    displayScreenUp();
  }
  if (gesture == APDS9960_LEFT) {
    displayScreenLeft();
  }
  if (gesture == APDS9960_RIGHT) {
    displayScreenRight();
  }
}

Afficher le code brut

Nous n’expliquerons pas comment ce code fonctionne. Pour apprendre à interfacer un SSD1306 OLED avec l’ESP32, lisez le guide suivant: Affichage OLED ESP32 avec arduino IDE.

Démonstration

Faites glisser votre main dans différentes directions devant le capteur. Le geste sera affiché sur l’écran OLED.

APDS9960 avec ESP32 - Détection des gestes descendant
Détecter le geste de descente
APDS9960 avec ESP32 - Détection de gestes à droite en mouvement
Détecter le geste droit en mouvement

3) ESP32 avec APDS9960 – détection de la proximité

Le capteur APDS9960 peut détecter la proximité dans une plage d’environ 10 à 20 cm. Lorsqu’un objet se rapproche du capteur, il active la broche int (interruption). Il s’agit d’une interruption faible active, ce qui signifie que l’état de la broche passe de haut à faible lorsque la proximité est détectée.

Le capteur APDS9960 vous permet de définir un seuil de proximité, qui définit à quel point un objet doit être proche avant qu’il ne soit considéré comme «détecté».

Pour cet exemple, suivez les étapes suivantes:

1) Tirez une conduite à votre circuit. Nous le connectons à GPIO 23, mais vous pouvez utiliser n’importe quelle autre sortie numérique.

2) Téléchargez le code suivant sur votre carte. Ce code est basé sur l’exemple fourni par la bibliothèque Adafruit.

/* This is a library for the APDS9960 digital proximity, ambient light, RGB, and gesture sensor
   This sketch puts the sensor in proximity mode and enables the interrupt to fire when proximity goes over a set value
   Designed specifically to work with the Adafruit APDS9960 breakout ----> http://www.adafruit.com/products/3595  These sensors use I2C to communicate. The device's I2C address is 0x39
   Adafruit invests time and resources providing this open source code, please support Adafruit andopen-source hardware by purchasing products from Adafruit! Written by Dean Miller for Adafruit Industries. BSD license, all text above must be included in any redistribution */

// Complete project details at https://Raspberryme.com/esp32-apds9960-sensor-arduino/

#include "Adafruit_APDS9960.h"

//the pin that the interrupt is attached to
#define INT_PIN 4

// LED for visual output
#define LED_PIN 23

//create the APDS9960 object
Adafruit_APDS9960 apds;

void setup() {
  Serial.begin(115200);
  pinMode(INT_PIN, INPUT_PULLUP);
  pinMode(LED_PIN, OUTPUT);

  if(!apds.begin()){
    Serial.println("failed to initialize device! Please check your wiring.");
  }
  else Serial.println("Device initialized!");

  //enable proximity mode
  apds.enableProximity(true);

  //set the interrupt threshold to fire when proximity reading goes above 175
  apds.setProximityInterruptThreshold(0, 175);

  //enable the proximity interrupt
  apds.enableProximityInterrupt();
}

void loop() {

  //print the proximity reading when the interrupt pin goes low
  if(!digitalRead(INT_PIN)){
    Serial.println(apds.readProximity());
    digitalWrite(LED_PIN, HIGH);

    //clear the interrupt
    apds.clearInterrupt();
  }
  digitalWrite(LED_PIN, LOW);
}

Afficher le code brut

Comment fonctionne le code

Continuez à lire pour savoir comment fonctionne le code.

Importation de la bibliothèque

Tout d’abord, importez la bibliothèque Adafruit_APDS9960 comme suit.

#include "Adafruit_APDS9960.h"

Créez un objet appelé APD pour interagir avec le capteur.

Adafruit_APDS9960 apds;

Définition des épingles

Définissez la broche à laquelle la broche int est connectée. Dans notre cas, il est connecté à GPIO 4.

//the pin that the interrupt is attached to
#define INT_PIN 4

Ensuite, définissez la broche à laquelle la LED est connectée.

// LED for visual output
#define LED_PIN 23

installation()

Dans la configuration (), initialisez le moniteur série.

Serial.begin(115200);

Réglez la broche d’interruption sous forme d’entrée avec une résistance de traction interne et la LED en sortie.

pinMode(INT_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);

Ensuite, initialisez le capteur à l’aide de la méthode Begin () comme suit.

if(!apds.begin()){
  Serial.println("failed to initialize device! Please check your wiring.");
}
else Serial.println("Device initialized!");

Activez la détection de proximité à l’aide de la fonction ActiverProximity () sur l’objet APDS.

apds.enableProximity(true);

Maintenant, définissez la plage de seuil d’interruption de proximité à l’aide de la fonction SetProximityInterruptHreshold (). Le capteur ne déclenchera une interruption que si elle détecte quelque chose de suffisamment proche pour produire une lecture sur 175 (la lecture maximale est 255 – plus l’objet est proche, plus la valeur est élevée).

apds.setProximityInterruptThreshold(0, 175);

Ensuite, activez l’interruption à la proximité.

apds.enableProximityInterrupt();

Après cela, lorsque le seuil est franchi, le capteur tirera la broche int à basse.

//set the interrupt threshold to fire when proximity reading goes above 175
apds.setProximityInterruptThreshold(0, 175);

Vous pouvez utiliser cette interruption pour déclencher une alerte ou effectuer une tâche uniquement lorsque quelque chose est proche du capteur.

boucle()

Dans la boucle (), vérifiez l’état de la broche int. S’il est faible, cela signifie que nous avons un objet proche du capteur. Dans ce cas, nous lisons la valeur de proximité avec APDS.ReadProximity () et éclairons la LED.

//print the proximity reading when the interrupt pin goes low
if(!digitalRead(INT_PIN)){
  Serial.println(apds.readProximity());
  digitalWrite(LED_PIN, HIGH);

  //clear the interrupt
  apds.clearInterrupt();
}

Après cela, nous appelons la fonction ClearInterrupt (). Il réinitialise l’indicateur d’interruption sur le capteur APDS9960. Lorsque le capteur détecte un événement de proximité au-dessus du seuil, il tire la broche int pour signaler l’événement.

//clear the interrupt
 apds.clearInterrupt();

Cet état bas restera jusqu’à ce que l’interruption soit effacée en appelant la fonction ClearInterrupt (). Après cela, la broche INT reviendra à son état d’origine, haut.

Lorsque la broche n’est pas déclenchée, éteignez la LED.

digitalWrite(LED_PIN, LOW);

Démonstration

Téléchargez le code précédent sur votre carte.

Mettez quelque chose de plus proche du capteur. Vous verrez que lorsqu’il atteindra un certain seuil de proximité, la LED s’allume.

APDS9960 ESP32 TEST TEST Capteur de proximité

Dans le même temps, les valeurs de proximité sont imprimées dans le moniteur série.

ESP32 avec capteur APDS9960 - Moniteur en série

4) ESP32 avec APDS9960 – détection de la lumière RVB

Le capteur APDS9960 peut mesurer la lumière rouge, verte, bleue et claire. Le canal transparent mesure la luminosité globale, tandis que les canaux rouges, verts et bleus vous indiquent la part de chaque couleur présente.

Les valeurs que vous obtenez du capteur sont des valeurs relatives. Des valeurs plus élevées représentent plus de lumière de cette couleur spécifique. Vous pouvez comparer les valeurs pour essayer d’estimer la couleur dominante d’un objet ou d’un environnement.

Le code suivant lit la lumière rouge, verte, bleue et claire et affiche les résultats dans le moniteur en série. Ce code est basé sur cet exemple fourni par la bibliothèque.

/* This is a library for the APDS9960 digital proximity, ambient light, RGB, and gesture sensor
   This sketch puts the sensor in color mode and reads the RGB and clear values.
   Designed specifically to work with the Adafruit APDS9960 breakout ----> http://www.adafruit.com/products/3595 These sensors use I2C to communicate. The device's I2C address is 0x39 
   Adafruit invests time and resources providing this open source code, please support Adafruit andopen-source hardware by purchasing products from Adafruit! Written by Dean Miller for Adafruit Industries. BSD license, all text above must be included in any redistribution */

// Complete project details at https://Raspberryme.com/esp32-apds9960-sensor-arduino/

#include "Adafruit_APDS9960.h"
Adafruit_APDS9960 apds;

void setup() {
  Serial.begin(115200);

  if(!apds.begin()){
    Serial.println("failed to initialize device! Please check your wiring.");
  }
  else Serial.println("Device initialized!");

  //enable color sensing mode
  apds.enableColor(true);

  // Set ADC gain to high (16x) for better color sensitivity
  apds.setADCGain(APDS9960_AGAIN_16X);
}

void loop() {
  //create some variables to store the color data in
  uint16_t r, g, b, c;
  
  //wait for color data to be ready
  while(!apds.colorDataReady()){
    delay(5);
  }

  //get the data and print the different channels
  apds.getColorData(&r, &g, &b, &c);
  Serial.print("Red Light: ");
  Serial.print(r);
  
  Serial.print(" || Green Light: ");
  Serial.print(g);
  
  Serial.print(" || Blue Light: ");
  Serial.print(b);
  
  Serial.print(" || Ambient Light: ");
  Serial.println(c);
  Serial.println();
  
  delay(500);
}

Afficher le code brut

Comment fonctionne le code?

Activez le mode de détection des couleurs.

//enable color sensing mode
apds.enableColor(true);

Ensuite, nous fixons un gain 16x pour une meilleure sensibilité. Cette ligne est facultative.

// Set ADC gain to high (16x) for better color sensitivity
apds.setADCGain(APDS9960_AGAIN_16X);

Voici toutes les options de gain:

  • Apds9960_again_1x
  • Apds9960_again_4x
  • Apds9960_again_16x
  • Apds9960_again_64x

Dans la boucle (), créez quatre variables pour enregistrer les données de couleur.

  • r = rouge
  • g = vert
  • b = bleu
  • C = clair (lumière ambiante)

Attendez que de nouvelles données de couleur soient disponibles à partir du capteur.

while(!apds.colorDataReady()){
  delay(5);
}

Une fois les données prêtes, mettez les différentes valeurs dans nos variables comme suit:

apds.getColorData(&r, &g, &b, &c);

Ensuite, imprimez les résultats dans le moniteur série.

Serial.print("Red Light: ");
Serial.print(r);
  
Serial.print(" || Green Light: ");
Serial.print(g);
  
Serial.print(" || Blue Light: ");
Serial.print(b);
  
Serial.print(" || Ambient Light: ");
Serial.println(c);
Serial.println();

Démonstration

Téléchargez le code précédent sur votre carte. Ensuite, ouvrez le moniteur en série à un taux de bauds de 115200.

Essayez de pointer de la lampe de poche de votre smartphone sur le capteur – vous remarquerez que les valeurs d’intensité lumineuse commencent à augmenter.

APDS9960 Détection de couleur Arduino IDE - Test avec ESP32

Vous pouvez également expérimenter des lumières colorées ou briller la lampe de poche sur un objet coloré. La lumière réfléchie frappera le capteur, lui permettant de détecter la couleur de l’objet.

Capteur ESP32 APDS9960 - Test de capteur de lumière

Emballage

Dans ce tutoriel, vous avez appris à utiliser le module du capteur APDS9960 avec l’ESP32. Il peut détecter les gestes de base, la proximité, mesurer la lumière ambiante et les intensités de lumière RVB.

Nous vous avons montré quelques exemples de base pour mettre le capteur au test et apprendre les méthodes de base pour utiliser ses fonctionnalités.

Nous espérons que vous avez trouvé ce guide utile. Nous avons plus de guides pour les capteurs et modules ESP32:

Pour en savoir plus sur l’ESP32, consultez nos ressources:

Merci d’avoir lu.

Cette vidéo vous emmène dans l’histoire de Raspberry Pi :

Youtube video