Arduino Lys og Nærhed

Fra Holstebro HTX Wiki
Skift til: navigering, søgning
I2C Lys og Nærheds module APDS-9930 3,3V

APDS-9930 er et lille I2C modul der kan måle lys og nærhed 3,3V Forsyning !!!.

I2C Lys og Nærheds module APDS-9960 5V

APDS-9960 er et lille I2C modul der kan måle lys og nærhed Kan arbejde på 5V Forsyning !!!.

Modulet er anskaffet i Kina[1] til en pris omkring $2,50 og er dokumenteret i følgende datablad[2].

Modulet tilsluttes GND og +3,3V samt SCL og SDA som I2C protokollen specificerer (modulerne med 6 ben). Modulerne med 5 ben har en regulator indbygget, så de kan tåle 5V.

Lignende moduler

Vi har 3 forskellige moduler, der ligner hinanden en del, men kan lidt forskelligt.

På denne side er det kun APDS-9930 der er dokumenteret, men software-biblioteker kan hentes her:

Elektrisk tilslutning

Modulet kommer med et 6 polet stik, der kan tilsluttes Arduinoen som følger:

VIGTIGT - VIGTIGT - APDS-9930 kan kun acceptere 3,3V forsyning

Funktion Arduino
VL Tilsluttes ikke
GND GND
VCC +3.3V
SCL SCL - A5
SDA SDA - A4
INT Tilsluttes ikke

Software

Biblioteket der anvendes ligger på GitHub[3]. Biblioteket downloades og installeres som beskrevet under Arduinos biblioteker.

Til test anvendes AmbientLightSensor der kommer med som eksempel til biblioteket. Der er også mange andre eksempler man kan lege med.

Her gennemgås kun de grundlæggende dele af modulet.

Anvendelsen af softwaren

Som alle andre biblioteker skal der sættes de grundlæggende ting op for at kontakte biblioteket. Der oprettes et objekt htu, der refererer til sensoren.

#define DUMP_REGS

#include <Wire.h>
#include <APDS9930.h>

// Global Variables
APDS9930 apds = APDS9930();
float ambient_light = 0; // can also be an unsigned long
uint16_t ch0 = 0;
uint16_t ch1 = 1;

Inde i setup() skal der sættes gang i den serielle port til test ved hjælp af begin-metoden, og modulet initialiseres som vist her:

void setup() {
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("APDS-9930 - Ambient light sensor"));
  Serial.println(F("--------------------------------"));
  
  // Initialize APDS-9930 (configure I2C and initial values)
  if ( apds.init() ) {
    Serial.println(F("APDS-9930 initialization complete"));
  } else {
    Serial.println(F("Something went wrong during APDS-9930 init!"));
  }
  
  // Start running the APDS-9930 light sensor (no interrupts)
  if ( apds.enableLightSensor(false) ) {
    Serial.println(F("Light sensor is now running"));
  } else {
    Serial.println(F("Something went wrong during light sensor init!"));
  }

#ifdef DUMP_REGS
  /* Register dump */
  uint8_t reg;
  uint8_t val;

  for(reg = 0x00; reg <= 0x19; reg++) {
    if( (reg != 0x10) && \
        (reg != 0x11) )
    {
      apds.wireReadDataByte(reg, val);
      Serial.print(reg, HEX);
      Serial.print(": 0x");
      Serial.println(val, HEX);
    }
  }
  apds.wireReadDataByte(0x1E, val);
  Serial.print(0x1E, HEX);
  Serial.print(": 0x");
  Serial.println(val, HEX);
#endif

  // Wait for initialization and calibration to finish
  delay(500);
}

I loop() læses de tre lys-værdier og de skrives ud til Serial Monitor hvert sekund, det gøres med følgende kode:.

void loop() {
  // Read the light levels (ambient, red, green, blue)
  if (  !apds.readAmbientLightLux(ambient_light) ||
        !apds.readCh0Light(ch0) || 
        !apds.readCh1Light(ch1) ) {
    Serial.println(F("Error reading light values"));
  } else {
    Serial.print(F("Ambient: "));
    Serial.print(ambient_light);
    Serial.print(F("  Ch0: "));
    Serial.print(ch0);
    Serial.print(F("  Ch1: "));
    Serial.println(ch1);
  }
  
  // Wait 1 second before next reading
  delay(1000);
}

Yderligere muligheder i softwaren

Der ligger yderligere muligheder i biblioteket man kan anvende, hvis man ønsker andre måder at anvende sensoren på:

    bool init();
    uint8_t getMode();
    bool setMode(uint8_t mode, uint8_t enable);
    
    /* Turn the APDS-9930 on and off */
    bool enablePower();
    bool disablePower();
    
    /* Enable or disable specific sensors */
    bool enableLightSensor(bool interrupts = false);
    bool disableLightSensor();
    bool enableProximitySensor(bool interrupts = false);
    bool disableProximitySensor();

    /* LED drive strength control */
    uint8_t getLEDDrive();
    bool setLEDDrive(uint8_t drive);
    // uint8_t getGestureLEDDrive();
    // bool setGestureLEDDrive(uint8_t drive);
    
    /* Gain control */
    uint8_t getAmbientLightGain();
    bool setAmbientLightGain(uint8_t gain);
    uint8_t getProximityGain();
    bool setProximityGain(uint8_t gain);
    bool setProximityDiode(uint8_t drive);
    uint8_t getProximityDiode();

    
    /* Get and set light interrupt thresholds */
    bool getLightIntLowThreshold(uint16_t &threshold);
    bool setLightIntLowThreshold(uint16_t threshold);
    bool getLightIntHighThreshold(uint16_t &threshold);
    bool setLightIntHighThreshold(uint16_t threshold);
    
    /* Get and set interrupt enables */
    uint8_t getAmbientLightIntEnable();
    bool setAmbientLightIntEnable(uint8_t enable);
    uint8_t getProximityIntEnable();
    bool setProximityIntEnable(uint8_t enable);
    
    /* Clear interrupts */
    bool clearAmbientLightInt();
    bool clearProximityInt();
    bool clearAllInts();
    
    /* Proximity methods */
    bool readProximity(uint16_t &val);

    /* Ambient light methods */
    bool readAmbientLightLux(float &val);
    bool readAmbientLightLux(unsigned long &val);
    float floatAmbientToLux(uint16_t Ch0, uint16_t Ch1);
    unsigned long ulongAmbientToLux(uint16_t Ch0, uint16_t Ch1);
    bool readCh0Light(uint16_t &val);
    bool readCh1Light(uint16_t &val);

En del af disse funktioner er vist i koden, mens andre kan anvendes hvis man har lyst.

Test

Test af softwaren viser at der kan læses nogle lys-værdier, men der er ganske givet mere at komme efter.

Referencer