Advertisement
Guest User

VCNL40x0test.ino

a guest
Mar 9th, 2016
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.95 KB | None | 0 0
  1. #include <Wire.h>
  2. #include "VCNL40x0.h"
  3.  
  4. #define VERSION "Version: 1.2 01/2012"
  5.  
  6. #define  unsigned int i=0;
  7. #define unsigned char ID=0;
  8. #define unsigned char Command=0;
  9. #define unsigned char Current=0;
  10. #define unsigned int ProxiValue=0;
  11. #define unsigned int SummeProxiValue=0;
  12. #define unsigned int AverageProxiValue=0;
  13. #define unsigned int AmbiValue=0;
  14. #define unsigned char InterruptStatus=0;
  15. #define unsigned char InterruptControl=0;
  16.  
  17. VCNL40x0 VCNL40x0_Device();
  18.  
  19. void setup() {
  20.  
  21.     Serial.begin(9600);
  22.  
  23.     // print information on screen
  24.     Serial.println("VCNL4010/4020/3020 Proximity/Ambient Light Sensor");
  25.     Serial.println(VERSION);
  26.     Serial.println("Demonstration #4:");
  27.     Serial.println("Proximity Measurement and Ambient light Measurement in selftimed mode");
  28.     Serial.println("Proximity with 31 measurements/s, Ambient light with 2 measurement/s");
  29.     Serial.println("Interrupt waiting on proximity value > upper threshold limit");
  30.     VCNL40x0_Device.ReadID (&ID); // Read VCNL40x0 product ID revision register
  31.     Serial.println("Product ID Revision Register: %d", ID);
  32.     VCNL40x0_Device.SetCurrent (20); // Set current to 200mA
  33.     VCNL40x0_Device.ReadCurrent (&Current); // Read back IR LED current
  34.     Serial.println("\n IR LED Current: %d", Current);
  35.     // stop all activities (necessary for changing proximity rate, see datasheet)
  36.     VCNL40x0_Device.SetCommandRegister (COMMAND_ALL_DISABLE);
  37.     // set proximity rate to 31/s
  38.     VCNL40x0_Device.SetProximityRate (PROX_MEASUREMENT_RATE_31);
  39.     // enable prox and ambi in selftimed mode
  40.     VCNL40x0_Device.SetCommandRegister (COMMAND_PROX_ENABLE |
  41.     COMMAND_AMBI_ENABLE |
  42.     COMMAND_SELFTIMED_MODE_ENABLE);
  43.     // set interrupt control for threshold
  44.     VCNL40x0_Device.SetInterruptControl (INTERRUPT_THRES_SEL_PROX |
  45.     INTERRUPT_THRES_ENABLE |
  46.     INTERRUPT_COUNT_EXCEED_1);
  47.     // set ambient light measurement parameter
  48.     VCNL40x0_Device.SetAmbiConfiguration (AMBI_PARA_AVERAGE_32 |
  49.     AMBI_PARA_AUTO_OFFSET_ENABLE |
  50.     AMBI_PARA_MEAS_RATE_2);
  51.     // measure average of prox value
  52.     SummeProxiValue = 0;
  53.  
  54.     for (i=0; i<30; i++) {
  55.         do { // wait on prox data ready bit
  56.             VCNL40x0_Device.ReadCommandRegister (&Command); // read command register
  57.         } while (!(Command & COMMAND_MASK_PROX_DATA_READY)); // prox data ready ?
  58.        
  59.         VCNL40x0_Device.ReadProxiValue (&ProxiValue); // read prox value
  60.         SummeProxiValue += ProxiValue; // Summary of all measured prox values
  61.     }
  62.  
  63.     AverageProxiValue = SummeProxiValue/30; // calculate average
  64.     VCNL40x0_Device.SetHighThreshold (AverageProxiValue+100); // set upper threshold for interrupt
  65.     Serial.println("Upper Threshold Value: %i cts\n\n", AverageProxiValue+100);
  66.     delay(2000); // wait 2s (only for display)
  67. }
  68.  
  69. void loop() {
  70. // wait on data ready bit
  71.     do {
  72.         VCNL40x0_Device.ReadCommandRegister (&Command); // read command register
  73.     } while (!(Command & (COMMAND_MASK_PROX_DATA_READY | COMMAND_MASK_AMBI_DATA_READY))); // data ready ?
  74.  
  75.     // read interrupt status register
  76.     VCNL40x0_Device.ReadInterruptStatus (&InterruptStatus);
  77.  
  78.     // check interrupt status for High Threshold
  79.     if (InterruptStatus & INTERRUPT_MASK_STATUS_THRES_HI) {
  80.         //mled2 = 1; // LED on, Interrupt
  81.         VCNL40x0_Device.SetInterruptStatus (InterruptStatus); // clear Interrupt Status
  82.         //mled2 = 0; // LED off, Interrupt
  83.     }
  84.    
  85.     // prox value ready for using
  86.     if (Command & COMMAND_MASK_PROX_DATA_READY) {
  87.         //mled0 = 1; // LED on, Prox Data Ready
  88.         VCNL40x0_Device.ReadProxiValue (&ProxiValue); // read prox value
  89.         // print prox value and interrupt status on screen
  90.         Serial.println("\nProxi: %5.0i cts \tInterruptStatus: %i", ProxiValue, InterruptStatus);
  91.         //mled0 = 0; // LED off, Prox data Ready
  92.     }
  93.  
  94.     // ambi value ready for using
  95.     if (Command & COMMAND_MASK_AMBI_DATA_READY) {
  96.         //mled1 = 1; // LED on, Ambi Data Ready
  97.         VCNL40x0_Device.ReadAmbiValue (&AmbiValue); // read ambi value
  98.         // print ambi value and interrupt status on screen
  99.         Serial.println("\n Ambi: %i", AmbiValue);
  100.         //mled1 = 0; // LED off, Ambi Data Ready
  101.     }
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement