VCNL4020 proximity and ambient light sensor

Hemi345

Senior Member
Vishay VCNL4020

vcnl4020a.jpgvcnl4020b.jpg

I put an electrolytic cap between the VCNL4020 and the external IR emitter as a light barrier to prevent crosstalk (per the Extended detection range document).

Code includes a few different examples for changing IR current drive, measures per second, etc.

Code:
[color=Navy]#picaxe [/color][color=Black]20X2[/color]
[color=Navy]#no_data
#no_table
#terminal 9600[/color]
[color=Green]#rem
Hemi345 11/2014
Vishay VCNL4020 Proxity and Ambient light sensor
http://www.vishay.com/docs/84136/designingvcnl4020.pdf
Using built-in IR emitter, detection range is about 5" @ 6.5V/150mA
Using external IR emitter, TSHF5410 (the recommended TSHF5210 was out of stock), range was extended to ~18"
VDD = 3.3V
IR-anode = ~6.5V
#endrem[/color]
[color=Blue]symbol proxAddr[/color][color=DarkCyan]= [/color][color=Navy]%00100110  [/color][color=Green]' I2C address[/color]
[color=Blue]symbol [/color][color=Purple]delay [/color][color=DarkCyan]= [/color][color=Purple]b25 [/color]
[color=Blue]symbol [/color][color=Purple]detect [/color][color=DarkCyan]= [/color][color=Purple]pinB.0      [/color][color=Green]' if wish to detect interrupt on picaxe pin (interrupt is low)[/color]

