Skip to content

Commit 537eb76

Browse files
authored
Create Adafruit_VCNL4010.cpp
1 parent 5f1943a commit 537eb76

1 file changed

Lines changed: 110 additions & 0 deletions

File tree

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
#include "Arduino.h"
2+
#include "Wire.h"
3+
4+
#include "Adafruit_VCNL4010.h"
5+
6+
bool Adafruit_VCNL4010::begin(uint8_t addr) {
7+
_i2caddr = addr;
8+
Wire.begin();
9+
10+
uint8_t rev = read8(VCNL4010_PRODUCTID);
11+
if ((rev & 0xF0) != 0x20) {
12+
return false;
13+
}
14+
15+
write8(VCNL4010_IRLED, 20);
16+
uint8_t r = read8(VCNL4010_MODTIMING);
17+
r &= ~(0b00011000);
18+
r |= VCNL4010_390K625 << 3;
19+
write8(VCNL4010_MODTIMING, r);
20+
21+
write8(VCNL4010_INTCONTROL, 0x08);
22+
return true;
23+
}
24+
25+
uint16_t Adafruit_VCNL4010::readProximity() {
26+
uint8_t i = read8(VCNL4010_INTSTAT);
27+
i &= ~0x80;
28+
write8(VCNL4010_INTSTAT, i);
29+
30+
write8(VCNL4010_COMMAND, VCNL4010_MEASUREPROXIMITY);
31+
while (1) {
32+
//Serial.println(read8(VCNL4010_INTSTAT), HEX);
33+
uint8_t result = read8(VCNL4010_COMMAND);
34+
//Serial.print("Ready = 0x"); Serial.println(result, HEX);
35+
if (result & VCNL4010_PROXIMITYREADY) {
36+
return read16(VCNL4010_PROXIMITYDATA);
37+
}
38+
delay(1);
39+
}
40+
}
41+
42+
// Read 1 byte from the VCNL4000 at 'address'
43+
uint8_t Adafruit_VCNL4010::read8(uint8_t address)
44+
{
45+
uint8_t data;
46+
47+
Wire.beginTransmission(_i2caddr);
48+
#if ARDUINO >= 100
49+
Wire.write(address);
50+
#else
51+
Wire.send(address);
52+
#endif
53+
Wire.endTransmission();
54+
55+
delayMicroseconds(170); // delay required
56+
57+
Wire.requestFrom(_i2caddr, (uint8_t)1);
58+
while(!Wire.available());
59+
60+
#if ARDUINO >= 100
61+
return Wire.read();
62+
#else
63+
return Wire.receive();
64+
#endif
65+
}
66+
67+
68+
// Read 2 byte from the VCNL4000 at 'address'
69+
uint16_t Adafruit_VCNL4010::read16(uint8_t address)
70+
{
71+
uint16_t data;
72+
73+
Wire.beginTransmission(_i2caddr);
74+
#if ARDUINO >= 100
75+
Wire.write(address);
76+
#else
77+
Wire.send(address);
78+
#endif
79+
Wire.endTransmission();
80+
81+
Wire.requestFrom(_i2caddr, (uint8_t)2);
82+
while(!Wire.available());
83+
#if ARDUINO >= 100
84+
data = Wire.read();
85+
data <<= 8;
86+
while(!Wire.available());
87+
data |= Wire.read();
88+
#else
89+
data = Wire.receive();
90+
data <<= 8;
91+
while(!Wire.available());
92+
data |= Wire.receive();
93+
#endif
94+
95+
return data;
96+
}
97+
98+
// write 1 byte
99+
void Adafruit_VCNL4010::write8(uint8_t address, uint8_t data)
100+
{
101+
Wire.beginTransmission(_i2caddr);
102+
#if ARDUINO >= 100
103+
Wire.write(address);
104+
Wire.write(data);
105+
#else
106+
Wire.send(address);
107+
Wire.send(data);
108+
#endif
109+
Wire.endTransmission();
110+
}

0 commit comments

Comments
 (0)