Lucas Lim / Mbed 2 deprecated HSP_Temperature_Barometer_CS3237

Dependencies:   mbed

Revision:
20:652f0bf256bd
Parent:
18:b64938c813dc
Child:
21:de62f413b500
--- a/main.cpp	Thu Oct 20 16:42:25 2016 +0000
+++ b/main.cpp	Fri Aug 23 16:18:23 2019 +0000
@@ -1,57 +1,205 @@
 #include "mbed.h"
 #include "MAX14720.h"
+#include "MAX30205.h"
+#include "MAX30101.h"
+#include "BMP280.h"
+#include "MAX30001.h"
+#include "QuadSpiInterface.h"
+#include "S25FS512.h"
 
-// I2C Master 2
+//Define all I2C addresses
+#define MAX30205_I2C_SLAVE_ADDR_TOP (0x92)
+#define MAX30205_I2C_SLAVE_ADDR_BOTTOM (0x90)
+#define MAX14720_I2C_SLAVE_ADDR (0x54)
+#define MAX30101_I2C_SLAVE_ADDR (0xAE)
+#define BMP280_I2C_SLAVE_ADDR (0xEC)
+#define MAX30001_
+
+#define HVOUT_VOLTAGE 4500 // set to 4500 mV
+
+// I2C Masters
+I2C i2c1(I2C1_SDA, I2C1_SCL);
 I2C i2c2(I2C2_SDA, I2C2_SCL);
 
-#define  I2C_ADDR_PMIC   (0x54)
-MAX14720 max14720(&i2c2,I2C_ADDR_PMIC);
+/// SPI Master 0 with SPI0_SS for use with MAX30001
+SPI spi(SPI0_MOSI, SPI0_MISO, SPI0_SCK, SPI0_SS); // used by MAX30001
+/// SPI Master 1
+QuadSpiInterface quadSpiInterface(SPI1_MOSI, SPI1_MISO, SPI1_SCK,
+                                  SPI1_SS); // used by S25FS512
+
+
+// Top local Temperature Sensor
+MAX30205 MAX30205_top(&i2c1, MAX30205_I2C_SLAVE_ADDR_TOP);
+
+// Botttom local Temperature Sensor
+MAX30205 MAX30205_bottom(&i2c1, MAX30205_I2C_SLAVE_ADDR_BOTTOM);
+
+// Barometric Pressure Sensor
+BMP280 bmp280_pres(&i2c1, BMP280_I2C_SLAVE_ADDR);
+
+//PMIC
+MAX14720 max14720(&i2c2,MAX14720_I2C_SLAVE_ADDR);
+
+// Optical Oximeter
+MAX30101 max30101(&i2c2, MAX30101_I2C_SLAVE_ADDR);
+
+/// External Flash
+S25FS512 s25fs512(&quadSpiInterface);
+
+/// ECG device
+MAX30001 max30001(&spi);
+InterruptIn max30001_InterruptB(P3_6);
+InterruptIn max30001_Interrupt2B(P4_5);
+
+/// PWM used as fclk for the MAX30001
+PwmOut pwmout(P1_7);
+
 
 DigitalOut led(LED1);
-InterruptIn button(SW1);
+
+//Serial 
+Serial pc(USBTX, USBRX);
+InterruptIn Button(SW1);
 
 void turnOff()
 {
-    // Write the power down command to the PMIC
-    max14720.shutdown();
+    //write the power down command to PMIC
+    max14720.shutdown();    
 }
