Ken Parish
/
XYZ_PROX_01_1
compiling aside from neopixel lib?
main.cpp
- Committer:
- ghostaudio
- Date:
- 2014-05-30
- Revision:
- 0:09dd83d78a0a
- Child:
- 2:e97394fe87c4
File content as of revision 0:09dd83d78a0a:
#include "mbed.h" #include "VCNL40x0.h" #include "NeoStrip.h" #define #define NumPixels 4 I2C i2c(p28, p27); DigitalOut mled0(LED1); DigitalOut mled1(LED2); DigitalOut mled2(LED3); DigitalOut mled3(LED4); Serial pc(USBTX, USBRX); DigitalOut reset(p29); NeoStrip strip(p26, NumPixels); const uint8_t MUX = 0xE0; // 11100000 const uint8_t VCNL4020 = 0x26; unsigned int sensors[4]; char _send[3]; char _receive[2]; char port[2]; const uint8_t chan[] = {0x01,0x02,0x04,0x08}; int mleds[] = {0,0,0,0}; void Setup(void); void Setmleds(void); void SwitchChannel(uint8_t chan); void ReadAllSensors(void); void Setmleds(void); void SetProximityRate (unsigned char ProximityRate); void SetCommandRegister (unsigned char Command); void ReadCommandRegister (unsigned char *Command); void SetCurrent (unsigned char Current); void ReadProxiValue (unsigned int *ProxiValue); void SetProximityRate (unsigned char ProximityRate); void ReadProxiOnDemand (unsigned int *ProxiValue); void Setup(void); //////////////////////////////////////////////////////////////////////////////////////////////////////////////// int main() { Setup(); while (1) { ReadAllSensors(); } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// void Setup(void) { pc.baud(115200); // set BAUD for (int i = 0; i < 4; i++){ reset = 0; wait(0.001); reset = 1; wait(0.001); port[0] = chan[i]; i2c.write(MUX,port, 1); SetCurrent(20); // Set current to 200mA SetCommandRegister (COMMAND_ALL_DISABLE); // ready for prox rate change SetProximityRate (PROX_MEASUREMENT_RATE_31); // 31 measurements/s wait(0.2); } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// void Setmleds(void){ mled0 = mleds[0]; mled1 = mleds[1]; mled2 = mleds[2]; mled3 = mleds[3]; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// void SwitchChannel(uint8_t chan){ reset = 0; wait(0.001); reset = 1; wait(0.001); port[0] = chan; i2c.write(MUX,port, 1); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// void ReadAllSensors(void){ for (int i = 0; i < 4; i++){ SwitchChannel(chan[i]); // set channel mleds[i] = 1; // LED on Setmleds(); ReadProxiOnDemand(&sensors[i]); // read prox value on demand mleds[i] = 0; // LED off Setmleds(); } for (int i = 0; i < 4; i++){ pc.printf("\r %i ", sensors[i]); } pc.printf("\r \n ");}; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// void SetCommandRegister (unsigned char Command) { //unsigned char send[2]; _send[0] = REGISTER_COMMAND; // VCNL40x0 Configuration reister _send[1] = Command; i2c.write(VCNL4020,_send, 2); // Write 2 bytes on I2C } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// void ReadCommandRegister (unsigned char *Command) { //unsigned char send[2]; //unsigned char receive[2]; _send[0] = REGISTER_COMMAND; // VCNL40x0 Configuration register i2c.write(VCNL4020,_send, 1); // Write 1 byte on I2C i2c.read(VCNL4020+1,_receive, 1); // Read 1 byte on I2C *Command = (unsigned char)(_receive[0]); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// void SetCurrent (unsigned char Current) { _send[0] = REGISTER_PROX_CURRENT; // VCNL40x0 IR LED Current register _send[1] = Current; i2c.write(VCNL4020,_send, 2); // Write 2 bytes on I2C } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// void ReadProxiValue (unsigned int *ProxiValue) { _send[0] = REGISTER_PROX_VALUE; // VCNL40x0 Proximity Value register i2c.write(VCNL4020, _send, 1); // Write 1 byte on I2C i2c.read(VCNL4020+1, _receive, 2); // Read 2 bytes on I2C *ProxiValue = ((unsigned int)_receive[0] << 8 | (unsigned char)_receive[1]); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// void SetProximityRate (unsigned char ProximityRate) { _send[0] = REGISTER_PROX_RATE; // VCNL40x0 Proximity rate register _send[1] = ProximityRate; i2c.write(VCNL4020,_send, 2); // Write 2 bytes on I2C } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// void ReadProxiOnDemand (unsigned int *ProxiValue) { unsigned char Command=0; // enable prox value on demand SetCommandRegister (COMMAND_PROX_ENABLE | COMMAND_PROX_ON_DEMAND); // wait on prox data ready bit do { ReadCommandRegister (&Command); // read command register } while (!(Command & COMMAND_MASK_PROX_DATA_READY)); ReadProxiValue (ProxiValue); // read prox value SetCommandRegister (COMMAND_ALL_DISABLE); // stop prox value on demand }