心拍・酸素飽和度モニタモジュール MAXREFDES117から取得した心拍の値をシリアルコンソールに表示するプログラムです。
Fork of microbit-component-display by
MAX30102.cpp
00001 #include "mbed.h" 00002 #include "MAX30102.h" 00003 00004 bool MAX30102::write_reg(uint8_t uch_addr, uint8_t uch_data) 00005 { 00006 char ach_i2c_data[2]; 00007 ach_i2c_data[0]=uch_addr; 00008 ach_i2c_data[1]=uch_data; 00009 00010 if(_i2c.write(I2C_ADDR, ach_i2c_data, 2, false)==0) return true; 00011 else return false; 00012 } 00013 00014 bool MAX30102::read_reg(uint8_t uch_addr, uint8_t *puch_data) 00015 { 00016 char ch_i2c_data; 00017 ch_i2c_data=uch_addr; 00018 00019 if(_i2c.write(I2C_ADDR, &ch_i2c_data, 1, true)!=0) return false; 00020 00021 if(_i2c.read(I2C_ADDR | 0x01, &ch_i2c_data, 1, false)==0) 00022 { 00023 *puch_data=(uint8_t) ch_i2c_data; 00024 return true; 00025 } 00026 else 00027 return false; 00028 } 00029 00030 bool MAX30102::init() 00031 { 00032 if(!write_reg(REG_INTR_ENABLE_1,0xc0)) return false; 00033 if(!write_reg(REG_INTR_ENABLE_2,0x00)) return false; 00034 if(!write_reg(REG_FIFO_WR_PTR,0x00)) return false; 00035 if(!write_reg(REG_OVF_COUNTER,0x00)) return false; 00036 if(!write_reg(REG_FIFO_RD_PTR,0x00)) return false; 00037 if(!write_reg(REG_FIFO_CONFIG,0x0f)) return false; 00038 if(!write_reg(REG_MODE_CONFIG,0x03)) return false; 00039 if(!write_reg(REG_SPO2_CONFIG,0x27)) return false; 00040 if(!write_reg(REG_LED1_PA,0x24)) return false; 00041 if(!write_reg(REG_LED2_PA,0x24)) return false; 00042 if(!write_reg(REG_PILOT_PA,0x7f)) return false; 00043 return true; 00044 } 00045 00046 bool MAX30102::read_fifo(uint32_t *pun_red_led, uint32_t *pun_ir_led) 00047 { 00048 uint32_t un_temp; 00049 unsigned char uch_temp; 00050 *pun_red_led=0; 00051 *pun_ir_led=0; 00052 char ach_i2c_data[6]; 00053 00054 read_reg(REG_INTR_STATUS_1, &uch_temp); 00055 read_reg(REG_INTR_STATUS_2, &uch_temp); 00056 00057 ach_i2c_data[0]=REG_FIFO_DATA; 00058 if(_i2c.write(I2C_ADDR, ach_i2c_data, 1, true)!=0) return false; 00059 if(_i2c.read(I2C_ADDR | 0x01, ach_i2c_data, 6, false)!=0) return false; 00060 00061 un_temp=(unsigned char) ach_i2c_data[0]; 00062 un_temp<<=16; 00063 *pun_red_led+=un_temp; 00064 un_temp=(unsigned char) ach_i2c_data[1]; 00065 un_temp<<=8; 00066 *pun_red_led+=un_temp; 00067 un_temp=(unsigned char) ach_i2c_data[2]; 00068 *pun_red_led+=un_temp; 00069 00070 un_temp=(unsigned char) ach_i2c_data[3]; 00071 un_temp<<=16; 00072 *pun_ir_led+=un_temp; 00073 un_temp=(unsigned char) ach_i2c_data[4]; 00074 un_temp<<=8; 00075 *pun_ir_led+=un_temp; 00076 un_temp=(unsigned char) ach_i2c_data[5]; 00077 *pun_ir_led+=un_temp; 00078 *pun_red_led&=0x03FFFF; //Mask MSB [23:18] 00079 *pun_ir_led&=0x03FFFF; //Mask MSB [23:18] 00080 00081 00082 return true; 00083 } 00084 00085 bool MAX30102::reset() 00086 { 00087 if(!write_reg(REG_MODE_CONFIG,0x40)) return false; 00088 else return true; 00089 }
Generated on Tue Jul 12 2022 21:44:59 by 1.7.2