#include <SPI.
h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define SENSOR_PIN A0
#define HIGH_PULSE 540
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
int lastX = 0, lastY = 60, x = 0;
int pulseValue, BPM = 0;
long lastBeatTime = 0;
bool pulseDetected = false;
void setup() {
[Link](9600);
[Link](SSD1306_SWITCHCAPVCC, 0x3C);
[Link]();
[Link](2);
[Link](SSD1306_WHITE);
[Link](20, 10);
[Link]("Initializing...");
[Link]();
delay(2000);
[Link]();
}
void loop() {
[Link]();
pulseValue = analogRead(SENSOR_PIN);
[Link](pulseValue);
int y = map(pulseValue, 0, 1023, 60, 0);
if (x > SCREEN_WIDTH) x = lastX = 0;
[Link](lastX, lastY, x, y, SSD1306_WHITE);
lastX = x;
lastY = y;
x++;
calculateBPM();
[Link](10, 50);
[Link](2);
[Link]("BPM: ");
[Link](BPM);
[Link]();
delay(20);
}
void calculateBPM() {
if (pulseValue > HIGH_PULSE) {
if (!pulseDetected) {
long currentTime = millis();
if (lastBeatTime > 0) {
long timeBetweenBeats = currentTime - lastBeatTime;
BPM = 60000 / timeBetweenBeats;
}
lastBeatTime = currentTime;
pulseDetected = true;
}
} else {
pulseDetected = false;
}
}