zinnet yazıcı
/
max30105Example
maxrefdes117
Diff: MAX30105/MAX30105.h
- Revision:
- 0:78a2573ad768
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MAX30105/MAX30105.h Tue Aug 06 12:19:46 2019 +0000 @@ -0,0 +1,269 @@ + +#ifndef _MAX30105_H_ +#define _MAX30105_H_ + +#include "mbed.h" + + +#define MAX30105_ADDRESS 0x57 //7-bit I2C Address //87 //1010111 + +//#define MAX30105_I2C_ADDR 0xAE << 1 //8-BİT //174//10101110 // + +//Note that MAX30102 has the same I2C address and Part ID + + +#define MAX30105_NO_ERROR 0 +#define MAX30105_ERROR -1 +#define MAX30105_TEMP_ERROR -999.0 + +//#define I2C_SPEED_STANDARD 100000 +//#define I2C_SPEED_FAST 400000 + +#define I2C_BUFFER_LENGTH 32 + + + +class MAX30105 { + public: + + + MAX30105(I2C &i2c); + MAX30105(void); + + //boolean begin(TwoWire &wirePort = Wire, uint32_t i2cSpeed = I2C_SPEED_STANDARD, uint8_t i2caddr = MAX30105_ADDRESS); + + uint32_t getRed(void); //Returns immediate red value + uint32_t getIR(void); //Returns immediate IR value + uint32_t getGreen(void); //Returns immediate green value + bool safeCheck(uint8_t maxTimeToCheck); //Given a max amount of time, check for new data + + // Configuration + void softReset(); + void shutDown(); + void wakeUp(); + + void setLEDMode(uint8_t mode); + + void setADCRange(uint8_t adcRange); + void setSampleRate(uint8_t sampleRate); + void setPulseWidth(uint8_t pulseWidth); + + void setPulseAmplitudeRed(uint8_t value); + void setPulseAmplitudeIR(uint8_t value); + void setPulseAmplitudeGreen(uint8_t value); + void setPulseAmplitudeProximity(uint8_t value); + + void setProximityThreshold(uint8_t threshMSB); + + //Multi-led configuration mode (page 22) + void enableSlot(uint8_t slotNumber, uint8_t device); //Given slot number, assign a device to slot + void disableSlots(void); + + // Data Collection + + //Interrupts (page 13, 14) + uint8_t getINT1(void); //Returns the main interrupt group + uint8_t getINT2(void); //Returns the temp ready interrupt + void enableAFULL(void); //Enable/disable individual interrupts + void disableAFULL(void); + void enableDATARDY(void); + void disableDATARDY(void); + void enableALCOVF(void); + void disableALCOVF(void); + void enablePROXINT(void); + void disablePROXINT(void); + void enableDIETEMPRDY(void); + void disableDIETEMPRDY(void); + + //FIFO Configuration (page 18) + void setFIFOAverage(uint8_t samples); + void enableFIFORollover(); + void disableFIFORollover(); + void setFIFOAlmostFull(uint8_t samples); + + //FIFO Reading + uint16_t check(void); //Checks for new data and fills FIFO + uint8_t available(void); //Tells caller how many new samples are available (head - tail) + void nextSample(void); //Advances the tail of the sense array + uint32_t getFIFORed(void); //Returns the FIFO sample pointed to by tail + uint32_t getFIFOIR(void); //Returns the FIFO sample pointed to by tail + uint32_t getFIFOGreen(void); //Returns the FIFO sample pointed to by tail + + uint8_t getWritePointer(void); + uint8_t getReadPointer(void); + void clearFIFO(void); //Sets the read/write pointers to zero + + //Proximity Mode Interrupt Threshold + void setPROXINTTHRESH(uint8_t val); + + // Die Temperature + float readTemperature(); + float readTemperatureF(); + + // Detecting ID/Revision + uint8_t getRevisionID(); + uint8_t readPartID(); + + // Setup the IC with user selectable settings + void setup(uint8_t powerLevel = 0x1F, uint8_t sampleAverage = 4, uint8_t ledMode = 3, int sampleRate = 400, int pulseWidth = 411, int adcRange = 4096); + + // Low-level I2C communication + uint8_t readRegister8(uint8_t address, uint8_t reg); + void writeRegister8(uint8_t address, uint8_t reg, uint8_t value); + int writeRegValue(uint8_t reg, char value); + int writeReg(uint8_t reg); + int readReg(uint8_t reg, char *value); + + private: + I2C _i2c; //The generic connection to user's chosen I2C hardware + uint8_t _i2caddr; + + //activeLEDs is the number of channels turned on, and can be 1 to 3. 2 is common for Red+IR. + uint8_t activeLEDs; //Gets set during setup. Allows check() to calculate how many uint8_ts to read from FIFO + + uint8_t revisionID; + + void readRevisionID(); + + void bitMask(uint8_t reg, uint8_t mask, uint8_t thing); + + #define STORAGE_SIZE 4 //Each long is 4 uint8_ts so limit this to fit on your micro + typedef struct Record + { + uint32_t red[STORAGE_SIZE]; + uint32_t IR[STORAGE_SIZE]; + uint32_t green[STORAGE_SIZE]; + uint8_t head; + uint8_t tail; + } sense_struct; //This is our circular buffer of readings from the sensor + + sense_struct sense; + + + + // Status Registers + static const uint8_t MAX30105_INTSTAT1 = 0x00; + static const uint8_t MAX30105_INTSTAT2 = 0x01; + static const uint8_t MAX30105_INTENABLE1 = 0x02; + static const uint8_t MAX30105_INTENABLE2 = 0x03; + + // FIFO Registers + static const uint8_t MAX30105_FIFOWRITEPTR = 0x04; + static const uint8_t MAX30105_FIFOOVERFLOW = 0x05; + static const uint8_t MAX30105_FIFOREADPTR = 0x06; + static const uint8_t MAX30105_FIFODATA = 0x07; + + // Configuration Registers + static const uint8_t MAX30105_FIFOCONFIG = 0x08; + static const uint8_t MAX30105_MODECONFIG = 0x09; + static const uint8_t MAX30105_PARTICLECONFIG = 0x0A; // Note, sometimes listed as "SPO2" config in datasheet (pg. 11) + static const uint8_t MAX30105_LED1_PULSEAMP = 0x0C; + static const uint8_t MAX30105_LED2_PULSEAMP = 0x0D; + static const uint8_t MAX30105_LED3_PULSEAMP = 0x0E; + static const uint8_t MAX30105_LED_PROX_AMP = 0x10; + static const uint8_t MAX30105_MULTILEDCONFIG1 = 0x11; + static const uint8_t MAX30105_MULTILEDCONFIG2 = 0x12; + + // Die Temperature Registers + static const uint8_t MAX30105_DIETEMPINT = 0x1F; + static const uint8_t MAX30105_DIETEMPFRAC = 0x20; + static const uint8_t MAX30105_DIETEMPCONFIG = 0x21; + + // Proximity Function Registers + static const uint8_t MAX30105_PROXINTTHRESH = 0x30; + + // Part ID Registers + static const uint8_t MAX30105_REVISIONID = 0xFE; + static const uint8_t MAX30105_PARTID = 0xFF; // Should always be 0x15. Identical to MAX30102. + + // MAX30105 Commands + // Interrupt configuration (pg 13, 14) + static const uint8_t MAX30105_INT_A_FULL_MASK = (uint8_t)~0b10000000; + static const uint8_t MAX30105_INT_A_FULL_ENABLE = 0x80; + static const uint8_t MAX30105_INT_A_FULL_DISABLE = 0x00; + + static const uint8_t MAX30105_INT_DATA_RDY_MASK = (uint8_t)~0b01000000; + static const uint8_t MAX30105_INT_DATA_RDY_ENABLE = 0x40; + static const uint8_t MAX30105_INT_DATA_RDY_DISABLE = 0x00; + + static const uint8_t MAX30105_INT_ALC_OVF_MASK = (uint8_t)~0b00100000; + static const uint8_t MAX30105_INT_ALC_OVF_ENABLE = 0x20; + static const uint8_t MAX30105_INT_ALC_OVF_DISABLE = 0x00; + + static const uint8_t MAX30105_INT_PROX_INT_MASK = (uint8_t)~0b00010000; + static const uint8_t MAX30105_INT_PROX_INT_ENABLE = 0x10; + static const uint8_t MAX30105_INT_PROX_INT_DISABLE = 0x00; + + static const uint8_t MAX30105_INT_DIE_TEMP_RDY_MASK = (uint8_t)~0b00000010; + static const uint8_t MAX30105_INT_DIE_TEMP_RDY_ENABLE = 0x02; + static const uint8_t MAX30105_INT_DIE_TEMP_RDY_DISABLE = 0x00; + + static const uint8_t MAX30105_SAMPLEAVG_MASK = (uint8_t)~0b11100000; + static const uint8_t MAX30105_SAMPLEAVG_1 = 0x00; + static const uint8_t MAX30105_SAMPLEAVG_2 = 0x20; + static const uint8_t MAX30105_SAMPLEAVG_4 = 0x40; + static const uint8_t MAX30105_SAMPLEAVG_8 = 0x60; + static const uint8_t MAX30105_SAMPLEAVG_16 = 0x80; + static const uint8_t MAX30105_SAMPLEAVG_32 = 0xA0; + + static const uint8_t MAX30105_ROLLOVER_MASK = 0xEF; + static const uint8_t MAX30105_ROLLOVER_ENABLE = 0x10; + static const uint8_t MAX30105_ROLLOVER_DISABLE = 0x00; + + static const uint8_t MAX30105_A_FULL_MASK = 0xF0; + + // Mode configuration commands (page 19) + static const uint8_t MAX30105_SHUTDOWN_MASK = 0x7F; + static const uint8_t MAX30105_SHUTDOWN = 0x80; + static const uint8_t MAX30105_WAKEUP = 0x00; + + static const uint8_t MAX30105_RESET_MASK = 0xBF; + static const uint8_t MAX30105_RESET = 0x40; + + static const uint8_t MAX30105_MODE_MASK = 0xF8; + static const uint8_t MAX30105_MODE_REDONLY = 0x02; + static const uint8_t MAX30105_MODE_REDIRONLY = 0x03; + static const uint8_t MAX30105_MODE_MULTILED = 0x07; + + // Particle sensing configuration commands (pgs 19-20) + static const uint8_t MAX30105_ADCRANGE_MASK = 0x9F; + static const uint8_t MAX30105_ADCRANGE_2048 = 0x00; + static const uint8_t MAX30105_ADCRANGE_4096 = 0x20; + static const uint8_t MAX30105_ADCRANGE_8192 = 0x40; + static const uint8_t MAX30105_ADCRANGE_16384 = 0x60; + + static const uint8_t MAX30105_SAMPLERATE_MASK = 0xE3; + static const uint8_t MAX30105_SAMPLERATE_50 = 0x00; + static const uint8_t MAX30105_SAMPLERATE_100 = 0x04; + static const uint8_t MAX30105_SAMPLERATE_200 = 0x08; + static const uint8_t MAX30105_SAMPLERATE_400 = 0x0C; + static const uint8_t MAX30105_SAMPLERATE_800 = 0x10; + static const uint8_t MAX30105_SAMPLERATE_1000 = 0x14; + static const uint8_t MAX30105_SAMPLERATE_1600 = 0x18; + static const uint8_t MAX30105_SAMPLERATE_3200 = 0x1C; + + static const uint8_t MAX30105_PULSEWIDTH_MASK = 0xFC; + static const uint8_t MAX30105_PULSEWIDTH_69 = 0x00; + static const uint8_t MAX30105_PULSEWIDTH_118 = 0x01; + static const uint8_t MAX30105_PULSEWIDTH_215 = 0x02; + static const uint8_t MAX30105_PULSEWIDTH_411 = 0x03; + + //Multi-LED Mode configuration (pg 22) + static const uint8_t MAX30105_SLOT1_MASK = 0xF8; + static const uint8_t MAX30105_SLOT2_MASK = 0x8F; + static const uint8_t MAX30105_SLOT3_MASK = 0xF8; + static const uint8_t MAX30105_SLOT4_MASK = 0x8F; + + static const uint8_t SLOT_NONE = 0x00; + static const uint8_t SLOT_RED_LED = 0x01; + static const uint8_t SLOT_IR_LED = 0x02; + static const uint8_t SLOT_GREEN_LED = 0x03; + static const uint8_t SLOT_NONE_PILOT = 0x04; + static const uint8_t SLOT_RED_PILOT = 0x05; + static const uint8_t SLOT_IR_PILOT = 0x06; + static const uint8_t SLOT_GREEN_PILOT = 0x07; + + static const uint8_t MAX_30105_EXPECTEDPARTID = 0x15; + +}; +#endif