[color=Blue]pause [/color][color=Navy]250[/color]
[color=Blue]sertxd ([/color][color=Navy]13[/color][color=Black],[/color][color=Navy]10[/color][color=Black],[/color][color=Red]"Starting..."[/color][color=Black],[/color][color=Navy]13[/color][color=Black],[/color][color=Navy]10[/color][color=Blue])
hi2csetup i2cmaster[/color][color=Black], [/color][color=Blue]proxAddr[/color][color=Black], [/color][color=Blue]i2cfast[/color][color=Black], [/color][color=Blue]i2cbyte
hi2cin [/color][color=Navy]$81[/color][color=Black],[/color][color=Blue]([/color][color=Purple]b0[/color][color=Blue]) [/color][color=Green]'read revision and product ID register[/color]
[color=Blue]sertxd ([/color][color=Red]"ProxRevID: "[/color][color=Black],#[/color][color=Purple]b0[/color][color=Black],[/color][color=Navy]13[/color][color=Black],[/color][color=Navy]10[/color][color=Blue]) [/color][color=Green]'should be 21h/33d per datasheet[/color]
[color=Blue]hi2cin [/color][color=Navy]$80[/color][color=Black],[/color][color=Blue]([/color][color=Purple]b0[/color][color=Blue]) [/color][color=Green]'read configuration register[/color]
[color=Blue]sertxd ([/color][color=Red]"0Config:"[/color][color=Black],#[/color][color=Purple]b0[/color][color=Black],[/color][color=Navy]13[/color][color=Black],[/color][color=Navy]10[/color][color=Blue])
hi2cout [/color][color=Navy]$80[/color][color=Black],[/color][color=Blue]([/color][color=Navy]%00000111[/color][color=Blue]) [/color][color=Green]'set config register to enable ALS and prox detection[/color]
[color=Blue]pause [/color][color=Navy]10[/color]
[color=Blue]hi2cin [/color][color=Navy]$80[/color][color=Black],[/color][color=Blue]([/color][color=Purple]b0[/color][color=Blue]) [/color][color=Green]'re-read config register just to see how it changed :)[/color]
[color=Blue]sertxd ([/color][color=Red]"1Config:"[/color][color=Black],#[/color][color=Purple]b0[/color][color=Black],[/color][color=Navy]13[/color][color=Black],[/color][color=Navy]10[/color][color=Blue])
hi2cout [/color][color=Navy]$82[/color][color=Black],[/color][color=Blue]([/color][color=Navy]%00000000[/color][color=Blue])     [/color][color=Green]'1.95 measures/sec
'hi2cout $82,(%00000010)    '8 measures/sec
'hi2cout $82,(%00000111)    '250 measures/sec
'hi2cout $83,(%00001010)    '100mA IR Led drive [/color]
[color=Blue]hi2cout [/color][color=Navy]$83[/color][color=Black],[/color][color=Blue]([/color][color=Navy]%00001111[/color][color=Blue])     [/color][color=Green]'150mA IR Led drive
'hi2cout $83,(%00010100)    '200mA IR Led drive[/color]
[color=Blue]hi2cout [/color][color=Navy]$84[/color][color=Black],[/color][color=Blue]([/color][color=Navy]%00011101[/color][color=Blue])     [/color][color=Green]'Set ALS mode to normal, 2 measurements/s, avg to 32 conversions [/color]
[color=Blue]hi2cout [/color][color=Navy]$8A[/color][color=Black],[/color][color=Blue]([/color][color=Navy]%00000000[/color][color=Black],[/color][color=Navy]%00000000[/color][color=Blue])   [/color][color=Green]'set low threshold on prox (0)
'hi2cout $8C,(%00010110,%11100100)  'set high threshold on prox (5860 counts)[/color]
[color=Blue]hi2cout [/color][color=Navy]$8C[/color][color=Black],[/color][color=Blue]([/color][color=Navy]%00001111[/color][color=Black],[/color][color=Navy]%10100000[/color][color=Blue])   [/color][color=Green]'set high threshold on prox (4000 counts)
'4 consecutive measurements to interrupt, interrupt when the threshold exceeded, thresholds are for proximity:
'hi2cout $89,(%01000010) 
'1 consecutive measurements to interrupt, interrupt when the threshold exceeded, thresholds are for proximity:[/color]
[color=Blue]hi2cout [/color][color=Navy]$89[/color][color=Black],[/color][color=Blue]([/color][color=Navy]%00000010[/color][color=Blue])
hi2cin [/color][color=Navy]$83[/color][color=Black],[/color][color=Blue]([/color][color=Purple]b0[/color][color=Blue])             [/color][color=Green]'read the IR current setting[/color]
[color=Purple]b0 [/color][color=DarkCyan]= [/color][color=Purple]b0 [/color][color=DarkCyan]AND [/color][color=Navy]%00011111 [/color][color=DarkCyan]* [/color][color=Navy]10[/color]
[color=Blue]sertxd ([/color][color=Red]"IR current:"[/color][color=Black],#[/color][color=Purple]b0[/color][color=Black],[/color][color=Red]"mA"[/color][color=Black],[/color][color=Navy]13[/color][color=Black],[/color][color=Navy]10[/color][color=Blue])
pause [/color][color=Navy]1000[/color]

[color=Black]main:
    [/color][color=Blue]hi2cin [/color][color=Navy]$85[/color][color=Black],[/color][color=Blue]([/color][color=Purple]b1[/color][color=Black],[/color][color=Purple]b0[/color][color=Blue])
    sertxd ([/color][color=Red]"ALS:"[/color][color=Black],#[/color][color=Purple]w0[/color][color=Black],[/color][color=Red]" "[/color][color=Blue])
    hi2cin [/color][color=Navy]$87[/color][color=Black],[/color][color=Blue]([/color][color=Purple]b1[/color][color=Black],[/color][color=Purple]b0[/color][color=Blue])
    sertxd ([/color][color=Red]"PROX:"[/color][color=Black],#[/color][color=Purple]w0[/color][color=Black],[/color][color=Red]" "[/color][color=Blue])
    hi2cin [/color][color=Navy]$8E[/color][color=Black],[/color][color=Blue]([/color][color=Purple]b0[/color][color=Blue])
    sertxd ([/color][color=Red]"INT:"[/color][color=Black],#[/color][color=Purple]bit0[/color][color=Black],[/color][color=Navy]13[/color][color=Black],[/color][color=Navy]10[/color][color=Blue])
    if [/color][color=Purple]b0 [/color][color=DarkCyan]bit [/color][color=Navy]0 [/color][color=DarkCyan]set [/color][color=Blue]then
        inc [/color][color=Purple]delay   [/color][color=Green]'using a 'delay' so prox counts can be displayed after threshold exceeded
        [/color][color=Blue]if [/color][color=Purple]delay [/color][color=DarkCyan]> [/color][color=Navy]2 [/color][color=Blue]then
            hi2cin [/color][color=Navy]$8C[/color][color=Black],[/color][color=Blue]([/color][color=Purple]b1[/color][color=Black],[/color][color=Purple]b0[/color][color=Blue])
            sertxd([/color][color=Navy]13[/color][color=Black],[/color][color=Navy]10[/color][color=Black],[/color][color=Red]"Interrupt! @ "[/color][color=Black],#[/color][color=Purple]w0[/color][color=Black],[/color][color=Navy]13[/color][color=Black],[/color][color=Navy]10[/color][color=Blue])
            pause [/color][color=Navy]2500
            [/color][color=Blue]hi2cout [/color][color=Navy]$8E[/color][color=Black],[/color][color=Blue]([/color][color=Navy]%00000001[/color][color=Blue]) [/color][color=Green]'clear the interrupt
            [/color][color=Purple]delay [/color][color=DarkCyan]= [/color][color=Navy]0
        [/color][color=Blue]endif
    endif
    pause [/color][color=Navy]500
    [/color][color=Blue]goto [/color][color=Black]main[/color]
 
Last edited:
Top