#define USE_ARDUINO_INTERRUPTS true #include #include #include #include LiquidCrystal_I2C lcd(0x27,16,2); // LCD initialization int Signal; int const PULSE_SENSOR_PIN = 0; const int LED = 9; int Threshold = 550; // Determine which Signal to "count as a beat" and which to ignore File myFile; const int chipSelect = 10; PulseSensorPlayground pulseSensor; // Creates an object // Heart character to be displayed on LCD screen byte Heart[8] = { 0b00000, 0b01010, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000, 0b00000 }; void setup() { Serial.begin(9600); pinMode(LED, OUTPUT); // Configure the LCD screen lcd.init(); lcd.clear(); lcd.backlight(); lcd.createChar(0, Heart); // Configure the PulseSensor object pulseSensor.analogInput(PULSE_SENSOR_PIN); pulseSensor.blinkOnPulse(LED); pulseSensor.setThreshold(Threshold); if (pulseSensor.begin()) { Serial.println("PulseSensor object created!"); } // Open log file on the sd card in order to write to it myFile = SD.open("log.txt"); if (myFile) { Serial.println("log.txt:"); while (myFile.available()) { Serial.write(myFile.read()); } myFile.close(); } else { Serial.println("error opening log file on microSD card!"); } } void loop() { int myBPM = 0; int currentBPM = 0; int count = 0; int failures = 0; // Instructuions for the user lcd.setCursor(0,0); lcd.print("To start, place"); lcd.setCursor(0,1); lcd.print("finger on sensor."); delay(2000); if (pulseSensor.sawStartOfBeat()) { Serial.println("Measurement started"); lcd.clear(); lcd.setCursor(2,0); lcd.print("Measurement"); lcd.setCursor(4,1); lcd.print("started"); delay(2000); lcd.clear(); lcd.setCursor(2,0); lcd.print("Measuring..."); // Tries to take 30 measurements for (int i = 0; i < 30; i++) { // Take a measurement currentBPM = pulseSensor.getBeatsPerMinute(); // If actual measurement failed if (currentBPM == 0) { Serial.println("Please hold your finger still on the sensor"); failures++; // If 5 consecutive failures registered, then // current measurement is considered failed } else if (failures >= 5) { count = 0; break; } else { Serial.println(currentBPM); myBPM += currentBPM; currentBPM = 0; count++; failures = 0; } lcd.setCursor(7,1); lcd.print(i + 1); lcd.print("s"); delay(1000); } // Enough data to extract a result has been recorded if (count > 5) { myBPM /= count; // Write to serial Serial.println("♥ Your heartrate measurement ♥\nBPM:\t "); Serial.println(myBPM); // Display result on LCD lcd.clear(); lcd.setCursor(0,0); lcd.write(0); lcd.setCursor(4,0); lcd.print("your BPM"); lcd.setCursor(15,0); lcd.write(0); lcd.setCursor(6,1); lcd.print(myBPM); delay(5000); // Write result to file /* if (myFile) { myFile = SD.open("test.txt", FILE_WRITE); // Write to sd card myFile.println("♥ Your heartrate measurement ♥"); myFile.println(myBPM); myFile.close(); Serial.println("success writing to log file on microSD card."); lcd.clear(); lcd.setCursor(0,0); lcd.print("Writing to file"); lcd.setCursor(6,0); lcd.print("<<<<"); delay(1000); lcd.clear(); lcd.setCursor(2,0); lcd.print("Measurement"); lcd.setCursor(5,1); lcd.print("logged"); delay(1000); } else { Serial.println("error opening log file on microSD card!"); } */ // Simulate writing to sd card (owned card not supported) lcd.clear(); lcd.setCursor(0,0); lcd.print("Writing to file"); lcd.setCursor(6,1); lcd.print("<<<<"); delay(3000); lcd.clear(); lcd.setCursor(2,0); lcd.print("Measurement"); lcd.setCursor(5,1); lcd.print("logged"); delay(3000); } else { Serial.println("Measurement failed, try again!"); lcd.clear(); lcd.setCursor(2,0); lcd.print("Measurement"); lcd.setCursor(5,1); lcd.print("failed"); delay(2000); lcd.clear(); lcd.setCursor(3,0); lcd.print("Try again"); delay(2000); lcd.clear(); } } else { delay(1000); } delay(50); }