Untitled

mail@pastecode.io avatar
unknown
plain_text
7 months ago
5.2 kB
0
Indexable
Never
#include <Adafruit_GFX.h>        //OLED  libraries
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#include "MAX30105.h"           //MAX3010x library
#include "heartRate.h"          //Heart rate  calculating algorithm
MAX30105 particleSensor;

uint32_t CalcForSeconds = 60ul; //Сколько секунд он будет делать расчёты
uint32_t sumator = 0ul , delta = 0ul; //Счетчик
bool isCalc = true, isCalced = false;
int result = 0;
const byte RATE_SIZE  = 4; //Increase this for more averaging. 4 is good.
byte rates[RATE_SIZE]; //Array  of heart rates
byte rateSpot = 0;
long lastBeat = 0; //Time at which the last  beat occurred
float beatsPerMinute;
int beatAvg;
#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_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);  //Declaring the display name (display)

static const unsigned char PROGMEM  logo2_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 called
0x04, 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,  };

static const unsigned char PROGMEM logo3_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 };


void setup() {  
  display.begin(SSD1306_SWITCHCAPVCC,  0x3C); //Start the OLED display
  display.display();
  delay(3000);
  //  Initialize sensor
  particleSensor.begin(Wire, I2C_SPEED_FAST); //Use default  I2C port, 400kHz speed
  particleSensor.setup(); //Configure sensor with default  settings
  particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to  indicate sensor is running
}
void drawTextNoFinger(){
  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);
}
void drawTextHasFingerAnim1()
{
  display.clearDisplay();                                   //Clear the display
  display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE);       //Draw the first bmp  picture (little heart)
  drawBPM();           
}
void drawTextHasFingerAnim2()
{
   display.clearDisplay();                                //Clear  the display
   display.drawBitmap(0, 0, logo3_bmp, 32, 32, WHITE);    //Draw  the second picture (bigger heart)
   drawBPM();          
}
void drawBPM(){
   display.setTextSize(2);                                //And  still displays the average BPM
   display.setTextColor(WHITE); 
   display.setCursor(50,0);                
   display.println("BPM");
   if (isCalced) drawValue();  
   else display.display();
}
void drawValue(){
  display.setCursor(50,18);                
  display.println(beatAvg); 
  display.display();
}
void stuk(){
  tone(3,1000);                                        //And  tone the buzzer for a 100ms you can reduce it it will be better
  delay(100);
  noTone(3); 
}

void waitTime(){
  //beatAvg++;
  if (sumator >= CalcForSeconds*1000ul && isCalced == false){
    int ss = 0;
    beatAvg = result + 30;
    sumator = 0;
    isCalced = true;
    isCalc = false;
  }
}
void loop() {
 lastBeat = millis();

 long irValue = 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 heartbeat
    if(irValue  >= 7000){                                        //If a finger is detected
      drawTextHasFingerAnim1();       
      if (checkForBeat(irValue))                        //If  a heart beat is detected
      {
        if (isCalc) 
        {
          result+=1;  
          drawTextHasFingerAnim2();
          stuk();
        }
        waitTime();
      }
    }
    else if (irValue < 7000){ 
      isCalced = false;
      isCalc = true;
      drawTextNoFinger();
    }
    delta = millis() - lastBeat;
    sumator += delta;
}
Leave a Comment