Example main.c host software for the Maxim Integrated MAX30205 Extremely Accurate High Precision Human Body Temperature Sensor. Code example uses the MAX32630FTHR.

Dependencies:   MAX30205_Clinical_Temperature_Sensor max32630fthr USBDevice

Committer:
phonemacro
Date:
Wed Apr 17 21:22:11 2019 +0000
Revision:
2:9670fb20b9a2
Parent:
1:d1f45a4ff640
updated comments

Who changed what in which revision?

UserRevisionLine numberNew contents of line
phonemacro 0:f205abc96ff9 1 /*******************************************************************************
phonemacro 0:f205abc96ff9 2 * Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved.
phonemacro 0:f205abc96ff9 3 *
phonemacro 0:f205abc96ff9 4 * Permission is hereby granted, free of charge, to any person obtaining a
phonemacro 0:f205abc96ff9 5 * copy of this software and associated documentation files (the "Software"),
phonemacro 0:f205abc96ff9 6 * to deal in the Software without restriction, including without limitation
phonemacro 0:f205abc96ff9 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
phonemacro 0:f205abc96ff9 8 * and/or sell copies of the Software, and to permit persons to whom the
phonemacro 0:f205abc96ff9 9 * Software is furnished to do so, subject to the following conditions:
phonemacro 0:f205abc96ff9 10 *
phonemacro 0:f205abc96ff9 11 * The above copyright notice and this permission notice shall be included
phonemacro 0:f205abc96ff9 12 * in all copies or substantial portions of the Software.
phonemacro 0:f205abc96ff9 13 *
phonemacro 0:f205abc96ff9 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
phonemacro 0:f205abc96ff9 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
phonemacro 0:f205abc96ff9 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
phonemacro 0:f205abc96ff9 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
phonemacro 0:f205abc96ff9 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
phonemacro 0:f205abc96ff9 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
phonemacro 0:f205abc96ff9 20 * OTHER DEALINGS IN THE SOFTWARE.
phonemacro 0:f205abc96ff9 21 *
phonemacro 0:f205abc96ff9 22 * Except as contained in this notice, the name of Maxim Integrated
phonemacro 0:f205abc96ff9 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
phonemacro 0:f205abc96ff9 24 * Products, Inc. Branding Policy.
phonemacro 0:f205abc96ff9 25 *
phonemacro 0:f205abc96ff9 26 * The mere transfer of this software does not imply any licenses
phonemacro 0:f205abc96ff9 27 * of trade secrets, proprietary technology, copyrights, patents,
phonemacro 0:f205abc96ff9 28 * trademarks, maskwork rights, or any other form of intellectual
phonemacro 0:f205abc96ff9 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
phonemacro 0:f205abc96ff9 30 * ownership rights.
phonemacro 0:f205abc96ff9 31 *******************************************************************************
phonemacro 0:f205abc96ff9 32 */
phonemacro 0:f205abc96ff9 33 #include "mbed.h"
phonemacro 0:f205abc96ff9 34 #include "max32630fthr.h"
phonemacro 1:d1f45a4ff640 35 #include "max30205.h"
phonemacro 1:d1f45a4ff640 36 #include "max30205_cpp.h"
phonemacro 1:d1f45a4ff640 37 #include "max30205_c.h"
phonemacro 0:f205abc96ff9 38 #include "USBSerial.h"
phonemacro 0:f205abc96ff9 39
phonemacro 1:d1f45a4ff640 40 Serial pc(USBTX, USBRX); // Use USB debug probe for serial link
phonemacro 1:d1f45a4ff640 41 Serial uart(P2_1, P2_0);
phonemacro 1:d1f45a4ff640 42 void wait_sec_prompt(uint8_t time)
phonemacro 1:d1f45a4ff640 43 {
phonemacro 1:d1f45a4ff640 44 // Ports and serial connections
phonemacro 1:d1f45a4ff640 45 uint32_t i;
phonemacro 1:d1f45a4ff640 46 for (i = 0; i < time; i++) {
phonemacro 1:d1f45a4ff640 47 pc.printf(".");
phonemacro 1:d1f45a4ff640 48 wait(1);
phonemacro 1:d1f45a4ff640 49 }
phonemacro 1:d1f45a4ff640 50 pc.printf("\r\n");
phonemacro 1:d1f45a4ff640 51 }
phonemacro 0:f205abc96ff9 52
phonemacro 0:f205abc96ff9 53
phonemacro 1:d1f45a4ff640 54 MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3);
phonemacro 1:d1f45a4ff640 55
phonemacro 0:f205abc96ff9 56 DigitalOut rLED(LED1);
phonemacro 0:f205abc96ff9 57 DigitalOut gLED(LED2);
phonemacro 0:f205abc96ff9 58 DigitalOut bLED(LED3);
phonemacro 0:f205abc96ff9 59
phonemacro 1:d1f45a4ff640 60 I2C i2cBus(P3_4, P3_5);
phonemacro 0:f205abc96ff9 61
phonemacro 0:f205abc96ff9 62 // main() runs in its own thread in the OS
phonemacro 0:f205abc96ff9 63 // (note the calls to Thread::wait below for delays)
phonemacro 0:f205abc96ff9 64
phonemacro 0:f205abc96ff9 65 /**
phonemacro 0:f205abc96ff9 66 * @brief Sample main program for MAX30205
phonemacro 1:d1f45a4ff640 67 * @version 1.0001.0
phonemacro 0:f205abc96ff9 68 *
phonemacro 0:f205abc96ff9 69 * @details Sample main program for MAX30205.
phonemacro 0:f205abc96ff9 70 * The prints are sent to the terminal window (9600, 8n1).
phonemacro 1:d1f45a4ff640 71 * The temperature is read in continous mode, then in shutdown mode for
phonemacro 1:d1f45a4ff640 72 * C++ and C calls.
phonemacro 0:f205abc96ff9 73 * To run the program, drag and drop the .bin file into the
phonemacro 0:f205abc96ff9 74 * DAPLINK folder. After it finishes flashing, cycle the power or
phonemacro 0:f205abc96ff9 75 * reset the Pegasus after flashing by pressing the button on
phonemacro 0:f205abc96ff9 76 * the Pegasus next to the battery connector or the button
phonemacro 0:f205abc96ff9 77 * on the MAXREFDES100HDK.
phonemacro 0:f205abc96ff9 78 */
phonemacro 0:f205abc96ff9 79
phonemacro 0:f205abc96ff9 80 int main()
phonemacro 0:f205abc96ff9 81 {
phonemacro 1:d1f45a4ff640 82 uint32_t i;
phonemacro 1:d1f45a4ff640 83 float temperature;
phonemacro 1:d1f45a4ff640 84 uint8_t cfg;
phonemacro 1:d1f45a4ff640 85 DigitalOut rLED(LED1, LED_OFF);
phonemacro 1:d1f45a4ff640 86 DigitalOut gLED(LED2, LED_OFF);
phonemacro 1:d1f45a4ff640 87 DigitalOut bLED(LED3, LED_OFF);
phonemacro 0:f205abc96ff9 88 gLED = LED_ON;
phonemacro 1:d1f45a4ff640 89 pc.baud(9600); // Baud rate = 115200
phonemacro 2:9670fb20b9a2 90 pc.printf("MAX30205 Clinical Temperature Sensor"
phonemacro 2:9670fb20b9a2 91 " example source code.\r\n");
phonemacro 1:d1f45a4ff640 92 pc.printf("\r\n");
phonemacro 1:d1f45a4ff640 93 uint8_t i2c_addr = MAX30205_I2C_SLAVE_ADR_00;
phonemacro 2:9670fb20b9a2 94 uint8_t wait_shut = 60;
phonemacro 1:d1f45a4ff640 95 MAX30205 temp_sensor(i2cBus, i2c_addr);
phonemacro 1:d1f45a4ff640 96 i2cBus.frequency(400000);
phonemacro 1:d1f45a4ff640 97 /* Configure for time out enabled, normal format, fault filter 6,
phonemacro 1:d1f45a4ff640 98 active low polarity, comparator mode, continuous
phonemacro 1:d1f45a4ff640 99 */
phonemacro 1:d1f45a4ff640 100 temp_sensor.write_cfg_reg(uint8_t(MAX30205_CFG_TIMEOUT_ENABLE |
phonemacro 1:d1f45a4ff640 101 MAX30205_CFG_NORMAL_FORMAT| MAX30205_CFG_FAULT_FILTER_6 |
phonemacro 1:d1f45a4ff640 102 MAX30205_CFG_OS_POLARITY_ACT_LOW | MAX30205_CFG_COMPARATOR_MODE |
phonemacro 1:d1f45a4ff640 103 MAX30205_CFG_CONTINUOUS));
phonemacro 1:d1f45a4ff640 104 for (i = 0; i < 5; i++) {
phonemacro 1:d1f45a4ff640 105 wait(MAX30205_WAIT_CONV_TIME);
phonemacro 1:d1f45a4ff640 106 temperature =
phonemacro 1:d1f45a4ff640 107 temp_sensor.read_reg_as_temperature(MAX30205_REG_TEMPERATURE);
phonemacro 1:d1f45a4ff640 108 pc.printf("Temperature = %3.4f Celsius, %3.4f Fahrenheit\r\n",
phonemacro 1:d1f45a4ff640 109 temperature, temp_sensor.celsius_to_fahrenheit(temperature));
phonemacro 0:f205abc96ff9 110 }
phonemacro 1:d1f45a4ff640 111 temp_sensor.read_cfg_reg(&cfg);
phonemacro 1:d1f45a4ff640 112 pc.printf("Configuration Register = 0x%02Xh \r\n", cfg);
phonemacro 2:9670fb20b9a2 113 #if 0
phonemacro 1:d1f45a4ff640 114 temp_sensor.write_trip_low_thyst(-63.9375);
phonemacro 1:d1f45a4ff640 115 temperature =
phonemacro 1:d1f45a4ff640 116 temp_sensor.read_reg_as_temperature(MAX30205_REG_THYST_LOW_TRIP);
phonemacro 1:d1f45a4ff640 117 pc.printf("Thyst Temperature = %3.4f Celsius, %3.4f Fahrenheit\r\n",
phonemacro 1:d1f45a4ff640 118 temperature, temp_sensor.celsius_to_fahrenheit(temperature));
phonemacro 1:d1f45a4ff640 119
phonemacro 1:d1f45a4ff640 120 temp_sensor.write_trip_high_tos(64.0625f);
phonemacro 1:d1f45a4ff640 121 temperature = temp_sensor.read_reg_as_temperature(MAX30205_REG_TOS_HIGH_TRIP);
phonemacro 1:d1f45a4ff640 122 pc.printf("TOS Temperature = %3.4f Celsius, %3.4f Fahrenheit\r\n",
phonemacro 1:d1f45a4ff640 123 temperature, temp_sensor.celsius_to_fahrenheit(temperature));
phonemacro 1:d1f45a4ff640 124 pc.printf("\r\n\r\n");
phonemacro 1:d1f45a4ff640 125 #endif
phonemacro 0:f205abc96ff9 126
phonemacro 1:d1f45a4ff640 127 pc.printf("\r\n");
phonemacro 1:d1f45a4ff640 128 temp_sensor.write_cfg_reg(uint8_t(MAX30205_CFG_ONE_SHOT_START |
phonemacro 1:d1f45a4ff640 129 MAX30205_CFG_TIMEOUT_DISABLE | MAX30205_CFG_EXTENDED_FORMAT |
phonemacro 1:d1f45a4ff640 130 MAX30205_CFG_FAULT_FILTER_4 | MAX30205_CFG_OS_POLARITY_ACT_LOW |
phonemacro 1:d1f45a4ff640 131 MAX30205_CFG_COMPARATOR_MODE | MAX30205_CFG_SHUTDOWN));
phonemacro 1:d1f45a4ff640 132 for (i = 0; i < 8; i++) {
phonemacro 1:d1f45a4ff640 133 wait_sec_prompt(wait_shut); /* leave it in shutdown mode for a while */
phonemacro 1:d1f45a4ff640 134 /* Configure for one shot, time out disabled, extended format, fault filter 4,
phonemacro 1:d1f45a4ff640 135 active low polarity, comparator mode, shutdown
phonemacro 1:d1f45a4ff640 136 */
phonemacro 1:d1f45a4ff640 137 temp_sensor.write_cfg_reg(uint8_t(MAX30205_CFG_ONE_SHOT_START |
phonemacro 1:d1f45a4ff640 138 MAX30205_CFG_TIMEOUT_DISABLE | MAX30205_CFG_EXTENDED_FORMAT |
phonemacro 1:d1f45a4ff640 139 MAX30205_CFG_FAULT_FILTER_4 | MAX30205_CFG_OS_POLARITY_ACT_LOW |
phonemacro 1:d1f45a4ff640 140 MAX30205_CFG_COMPARATOR_MODE | MAX30205_CFG_SHUTDOWN));
phonemacro 1:d1f45a4ff640 141 wait(MAX30205_WAIT_CONV_TIME);
phonemacro 1:d1f45a4ff640 142 temperature =
phonemacro 1:d1f45a4ff640 143 temp_sensor.read_reg_as_temperature(MAX30205_REG_TEMPERATURE);
phonemacro 1:d1f45a4ff640 144 pc.printf("Temperature = %3.4f Celsius, %3.4f Fahrenheit\r\n",
phonemacro 1:d1f45a4ff640 145 temperature, temp_sensor.celsius_to_fahrenheit(temperature));
phonemacro 1:d1f45a4ff640 146 }
phonemacro 1:d1f45a4ff640 147 temp_sensor.read_cfg_reg(&cfg);
phonemacro 1:d1f45a4ff640 148 pc.printf("Configuration Register = 0x%02Xh \r\n", cfg);
phonemacro 1:d1f45a4ff640 149
phonemacro 1:d1f45a4ff640 150 pc.printf("\r\n\r\n");
phonemacro 1:d1f45a4ff640 151
phonemacro 2:9670fb20b9a2 152 #if 0
phonemacro 1:d1f45a4ff640 153 temp_sensor.write_trip_low_thyst(-55.0f);
phonemacro 1:d1f45a4ff640 154 temperature =
phonemacro 1:d1f45a4ff640 155 temp_sensor.read_reg_as_temperature(MAX30205_REG_THYST_LOW_TRIP);
phonemacro 1:d1f45a4ff640 156 pc.printf("Thyst Temperature = %3.4f Celsius, %3.4f Fahrenheit\r\n",
phonemacro 1:d1f45a4ff640 157 temperature, temp_sensor.celsius_to_fahrenheit(temperature));
phonemacro 1:d1f45a4ff640 158
phonemacro 1:d1f45a4ff640 159 temp_sensor.write_trip_high_tos(125.0f);
phonemacro 1:d1f45a4ff640 160 temperature = temp_sensor.read_reg_as_temperature(MAX30205_REG_TOS_HIGH_TRIP);
phonemacro 1:d1f45a4ff640 161 pc.printf("TOS Temperature = %3.4f Celsius, %3.4f Fahrenheit\r\n",
phonemacro 1:d1f45a4ff640 162 temperature, temp_sensor.celsius_to_fahrenheit(temperature));
phonemacro 1:d1f45a4ff640 163 pc.printf("\r\n\r\n");
phonemacro 1:d1f45a4ff640 164 #endif
phonemacro 1:d1f45a4ff640 165
phonemacro 1:d1f45a4ff640 166 /***************************************************************************
phonemacro 1:d1f45a4ff640 167 * Call the C code version of the driver
phonemacro 1:d1f45a4ff640 168 ***************************************************************************
phonemacro 1:d1f45a4ff640 169 */
phonemacro 1:d1f45a4ff640 170 #include "max30205_c.h"
phonemacro 1:d1f45a4ff640 171 pc.printf("C implementation of the code\r\n");
phonemacro 1:d1f45a4ff640 172 max30205_init(i2c_addr);
phonemacro 1:d1f45a4ff640 173 /* Configure for time out enabled, normal format, fault filter 6,
phonemacro 1:d1f45a4ff640 174 active low polarity, comparator mode, continuous
phonemacro 1:d1f45a4ff640 175 */
phonemacro 1:d1f45a4ff640 176 max30205_write_cfg_reg(uint8_t(MAX30205_CFG_TIMEOUT_ENABLE |
phonemacro 1:d1f45a4ff640 177 MAX30205_CFG_NORMAL_FORMAT | MAX30205_CFG_FAULT_FILTER_6 |
phonemacro 1:d1f45a4ff640 178 MAX30205_CFG_OS_POLARITY_ACT_LOW | MAX30205_CFG_COMPARATOR_MODE |
phonemacro 1:d1f45a4ff640 179 MAX30205_CFG_CONTINUOUS), i2cBus);
phonemacro 1:d1f45a4ff640 180 for (i = 0; i < 5; i++) {
phonemacro 1:d1f45a4ff640 181 wait(MAX30205_WAIT_CONV_TIME);
phonemacro 1:d1f45a4ff640 182 temperature = max30205_read_reg_as_temperature(MAX30205_REG_TEMPERATURE,
phonemacro 1:d1f45a4ff640 183 i2cBus);
phonemacro 1:d1f45a4ff640 184 pc.printf("Temperature = %3.4f Celsius, %3.4f Fahrenheit\r\n",
phonemacro 1:d1f45a4ff640 185 temperature, temp_sensor.celsius_to_fahrenheit(temperature));
phonemacro 0:f205abc96ff9 186 }
phonemacro 0:f205abc96ff9 187
phonemacro 1:d1f45a4ff640 188 max30205_read_cfg_reg(&cfg, i2cBus);
phonemacro 1:d1f45a4ff640 189 pc.printf("Configuration Register = 0x%02Xh \r\n", cfg);
phonemacro 1:d1f45a4ff640 190
phonemacro 2:9670fb20b9a2 191 #if 0
phonemacro 1:d1f45a4ff640 192 max30205_write_trip_low_thyst(-63.9375, i2cBus);
phonemacro 1:d1f45a4ff640 193 temperature = max30205_read_reg_as_temperature(MAX30205_REG_THYST_LOW_TRIP,
phonemacro 1:d1f45a4ff640 194 i2cBus);
phonemacro 1:d1f45a4ff640 195 pc.printf("Thyst Temperature = %3.4f Celsius, %3.4f Fahrenheit\r\n",
phonemacro 1:d1f45a4ff640 196 temperature, max30205_celsius_to_fahrenheit(temperature));
phonemacro 1:d1f45a4ff640 197
phonemacro 1:d1f45a4ff640 198 max30205_write_trip_high_tos(64.0625f, i2cBus);
phonemacro 1:d1f45a4ff640 199 temperature = max30205_read_reg_as_temperature(MAX30205_REG_TOS_HIGH_TRIP,
phonemacro 1:d1f45a4ff640 200 i2cBus);
phonemacro 1:d1f45a4ff640 201 pc.printf("TOS Temperature = %3.4f Celsius, %3.4f Fahrenheit\r\n",
phonemacro 1:d1f45a4ff640 202 temperature, max30205_celsius_to_fahrenheit(temperature));
phonemacro 1:d1f45a4ff640 203 #endif
phonemacro 1:d1f45a4ff640 204
phonemacro 1:d1f45a4ff640 205 pc.printf("\r\n");
phonemacro 1:d1f45a4ff640 206 max30205_write_cfg_reg(uint8_t(MAX30205_CFG_ONE_SHOT_START |
phonemacro 1:d1f45a4ff640 207 MAX30205_CFG_TIMEOUT_DISABLE | MAX30205_CFG_EXTENDED_FORMAT |
phonemacro 1:d1f45a4ff640 208 MAX30205_CFG_FAULT_FILTER_4 | MAX30205_CFG_OS_POLARITY_ACT_LOW |
phonemacro 1:d1f45a4ff640 209 MAX30205_CFG_COMPARATOR_MODE | MAX30205_CFG_SHUTDOWN), i2cBus);
phonemacro 1:d1f45a4ff640 210 for (i = 0; i < 8; i++) {
phonemacro 1:d1f45a4ff640 211 wait_sec_prompt(wait_shut); /* leave it in shutdown mode for a while */
phonemacro 1:d1f45a4ff640 212 /* Configure for one shot, time out disabled, extended format, fault filter 4,
phonemacro 1:d1f45a4ff640 213 active low polarity, comparator mode, shutdown
phonemacro 1:d1f45a4ff640 214 */
phonemacro 1:d1f45a4ff640 215 max30205_write_cfg_reg(uint8_t(MAX30205_CFG_ONE_SHOT_START |
phonemacro 1:d1f45a4ff640 216 MAX30205_CFG_TIMEOUT_DISABLE | MAX30205_CFG_EXTENDED_FORMAT |
phonemacro 1:d1f45a4ff640 217 MAX30205_CFG_FAULT_FILTER_4 | MAX30205_CFG_OS_POLARITY_ACT_LOW |
phonemacro 1:d1f45a4ff640 218 MAX30205_CFG_COMPARATOR_MODE | MAX30205_CFG_SHUTDOWN), i2cBus);
phonemacro 1:d1f45a4ff640 219 wait(MAX30205_WAIT_CONV_TIME);
phonemacro 1:d1f45a4ff640 220 temperature = max30205_read_reg_as_temperature(MAX30205_REG_TEMPERATURE,
phonemacro 1:d1f45a4ff640 221 i2cBus);
phonemacro 1:d1f45a4ff640 222 pc.printf("Temperature = %3.4f Celsius, %3.4f Fahrenheit\r\n",
phonemacro 1:d1f45a4ff640 223 temperature, temp_sensor.celsius_to_fahrenheit(temperature));
phonemacro 1:d1f45a4ff640 224 }
phonemacro 1:d1f45a4ff640 225 max30205_read_cfg_reg(&cfg, i2cBus);
phonemacro 1:d1f45a4ff640 226 pc.printf("Configuration Register = 0x%02Xh \r\n", cfg);
phonemacro 1:d1f45a4ff640 227
phonemacro 2:9670fb20b9a2 228 #if 0
phonemacro 1:d1f45a4ff640 229 max30205_write_trip_low_thyst(-55, i2cBus);
phonemacro 1:d1f45a4ff640 230 temperature = max30205_read_reg_as_temperature(MAX30205_REG_THYST_LOW_TRIP,
phonemacro 1:d1f45a4ff640 231 i2cBus);
phonemacro 1:d1f45a4ff640 232 pc.printf("Thyst Temperature = %3.4f Celsius, %3.4f Fahrenheit\r\n",
phonemacro 1:d1f45a4ff640 233 temperature, max30205_celsius_to_fahrenheit(temperature));
phonemacro 1:d1f45a4ff640 234
phonemacro 1:d1f45a4ff640 235 max30205_write_trip_high_tos(125.0f, i2cBus);
phonemacro 1:d1f45a4ff640 236 temperature = max30205_read_reg_as_temperature(MAX30205_REG_TOS_HIGH_TRIP,
phonemacro 1:d1f45a4ff640 237 i2cBus);
phonemacro 1:d1f45a4ff640 238 pc.printf("TOS Temperature = %3.4f Celsius, %3.4f Fahrenheit\r\n",
phonemacro 1:d1f45a4ff640 239 temperature, max30205_celsius_to_fahrenheit(temperature));
phonemacro 1:d1f45a4ff640 240 #endif
phonemacro 1:d1f45a4ff640 241 pc.printf("\r\n\r\n\r\n");
phonemacro 1:d1f45a4ff640 242
phonemacro 1:d1f45a4ff640 243
phonemacro 1:d1f45a4ff640 244 while (true) { // Blink the green LED
phonemacro 1:d1f45a4ff640 245 gLED = !gLED;
phonemacro 1:d1f45a4ff640 246 wait(0.5);
phonemacro 1:d1f45a4ff640 247 }
phonemacro 0:f205abc96ff9 248 }
phonemacro 1:d1f45a4ff640 249
phonemacro 1:d1f45a4ff640 250