-
 int main()
 {
-    // Assign turnOff function to falling edge of button
-    button.fall(&turnOff);
-
-    // Turn LED signal on to make buck-boost output visible
-    led = 0;
-
+    
     // Override the default value of boostEn to BOOST_ENABLED
     max14720.boostEn = MAX14720::BOOST_ENABLED;
     // Note that writing the local value does directly affect the part
     // The buck-boost regulator will remain off until init is called
+    max14720.init();
+    // Turn LED signal on to make buck-boost output visible
+    max14720.boostSetVoltage(HVOUT_VOLTAGE);
+    led = 0;
+    
+    // Initialise the BMP280
+    bmp280_pres.init(BMP280::OVERSAMPLING_X16_P, BMP280::OVERSAMPLING_X2_T, BMP280::FILT_4, BMP280::NORMAL_MODE, BMP280::T_62_5);
 
-    // Call init to apply all settings to the PMIC
-    if (max14720.init() == MAX14720_ERROR) {
-        printf("Error initializing MAX14720");
-    }
+    // MAX30001
+    printf("Init MAX30001 callbacks, interrupts...\n");
+    fflush(stdout);
+    max30001_InterruptB.disable_irq();
+    max30001_Interrupt2B.disable_irq();
+    max30001_InterruptB.mode(PullUp);
+    max30001_InterruptB.fall(&MAX30001::Mid_IntB_Handler);
+    max30001_Interrupt2B.mode(PullUp);
+    max30001_Interrupt2B.fall(&MAX30001::Mid_Int2B_Handler);
+    max30001_InterruptB.enable_irq();
+    max30001_Interrupt2B.enable_irq();
+    max30001.AllowInterrupts(1);
+    // Configuring the FCLK for the ECG, set to 32.768KHZ
+    printf("Init MAX30001 PWM...\n");
+    fflush(stdout);
+    //pwmout.period_us(31);      
+    //pwmout.write(0.5);          // 0-1 is 0-100%, 0.5 = 50% duty cycle.
+    max30001.FCLK_MaximOnly();    // mbed does not provide the resolution necessary, so for now we have a specific solution...
+    max30001.sw_rst(); // Do a software reset of the MAX30001
+    max30001.INT_assignment(MAX30001::MAX30001_INT_B,    MAX30001::MAX30001_NO_INT,   MAX30001::MAX30001_NO_INT,  //  en_enint_loc,      en_eovf_loc,   en_fstint_loc,
+                                     MAX30001::MAX30001_INT_2B,   MAX30001::MAX30001_INT_2B,   MAX30001::MAX30001_NO_INT,  //  en_dcloffint_loc,  en_bint_loc,   en_bovf_loc,
+                                     MAX30001::MAX30001_INT_2B,   MAX30001::MAX30001_INT_2B,   MAX30001::MAX30001_NO_INT,  //  en_bover_loc,      en_bundr_loc,  en_bcgmon_loc,
+                                     MAX30001::MAX30001_INT_B,    MAX30001::MAX30001_NO_INT,   MAX30001::MAX30001_NO_INT,  //  en_pint_loc,       en_povf_loc,   en_pedge_loc,
+                                     MAX30001::MAX30001_INT_2B,   MAX30001::MAX30001_INT_B,    MAX30001::MAX30001_NO_INT,  //  en_lonint_loc,     en_rrint_loc,  en_samp_loc,
+                                     MAX30001::MAX30001_INT_ODNR, MAX30001::MAX30001_INT_ODNR);                            //  intb_Type,         int2b_Type)
+    max30001.onDataAvailable(&StreamPacketUint32);
 
-    // Wait 1 second to see the buck-boost regulator turn on
-    wait(1);
+
 
-    while(1) {
-        // Turn off the buck-boost regulators
-        max14720.boostSetMode(MAX14720::BOOST_DISABLED);
-        wait(0.5);
+    // Use the POR configuration register values
+    
+    //Temperature sensor variables
+    uint16_t rawTemp_top;
+    uint16_t rawTemp_bottom ;
+    float celsius_top, celsius_bottom;
+    float fahrenheit_top, fahrenheit_bottom;
+    
+    //barometric sensor variables
+    char bmp280_rawData = 0;
+    float Temp_degC, Press_Pa, Press_Bar;
+    
+    //optical sensor variables
+    uint8_t fifo_waterlevel_mark;
+    uint8_t sample_avg;
+    uint8_t sample_rate;
+    uint8_t pulse_width;
+    uint8_t fifo_waterlevel_mark1;
+    uint8_t sample_avg1;
+    uint8_t sample_rate1;
+    uint8_t pulse_width1;
+    uint8_t fifo_waterlevel_mark2;
+    uint8_t sample_avg2;
+    uint8_t sample_rate2;
+    uint8_t pulse_width2;
+    uint8_t red_led_current, green_led_current;
+    uint8_t ir_led_current;
+    uint8_t slot_1, slot_2, slot_3, slot_4;
+    
+    wait(2);
+    
+    //Endless loop
+    while(1) 
+    {
+        /* Temperature Sensor Settings */
+        
+        //Read Temperature
+        MAX30205_top.readTemperature(&rawTemp_top);
+        MAX30205_bottom.readTemperature(&rawTemp_bottom);   
+        // Read BMP280 Temp. and Pressure
+        bmp280_pres.ReadCompDataRaw(&bmp280_rawData);
+        bmp280_pres.ToFloat(&bmp280_rawData, &Temp_degC, &Press_Pa);
+        // Convert to Celsius
+        celsius_top = MAX30205_top.toCelsius(rawTemp_top);
+        celsius_bottom = MAX30205_bottom.toCelsius(rawTemp_bottom);
+        
+        // Convert to Fahrenheit
+        fahrenheit_top = MAX30205_top.toFahrenheit(celsius_top);
+        fahrenheit_bottom = MAX30205_bottom.toFahrenheit(celsius_bottom);
+        
+        
+        /* Barometric Sensor Settings */
+    
+        Press_Bar = Press_Pa / 100000;
+        
+        /* Optical Sensor settings */
+        
+        
 
-        // Change the voltage of the buck-boost regulator and enable it
-        max14720.boostSetVoltage(2500);
-        max14720.boostSetMode(MAX14720::BOOST_ENABLED);
-        wait(0.5);
+        /* Printing various sensor values */
+        pc.printf("***** MAX30205 Temperature Sensor Reading *****\n\r");
+        pc.printf("Top Temperature: %.2f\370 C\n\rBottom Temperature: %.2f\370 C \n\rTop Temperature in Farenheit: %.2f\370 F\n\rBottom Temperature in Farenheit %.2f\370 F\n\n\r", celsius_top, celsius_bottom, fahrenheit_top, fahrenheit_bottom);
+        
+        pc.printf("***** BMP280 Barometric Sensor Reading *****\n\r");
+        pc.printf("Temp_degC : %.2f , Press_Bar is %.2f , Press_pa is %.2f\n\n\r",Temp_degC, Press_Bar, Press_Pa);
+        
+        max30101.HRmode_init(fifo_waterlevel_mark1,sample_avg1,sample_rate1,pulse_width1,red_led_current);             
+        pc.printf("***** MAX30101 Optical Sensor Reading [HR mode]*****\n\r");
+        pc.printf("Optical Sensor Value [fifo_waterlevel_mark: %d]\n\rOptical Sensor Value[sample_avg: %d]\n\rOptical Sensor Value[pulse_width: %d]\n\n\r", fifo_waterlevel_mark,sample_avg,pulse_width);
+        max30101.HRmode_stop();
+        
+        max30101.SpO2mode_init(fifo_waterlevel_mark, sample_avg, sample_rate, pulse_width, red_led_current, ir_led_current);
+        pc.printf("***** MAX30101 Optical Sensor Reading [SpO2 mode]*****\n\r");
+        pc.printf("Optical Sensor Value [fifo_waterlevel_mark: %d]\n\rOptical Sensor Value[sample_avg: %d]\n\rOptical Sensor Value[pulse_width: %d]\n\n\r", fifo_waterlevel_mark,sample_avg,pulse_width);
+        max30101.SpO2mode_stop();
+        
+ //       max30101.Multimode_init(fifo_waterlevel_mark2,sample_avg2,sample_rate2,pulse_width2,red_led_current, ir_led_current,green_led_current,slot_1,slot_2,slot_3,slot_4);
+//        wait(0.5);
+//        
+//        pc.printf("***** MAX30101 Optical Sensor Reading [Multi mode]*****\n\r");
+//        pc.printf("Optical Sensor Value [fifo_waterlevel_mark: %d]\n\rOptical Sensor Value[sample_avg: %d]\n\rOptical Sensor Value[pulse_width: %d]\n\rslot1: %d, slot2: %d, slot3: %d, slot4: %d\n\n\r", fifo_waterlevel_mark,sample_avg,pulse_width, slot_1, slot_2, slot_3, slot_4);
+//        
+    
+        //pc.printf("***** ECG Sensor Reading *****\n\r");
+        
+        pc.printf("-------------------------------------------------\n\n\n\r");
 
-        // Change the voltage of the buck-boost regulator
-        // Note that the MAX14720 cannot change the buck-boost voltage while
-        // it is enabled so if boostEn is set to BOOST_ENABLED, this
-        // function will disable it, change the voltage, and re-enable it.
-        max14720.boostSetVoltage(5000);
-        wait(0.5);
+        wait(0.2);
+        
+    
+       
     }
 }