IS31SE5000 IR SENSOR FOR TOUCHLESS MOTION AND PROXIMITY
Dependents: test_IS31SE5000 testSensor
IS31SE5000.cpp
- Committer:
- Rhyme
- Date:
- 2017-05-11
- Revision:
- 2:215d002d2bbf
- Parent:
- 0:b92d4b745118
File content as of revision 2:215d002d2bbf:
/** * IS31SE5000 : IR sensor for touchless motion and proximity * */ #include "mbed.h" #include "IS31SE5000.h" #define REG_STATUS 0x00 #define REG_SHUTDOWN 0x01 #define REG_CONFIG 0x11 #define SSD_SHUTDOWN 0x00 #define SSD_NORMAL 0x01 #define EC_400MA 0x00 #define EC_280MA 0x01 #define EC_210MA 0x02 #define EC_70MA 0x04 #define PD_BE_OFF 0x01 #define PD_BE_CLOSE 0x02 #define MD_PD2_PD1 0x01 #define MD_PD1_PD2 0x02 #define MODE_MOTION 0x00 #define MODE_PROXIMITY 0x01 /* * Register Definitions * * Status Register 0x00 (Read Only) * Bit [7:4] reserved * Bit [3:2] PD * Bit [1:0] MD * The Status Register stores the motion * information which detected by IS31SE5000 * * PD : Proximity Detection * 01 : Be off * 10 : Be close * Others : No motion * * MD : Motion Detection * 01 : From PD2 to PD1 * 10 : From PD1 to PD2 * Others : No motion * * Shutdown Register 0x01 * Bit [7:1] reserved * Bit [0] SSD (default = 0) * The Shutdown Register sets software shutdown * mode of IS31SE5000. * * SSD : Software Shutdown Enable * 0 : Software shutdown mode (default) * 1 : Normal operation * * Configuration Register * Bit [7:4] Reserved * Bit [3:1] EC (default = 000) * Bit [0] MODE (default = 0) * The Configuration Register sets the operating function. * * EC : Emitting Current Setting * (Adjusting detection distance, * refer to detail information in Data Sheet Page 10) * 000 : 400mA (default) * 001 : 280mA * 01x : 210mA * 1xx : 70mA * * MODE : Mode Selection * 0 : Motion mode (default) * 1 : Proximity mode */ IS31SE5000::IS31SE5000(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) { // activate the peripheral shutdown_reg = 0x00 ; config_reg = 0x00 ; } IS31SE5000::~IS31SE5000() { } /* for Status Register */ uint8_t IS31SE5000::getStatus(void) /* returns status register */ { uint8_t status_reg = 0x00 ; readRegs(REG_STATUS, &status_reg, 1) ; return( status_reg ) ; } uint8_t IS31SE5000::getPD(void) /* get Proximity Detection Value */ { uint8_t data ; data = getStatus() ; data = (data >> 2) & 0x03 ; return(data) ; } uint8_t IS31SE5000::getMD(void) /* get Motion Detection Value */ { uint8_t data ; data = getStatus() ; data &= 0x03 ; return(data) ; } /* for Shutdown Register */ void IS31SE5000::activate(void) { uint8_t data[2] = { REG_SHUTDOWN, SSD_NORMAL } ; writeRegs(data, 2) ; } void IS31SE5000::shutdown(void) { uint8_t data[2] = { REG_SHUTDOWN, SSD_SHUTDOWN } ; writeRegs(data, 2) ; } /* for Configuration Register */ void IS31SE5000::setEC(uint8_t ec_value) { uint8_t data[2] ; data[0] = REG_CONFIG ; config_reg = ((ec_value << 1)&0x07) | (config_reg & 0x01) ; data[1] = config_reg ; writeRegs(data, 2) ; } void IS31SE5000::motionMode(void) { uint8_t data[2] ; data[0] = REG_CONFIG ; config_reg &= ~(MODE_PROXIMITY) ; data[1] = config_reg ; writeRegs(data, 2) ; } void IS31SE5000::proximityMode(void) { uint8_t data[2] ; data[0] = REG_CONFIG ; config_reg |= MODE_PROXIMITY ; data[1] = config_reg ; writeRegs(data, 2) ; } uint8_t IS31SE5000::getEC(void) { return( (config_reg >> 1) & 0x07) ; } uint8_t IS31SE5000::getMode(void) { return( config_reg & 0x01 ) ; } /* */ uint8_t IS31SE5000::get_shutdown_reg(void) { return(shutdown_reg) ; } uint8_t IS31SE5000::get_config_reg(void) { return( config_reg ) ; } void IS31SE5000::readRegs(int addr, uint8_t * data, int len) { char t[1] = {addr}; m_i2c.write(m_addr, t, 1, true); m_i2c.read(m_addr, (char *)data, len); } void IS31SE5000::writeRegs(uint8_t * data, int len) { m_i2c.write(m_addr, (char *)data, len); }