#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "MAX30105.h"
#include "heartRate.h"
// กำหนดที่อยู่ของจอ LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
// กำหนดตัวแปรของ MAX30105
MAX30105 particleSensor;
const byte RATE_SIZE = 4;
byte rates[RATE_SIZE];
byte rateSpot = 0;
long lastBeat = 0;
float beatsPerMinute;
int beatAvg;
void setup()
{
Serial.begin(115200);
lcd.begin();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Initializing...");
// เริ่มต้นเซ็นเซอร์ MAX30105
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
Serial.println("MAX30105 not found");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sensor Error");
while (1);
}
particleSensor.setup();
particleSensor.setPulseAmplitudeRed(0x0A);
particleSensor.setPulseAmplitudeGreen(0);
delay(2000); // รอให้เซ็นเซอร์เริ่มทำงาน
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Place finger");
}
void loop()
{
long irValue = particleSensor.getIR();
if (checkForBeat(irValue) == true)
{
long delta = millis() - lastBeat;
lastBeat = millis();
beatsPerMinute = 60 / (delta / 1000.0);
if (beatsPerMinute < 255 && beatsPerMinute > 20)
{
rates[rateSpot++] = (byte)beatsPerMinute;
rateSpot %= RATE_SIZE;
beatAvg = 0;
for (byte x = 0; x < RATE_SIZE; x++) {
beatAvg += rates[x];
}
beatAvg /= RATE_SIZE;
}
}
// แสดงค่าบน Serial Monitor
Serial.print("IR=");
Serial.print(irValue);
Serial.print(", BPM=");
Serial.print(beatsPerMinute);
Serial.print(", Avg BPM=");
Serial.print(beatAvg);
if (irValue < 50000) Serial.print(" No finger?");
Serial.println();
// แสดงค่าบน LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("BPM: ");
lcd.print(beatsPerMinute);
lcd.setCursor(0, 1);
lcd.print("Avg BPM: ");
lcd.print(beatAvg);
delay(1000);
}
I2luY2x1ZGUgPFdpcmUuaD4KI2luY2x1ZGUgPExpcXVpZENyeXN0YWxfSTJDLmg+CiNpbmNsdWRlICJNQVgzMDEwNS5oIgojaW5jbHVkZSAiaGVhcnRSYXRlLmgiCgovLyDguIHguLPguKvguJnguJTguJfguLXguYjguK3guKLguLnguYjguILguK3guIfguIjguK0gTENEIEkyQwpMaXF1aWRDcnlzdGFsX0kyQyBsY2QoMHgyNywgMTYsIDIpOwoKLy8g4LiB4Liz4Lir4LiZ4LiU4LiV4Lix4Lin4LmB4Lib4Lij4LiC4Lit4LiHIE1BWDMwMTA1Ck1BWDMwMTA1IHBhcnRpY2xlU2Vuc29yOwpjb25zdCBieXRlIFJBVEVfU0laRSA9IDQ7CmJ5dGUgcmF0ZXNbUkFURV9TSVpFXTsKYnl0ZSByYXRlU3BvdCA9IDA7CmxvbmcgbGFzdEJlYXQgPSAwOwoKZmxvYXQgYmVhdHNQZXJNaW51dGU7CmludCBiZWF0QXZnOwoKdm9pZCBzZXR1cCgpCnsKICAgIFNlcmlhbC5iZWdpbigxMTUyMDApOwogICAgbGNkLmJlZ2luKCk7CiAgICBsY2QuYmFja2xpZ2h0KCk7CiAgICAKICAgIGxjZC5zZXRDdXJzb3IoMCwgMCk7CiAgICBsY2QucHJpbnQoIkluaXRpYWxpemluZy4uLiIpOwoKICAgIC8vIOC5gOC4o+C4tOC5iOC4oeC4leC5ieC4meC5gOC4i+C5h+C4meC5gOC4i+C4reC4o+C5jCBNQVgzMDEwNQogICAgaWYgKCFwYXJ0aWNsZVNlbnNvci5iZWdpbihXaXJlLCBJMkNfU1BFRURfRkFTVCkpIHsKICAgICAgICBTZXJpYWwucHJpbnRsbigiTUFYMzAxMDUgbm90IGZvdW5kIik7CiAgICAgICAgbGNkLmNsZWFyKCk7CiAgICAgICAgbGNkLnNldEN1cnNvcigwLCAwKTsKICAgICAgICBsY2QucHJpbnQoIlNlbnNvciBFcnJvciIpOwogICAgICAgIHdoaWxlICgxKTsKICAgIH0KCiAgICBwYXJ0aWNsZVNlbnNvci5zZXR1cCgpOwogICAgcGFydGljbGVTZW5zb3Iuc2V0UHVsc2VBbXBsaXR1ZGVSZWQoMHgwQSk7CiAgICBwYXJ0aWNsZVNlbnNvci5zZXRQdWxzZUFtcGxpdHVkZUdyZWVuKDApOwogICAgCiAgICBkZWxheSgyMDAwKTsgLy8g4Lij4Lit4LmD4Lir4LmJ4LmA4LiL4LmH4LiZ4LmA4LiL4Lit4Lij4LmM4LmA4Lij4Li04LmI4Lih4LiX4Liz4LiH4Liy4LiZCiAgICBsY2QuY2xlYXIoKTsKICAgIGxjZC5zZXRDdXJzb3IoMCwgMCk7CiAgICBsY2QucHJpbnQoIlBsYWNlIGZpbmdlciIpOwp9Cgp2b2lkIGxvb3AoKQp7CiAgICBsb25nIGlyVmFsdWUgPSBwYXJ0aWNsZVNlbnNvci5nZXRJUigpOwoKICAgIGlmIChjaGVja0ZvckJlYXQoaXJWYWx1ZSkgPT0gdHJ1ZSkKICAgIHsKICAgICAgICBsb25nIGRlbHRhID0gbWlsbGlzKCkgLSBsYXN0QmVhdDsKICAgICAgICBsYXN0QmVhdCA9IG1pbGxpcygpOwoKICAgICAgICBiZWF0c1Blck1pbnV0ZSA9IDYwIC8gKGRlbHRhIC8gMTAwMC4wKTsKCiAgICAgICAgaWYgKGJlYXRzUGVyTWludXRlIDwgMjU1ICYmIGJlYXRzUGVyTWludXRlID4gMjApCiAgICAgICAgewogICAgICAgICAgICByYXRlc1tyYXRlU3BvdCsrXSA9IChieXRlKWJlYXRzUGVyTWludXRlOwogICAgICAgICAgICByYXRlU3BvdCAlPSBSQVRFX1NJWkU7CgogICAgICAgICAgICBiZWF0QXZnID0gMDsKICAgICAgICAgICAgZm9yIChieXRlIHggPSAwOyB4IDwgUkFURV9TSVpFOyB4KyspIHsKICAgICAgICAgICAgICAgIGJlYXRBdmcgKz0gcmF0ZXNbeF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmVhdEF2ZyAvPSBSQVRFX1NJWkU7CiAgICAgICAgfQogICAgfQoKICAgIC8vIOC5geC4quC4lOC4h+C4hOC5iOC4suC4muC4mSBTZXJpYWwgTW9uaXRvcgogICAgU2VyaWFsLnByaW50KCJJUj0iKTsKICAgIFNlcmlhbC5wcmludChpclZhbHVlKTsKICAgIFNlcmlhbC5wcmludCgiLCBCUE09Iik7CiAgICBTZXJpYWwucHJpbnQoYmVhdHNQZXJNaW51dGUpOwogICAgU2VyaWFsLnByaW50KCIsIEF2ZyBCUE09Iik7CiAgICBTZXJpYWwucHJpbnQoYmVhdEF2Zyk7CiAgICBpZiAoaXJWYWx1ZSA8IDUwMDAwKSBTZXJpYWwucHJpbnQoIiBObyBmaW5nZXI/Iik7CiAgICBTZXJpYWwucHJpbnRsbigpOwoKICAgIC8vIOC5geC4quC4lOC4h+C4hOC5iOC4suC4muC4mSBMQ0QKICAgIGxjZC5jbGVhcigpOwogICAgbGNkLnNldEN1cnNvcigwLCAwKTsKICAgIGxjZC5wcmludCgiQlBNOiAiKTsKICAgIGxjZC5wcmludChiZWF0c1Blck1pbnV0ZSk7CiAgICBsY2Quc2V0Q3Vyc29yKDAsIDEpOwogICAgbGNkLnByaW50KCJBdmcgQlBNOiAiKTsKICAgIGxjZC5wcmludChiZWF0QXZnKTsKCiAgICBkZWxheSgxMDAwKTsKfQo=
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "MAX30105.h"
#include "heartRate.h"
// กำหนดที่อยู่ของจอ LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
// กำหนดตัวแปรของ MAX30105
MAX30105 particleSensor;
const byte RATE_SIZE = 4;
byte rates[RATE_SIZE];
byte rateSpot = 0;
long lastBeat = 0;
float beatsPerMinute;
int beatAvg;
void setup()
{
Serial.begin(115200);
lcd.begin();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Initializing...");
// เริ่มต้นเซ็นเซอร์ MAX30105
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
Serial.println("MAX30105 not found");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sensor Error");
while (1);
}
particleSensor.setup();
particleSensor.setPulseAmplitudeRed(0x0A);
particleSensor.setPulseAmplitudeGreen(0);
delay(2000); // รอให้เซ็นเซอร์เริ่มทำงาน
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Place finger");
}
void loop()
{
long irValue = particleSensor.getIR();
if (checkForBeat(irValue) == true)
{
long delta = millis() - lastBeat;
lastBeat = millis();
beatsPerMinute = 60 / (delta / 1000.0);
if (beatsPerMinute < 255 && beatsPerMinute > 20)
{
rates[rateSpot++] = (byte)beatsPerMinute;
rateSpot %= RATE_SIZE;
beatAvg = 0;
for (byte x = 0; x < RATE_SIZE; x++) {
beatAvg += rates[x];
}
beatAvg /= RATE_SIZE;
}
}
// แสดงค่าบน Serial Monitor
Serial.print("IR=");
Serial.print(irValue);
Serial.print(", BPM=");
Serial.print(beatsPerMinute);
Serial.print(", Avg BPM=");
Serial.print(beatAvg);
if (irValue < 50000) Serial.print(" No finger?");
Serial.println();
// แสดงค่าบน LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("BPM: ");
lcd.print(beatsPerMinute);
lcd.setCursor(0, 1);
lcd.print("Avg BPM: ");
lcd.print(beatAvg);
delay(1000);
}