#include<Adafruit_GFX.h> //OLED libraries#include<Adafruit_SSD1306.h>#include<Wire.h>#include"MAX30105.h" //MAX3010x library#include"heartRate.h" //Heart rate calculating algorithmMAX30105particleSensor;constbyteRATE_SIZE=4;//Increase this for more averaging. 4 is good.byterates[RATE_SIZE];//Array of heart ratesbyterateSpot=0;longlastBeat=0;//Time at which the last beat occurredfloatbeatsPerMinute;intbeatAvg;#define SCREEN_WIDTH 128 // OLED display width, in pixels#define SCREEN_HEIGHT 32 // OLED display height, in pixels#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)Adafruit_SSD1306display(SCREEN_WIDTH,SCREEN_HEIGHT,&Wire,OLED_RESET);//Declaring the display name (display)staticconstunsignedcharPROGMEMlogo2_bmp[]={0x03,0xC0,0xF0,0x06,0x71,0x8C,0x0C,0x1B,0x06,0x18,0x0E,0x02,0x10,0x0C,0x03,0x10,//Logo2 and Logo3 are two bmp pictures that display on the OLED if called0x04,0x01,0x10,0x04,0x01,0x10,0x40,0x01,0x10,0x40,0x01,0x10,0xC0,0x03,0x08,0x88,0x02,0x08,0xB8,0x04,0xFF,0x37,0x08,0x01,0x30,0x18,0x01,0x90,0x30,0x00,0xC0,0x60,0x00,0x60,0xC0,0x00,0x31,0x80,0x00,0x1B,0x00,0x00,0x0E,0x00,0x00,0x04,0x00,};staticconstunsignedcharPROGMEMlogo3_bmp[]={0x01,0xF0,0x0F,0x80,0x06,0x1C,0x38,0x60,0x18,0x06,0x60,0x18,0x10,0x01,0x80,0x08,0x20,0x01,0x80,0x04,0x40,0x00,0x00,0x02,0x40,0x00,0x00,0x02,0xC0,0x00,0x08,0x03,0x80,0x00,0x08,0x01,0x80,0x00,0x18,0x01,0x80,0x00,0x1C,0x01,0x80,0x00,0x14,0x00,0x80,0x00,0x14,0x00,0x80,0x00,0x14,0x00,0x40,0x10,0x12,0x00,0x40,0x10,0x12,0x00,0x7E,0x1F,0x23,0xFE,0x03,0x31,0xA0,0x04,0x01,0xA0,0xA0,0x0C,0x00,0xA0,0xA0,0x08,0x00,0x60,0xE0,0x10,0x00,0x20,0x60,0x20,0x06,0x00,0x40,0x60,0x03,0x00,0x40,0xC0,0x01,0x80,0x01,0x80,0x00,0xC0,0x03,0x00,0x00,0x60,0x06,0x00,0x00,0x30,0x0C,0x00,0x00,0x08,0x10,0x00,0x00,0x06,0x60,0x00,0x00,0x03,0xC0,0x00,0x00,0x01,0x80,0x00};voidsetup(){display.begin(SSD1306_SWITCHCAPVCC,0x3C);//Start the OLED displaydisplay.display();delay(3000);// Initialize sensorparticleSensor.begin(Wire,I2C_SPEED_FAST);//Use default I2C port, 400kHz speedparticleSensor.setup();//Configure sensor with default settingsparticleSensor.setPulseAmplitudeRed(0x0A);//Turn Red LED to low to indicate sensor is running}voidloop(){longirValue=particleSensor.getIR();//Reading the IR value it will permit us to know if there's a finger on the sensor or not//Also detecting a heartbeatif(irValue>7000){//If a finger is detecteddisplay.clearDisplay();//Clear the displaydisplay.drawBitmap(5,5,logo2_bmp,24,21,WHITE);//Draw the first bmp picture (little heart)display.setTextSize(2);//Near it display the average BPM you can display the BPM if you wantdisplay.setTextColor(WHITE);display.setCursor(50,0);display.println("BPM");display.setCursor(50,18);display.println(beatAvg);display.display();if(checkForBeat(irValue)==true)//If a heart beat is detected{display.clearDisplay();//Clear the displaydisplay.drawBitmap(0,0,logo3_bmp,32,32,WHITE);//Draw the second picture (bigger heart)display.setTextSize(2);//And still displays the average BPMdisplay.setTextColor(WHITE);display.setCursor(50,0);display.println("BPM");display.setCursor(50,18);display.println(beatAvg);display.display();tone(3,1000);//And tone the buzzer for a 100ms you can reduce it it will be betterdelay(100);noTone(3);//Deactivate the buzzer to have the effect of a "bip"//We sensed a beat!longdelta=millis()-lastBeat;//Measure duration between two beatslastBeat=millis();beatsPerMinute=60/(delta/1000.0);//Calculating the BPMif(beatsPerMinute<255&&beatsPerMinute>20)//To calculate the average we strore some values (4) then do some math to calculate the average{rates[rateSpot++]=(byte)beatsPerMinute;//Store this reading in the arrayrateSpot%=RATE_SIZE;//Wrap variable//Take average of readingsbeatAvg=0;for(bytex=0;x<RATE_SIZE;x++)beatAvg+=rates[x];beatAvg/=RATE_SIZE;}}}if(irValue<7000){//If no finger is detected it inform the user and put the average BPM to 0 or it will be stored for the next measurebeatAvg=0;display.clearDisplay();display.setTextSize(1);display.setTextColor(WHITE);display.setCursor(30,5);display.println("Please Place ");display.setCursor(30,15);display.println("your finger ");display.display();noTone(3);}}