SISTEM
MONITORING TANDA VITAL
(DETAK JANTUNG, OKSIGEN DARAH, DAN
SUHU TUBUH)
BERBASIS
ESP32 DAN BLYNK
Disusun Oleh:
Muhamad
Aditya Pratama (26051204241)
Muhammad
Guntur Cahyadi Putra (26051204087)
Alfian
Nurrokhim (26051204240)
Albar Ghani Aziz (26051204133)
BAB
I
PENDAHULUAN
1.1 Latar
Belakang
Perkembangan teknologi Internet of Things (IoT) telah membawa
perubahan besar dalam bidang kesehatan, salah satunya memungkinkan pemantauan
tanda vital pasien secara real-time dari jarak jauh (telemedicine).
Detak jantung (heart rate), saturasi oksigen darah (SpO2), dan suhu
tubuh merupakan indikator dasar yang menggambarkan kondisi fisiologis
seseorang.
Mikrokontroler ESP32 dipilih sebagai pusat kendali karena memiliki modul
Wi-Fi bawaan yang andal serta daya pemrosesan yang cukup untuk menjalankan
algoritma pemrosesan sinyal. Sensor MAX30102 digunakan untuk mendeteksi detak
jantung dan SpO2 dengan prinsip photoplethysmography (PPG), sedangkan
sensor DS18B20 digunakan untuk mengukur suhu secara digital. Platform Blynk IoT
dimanfaatkan sebagai dashboard sehingga data sensor dapat
divisualisasikan secara grafis dan dipantau dari mana saja.
1.2 Rumusan
Masalah
Rumusan masalah pada laporan ini adalah sebagai
berikut.
1.
Bagaimana cara mengintegrasikan sensor MAX30102 dan
DS18B20 dengan mikrokontroler ESP32?
2.
Bagaimana menerapkan algoritma pendeteksian puncak
gelombang (peak detection) untuk menghitung BPM dan rasio cahaya untuk
memperkirakan SpO2?
3. Bagaimana cara mengirimkan dan memvisualisasikan data tanda vital secara real-time ke dashboard Blynk IoT?
1.3 Tujuan
Laporan
Tujuan dari laporan ini adalah sebagai berikut.
1.
Memahami prinsip kerja sensor MAX30102 (PPG) dan
DS18B20 serta cara interfacing-nya dengan ESP32 melalui protokol I2C dan
1-Wire.
2.
Menerapkan algoritma pemrosesan sinyal digital untuk
mengekstrak nilai BPM dan SpO2 tanpa mengganggu kinerja utama sistem (non-blocking).
3.
Merancang dan mengimplementasikan sistem IoT untuk
memonitor detak jantung, oksigen darah, dan suhu tubuh melalui platform Blynk.
1.4 Manfaat
Penulisan
Manfaat dari penulisan laporan ini adalah sebagai
berikut.
1.
Menambah pemahaman penulis mengenai konsep sistem embedded
dan IoT, khususnya akuisisi data biomedis dan komunikasi cloud.
2.
Memberikan purwarupa (prototype) sistem
monitoring kesehatan sederhana yang dapat dikembangkan menjadi alat yang lebih
kompleks.
3.
Menjadi bahan referensi bagi pembaca yang ingin
mempelajari integrasi sensor MAX30102, DS18B20, dan ESP32 dengan Blynk.
BAB
II
TINJAUAN PUSTAKA
2.1 Dasar
Teori
1. Internet
of Things (IoT)
IoT adalah konsep yang menghubungkan
perangkat fisik dengan jaringan internet agar dapat saling bertukar data. Pada
proyek ini, ESP32 berperan sebagai node yang mengumpulkan data
fisiologis dan mengirimkannya ke server cloud (Blynk) untuk dipantau
melalui aplikasi seluler maupun peramban web.
2. Mikrokontroler
ESP32
ESP32 adalah mikrokontroler berbiaya
rendah dan hemat daya yang dikembangkan oleh Espressif Systems. Modul ini telah
terintegrasi dengan Wi-Fi dan Bluetooth serta memiliki dua inti prosesor (dual-core)
sehingga tugas dapat dieksekusi secara paralel, yang sangat sesuai untuk
pemrosesan data sensor yang menuntut ketepatan waktu (Espressif Systems, n.d.).
3. Sensor
MAX30102
MAX30102 adalah sensor terintegrasi untuk
pemantauan detak jantung dan oksimetri denyut (pulse oximetry). Sensor
ini menggunakan dua LED (merah dan inframerah) serta fotodetektor untuk
mengukur perubahan volume darah pada kapiler berdasarkan prinsip PPG (SparkFun
Electronics, n.d.). Komunikasi dengan mikrokontroler dilakukan melalui protokol
I2C.
4. Sensor
DS18B20
DS18B20 adalah sensor suhu digital yang
berkomunikasi melalui protokol 1-Wire dan memberikan pembacaan dalam derajat
Celsius dengan resolusi yang dapat diatur 9 hingga 12 bit (Maxim Integrated,
n.d.). Konversi suhu pada resolusi tertinggi memerlukan waktu sekitar 750 ms,
sehingga pembacaan dapat dikonfigurasi secara non-blocking agar tidak
menghambat proses utama mikrokontroler.
5. Blynk IoT
Blynk adalah platform IoT berbasis cloud
yang menyediakan antarmuka drag-and-drop untuk membuat dashboard.
Data dikirim dari perangkat menggunakan Virtual Pin (V0, V1, dan
seterusnya) dan ditampilkan pada widget seperti Gauge atau Value
Display (Blynk Inc., n.d.).
2.2 Komponen
Komponen yang digunakan dalam sistem ini
ditunjukkan pada Tabel 1.
|
No. |
Komponen |
Fungsi |
|
1 |
ESP32 DevKit |
Pusat pengendali yang
terhubung ke Wi-Fi, memproses data sensor, dan mengirim data ke server Blynk. |
|
2 |
MAX30102 |
Mengukur detak jantung
(BPM) dan saturasi oksigen darah (SpO2) melalui jari. |
|
3 |
DS18B20 |
Mengukur suhu tubuh
pengguna secara digital. |
|
4 |
Resistor 4,7 kΩ |
Pull-up pada jalur data
(1-Wire) sensor DS18B20. |
|
5 |
Platform Blynk |
Dashboard pemantauan jarak
jauh untuk menampilkan data V0, V1, dan V2. |
Tabel 1. Komponen
yang digunakan
BAB
III
PEMBAHASAN
3.1 Penjelasan
Rangkaian
Rangkaian dibangun dengan menghubungkan
kedua sensor ke ESP32. Arsitektur sistem secara keseluruhan ditunjukkan pada
Gambar 1, sedangkan pemetaan pin rangkaian ditunjukkan pada Tabel 2 dan skema
rangkaian pada Gambar 2.

Gambar 1. Diagram blok sistem monitoring tanda
vital
|
Komponen |
Pin Komponen |
Pin ESP32 |
|
MAX30102 |
VIN |
3.3V |
|
GND |
GND |
|
|
SDA |
GPIO 21 |
|
|
SCL |
GPIO 22 |
|
|
DS18B20 |
VDD |
3.3V |
|
GND |
GND |
|
|
DATA |
GPIO 4 (dengan resistor 4,7 kΩ ke VDD) |

Gambar 2. Skema
rangkaian sistem monitoring tanda vital
3.2 Konfigurasi
Dashboard Blynk
Dashboard dikonfigurasi melalui Blynk
Console (blynk.cloud) Menggunakan akun Blynk yang terdaftar. Konfigurasi
dilakukan dengan urutan template, datastream, web dashboard, lalu perangkat
(device). Langkah-langkahnya adalah sebagai berikut.
1.
Masuk ke Blynk Console. Buka blynk.cloud, buat akun
baru atau masuk dengan akun yang sudah ada.
2.
Membuat template. Buka menu Developer Zone,
pilih My Templates, lalu klik + New Template. Isi Name
dengan “Health Monitoring” (boleh berbeda), Hardware dengan ESP32, dan Connection
Type dengan WiFi, kemudian klik Done. Nama template harus sama dengan
nilai BLYNK_TEMPLATE_NAME pada kode program.
3.
Membuat datastream. Pada template, buka tab Datastream,
klik + New Datastream, lalu pilih Virtual Pin. Buat tiga
datastream dengan pengaturan seperti pada Tabel 3, kemudian klik Create
untuk masing-masing. Nomor Virtual Pin harus sama dengan yang dipakai pada kode
(V0, V1, dan V2).
4.
Menyusun web dashboard. Buka tab Web Dashboard,
klik Edit, lalu seret widget ke area dashboard sesuai Tabel 4. Klik ikon
pengaturan (settings) pada setiap widget, beri judul, lalu pilih datastream
yang sesuai pada kolom datastream.
5.
Menyimpan template, Klik Save di pojok kanan atas.
Perubahan yang belum disimpan akan hilang saat halaman ditutup.
6.
Menambahkan perangkat. Buka menu Devices, klik +
New Device, pilih From template, pilih template “Health
Monitoring”, isi Device Name, lalu klik Create.
7.
Menyalin kredensial. Pada halaman Device Info,
salin bagian Firmware Configuration yang berisi BLYNK_TEMPLATE_ID,
BLYNK_TEMPLATE_NAME, dan BLYNK_AUTH_TOKEN, lalu tempelkan ke bagian atas kode
program. Isi juga nama dan kata sandi Wi-Fi 2,4 GHz.
8. Menjalankan sistem. Unggah kode ke ESP32 melalui Arduino IDE, Setelah terhubung, status perangkat pada Blynk Console berubah menjadi Online, dan nilai BPM, SpO2, serta suhu muncul pada dashboard ketika jari ditempelkan ke sensor.
Tabel 3. Konfigurasi datastream pada Blynk
|
Nama |
Pin |
Tipe Data |
Satuan |
Min |
Maks |
Keterangan |
|
Heart Rate |
V0 |
Integer |
bpm |
0 |
220 |
Detak Jantung |
|
SpO2 |
V1 |
Integer |
% |
0 |
100 |
Saturasi oksigen |
|
Body Temp |
V2 |
Double |
°C |
0 |
50 |
Suhu (1 desimal) |
Widget yang digunakan
pada web dashboard ditunjukkan pada Tabel 4, dan tampilan dashboard ditunjukkan
pada Gambar 3.
Tabel 4. Widget pada dashboard Blynk
|
Widget |
Virtual Pin |
Fungsi |
|
Value Display / Gauge
“Heart Rate” |
V0 |
Menampilkan nilai detak
jantung (BPM). |
|
Value Display / Gauge
“SpO2” |
V1 |
Menampilkan persentase
saturasi oksigen darah (%). |
|
Value Display “Body Temp” |
V2 |
Menampilkan suhu tubuh
dalam derajat Celsius (°C). |

Gambar 3. Tampilan
dashboard Blynk
3.3 Kode
Program
Berikut adalah kode program utama yang digunakan:
|
#define
BLYNK_TEMPLATE_ID "TMPL6by6ezymw" #define
BLYNK_TEMPLATE_NAME "Health Monitoring" #define
BLYNK_AUTH_TOKEN "ISI_AUTH_TOKEN_ANDA" #include
<WiFi.h> #include
<BlynkSimpleEsp32.h> #include
<Wire.h> #include
"MAX30105.h" #include
"heartRate.h" #include
<OneWire.h> #include
<DallasTemperature.h> char
ssid[] = "NAMA_WIFI"; char
pass[] = "PASSWORD_WIFI"; MAX30105
particleSensor; #define
ONE_WIRE_BUS 4 OneWire
oneWire(ONE_WIRE_BUS); DallasTemperature
bodyTempSensor(&oneWire); BlynkTimer
timer; //
Variabel BPM const
byte RATE_SIZE = 4; byte
rates[RATE_SIZE]; byte
rateSpot = 0; byte
validBeats = 0; long
lastBeat = 0; float
beatsPerMinute = 0; int
averageBPM = 0; //
Variabel SpO2 & Suhu float
spO2 = 0; unsigned
long lastSpO2Calc = 0; float
bodyTemp = 0; unsigned
long lastTempRead = 0; bool
tempRequestSent = false; void
readBodyTemp() { if (!tempRequestSent) { bodyTempSensor.requestTemperatures(); tempRequestSent = true; lastTempRead = millis(); return; } if (tempRequestSent && (millis() -
lastTempRead > 750)) { float tempC =
bodyTempSensor.getTempCByIndex(0); if (tempC != DEVICE_DISCONNECTED_C
&& tempC > 0 && tempC < 50) { bodyTemp = tempC; Blynk.virtualWrite(V2, bodyTemp); } tempRequestSent = false; } } void
sendVitalSigns() { if (averageBPM > 0) { Blynk.virtualWrite(V0, averageBPM); Blynk.virtualWrite(V1, (int)spO2); } } void
setup() { Serial.begin(115200); Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass); bodyTempSensor.begin(); if (!particleSensor.begin(Wire,
I2C_SPEED_FAST)) { while (1); } particleSensor.setup(0x1F, 4, 2, 100, 411,
4096); particleSensor.setPulseAmplitudeRed(0x1F); particleSensor.setPulseAmplitudeIR(0x1F); particleSensor.setPulseAmplitudeGreen(0); timer.setInterval(3000L, readBodyTemp); timer.setInterval(1000L, sendVitalSigns); } void
loop() { Blynk.run(); timer.run(); long irValue = particleSensor.getIR(); if (irValue < 50000) { averageBPM = 0; validBeats = 0; rateSpot
= 0; spO2 = 0; } else { if (checkForBeat(irValue)) { long delta = millis() - lastBeat; lastBeat = millis(); beatsPerMinute = 60.0 / (delta /
1000.0); if (beatsPerMinute > 40 &&
beatsPerMinute < 200) { rates[rateSpot++] =
(byte)beatsPerMinute; rateSpot %= RATE_SIZE; if (validBeats < RATE_SIZE)
validBeats++; } } if (validBeats >= RATE_SIZE) { int sum = 0; for (byte i = 0; i < RATE_SIZE; i++)
sum += rates[i]; averageBPM = sum / RATE_SIZE; } if (millis() - lastSpO2Calc > 2000) { lastSpO2Calc = millis(); long redValue =
particleSensor.getRed(); if (irValue > 0 && redValue
> 0) { float ratio = (float)irValue /
(float)redValue; spO2 = 105.0 - (ratio * 5.0); if (spO2 > 100) spO2 = 100; if (spO2 < 70) spO2 = 0; } } } } |
Penjelasan
Alur Kerja Program:
1.
Inisialisasi. ESP32 terhubung ke Wi-Fi dan
Blynk. Sensor MAX30102 dikonfigurasi dengan daya LED 0x1F dan resolusi ADC 18
bit agar sinyal AC (denyut) terbaca jelas.
2.
Pemrosesan BPM. Fungsi checkForBeat() mendeteksi
puncak gelombang dari nilai inframerah. Selisih waktu antarpuncak dihitung
untuk memperoleh BPM, lalu dirata-ratakan menggunakan circular buffer
(RATE_SIZE = 4) agar keluaran lebih stabil.
3.
Pemrosesan SpO2. Setiap 2 detik, sistem
menghitung rasio nilai IR terhadap nilai merah untuk memperkirakan persentase
SpO2 menggunakan rumus empiris sederhana.
4.
Pemrosesan suhu. DS18B20 dipicu untuk mengukur
suhu, dan ESP32 mengambil hasilnya.
5.
Transmisi data. BlynkTimer mengirimkan data BPM
dan SpO2 setiap 1 detik serta data suhu setiap 3 detik ke Virtual Pin
yang sesuai.
3.4 Hasil
Pengujian
Pengujian dilakukan dengan menempelkan jari pada sensor dan
membandingkan hasilnya dengan kondisi fisiologis yang diharapkan. Hasil
pengujian disajikan pada Tabel 5.
Tabel 5. Hasil
pengujian sistem
|
Skenario
Pengujian |
Keluaran
(Serial Monitor / Blynk) |
Analisis |
|
Sensor kosong (tidak ada
jari) |
HR: 0 bpm | SpO2: 0% |
Temp: 36,5 °C |
Sistem mendeteksi tidak
adanya jari (irValue < 50000) dan mereset memori agar data tidak tertahan
pada nilai lama. |
|
Jari ditempelkan (kondisi
istirahat) |
HR: ±72–78 bpm | SpO2:
±96–99% | Temp: 36,5 °C |
Algoritma mendeteksi puncak
gelombang. Nilai BPM stabil berkat rata-rata bergerak (moving average), dan
SpO2 berada pada rentang normal. |
|
Napas dalam (inspirasi dan
ekspirasi lambat) |
HR: menurun bertahap
(misalnya 75 ke 68 bpm) |
Perubahan BPM mengikuti
pola yang diharapkan pada napas dalam (respiratory sinus arrhythmia),
menandakan pembacaan responsif terhadap perubahan fisiologis. |
3.5 Analisis
dan Keterbatasan
Hasil pengujian menunjukkan bahwa sistem mampu membaca dan mengirim
ketiga parameter ke Blynk secara berkelanjutan. Penggunaan ambang irValue <
50000 efektif membedakan kondisi ada atau tidaknya jari, sedangkan circular
buffer empat sampel meredam fluktuasi sesaat pada BPM.
Meskipun
demikian, terdapat beberapa keterbatasan yang perlu diperhatikan. Pertama,
nilai SpO2 dihitung dari rasio IR terhadap merah dengan persamaan empiris
sederhana yang belum dikalibrasi. Metode standar oksimetri memakai rasio
komponen AC dan DC dari kedua panjang gelombang, sehingga nilai SpO2 pada
laporan ini hanya berfungsi sebagai indikator awal dan belum dapat dianggap
akurat. Kedua, pengujian belum dibandingkan dengan alat ukur komersial sebagai
pembanding. Ketiga, sensor DS18B20 mengukur suhu permukaan yang bersinggungan
dengannya, yang dapat berbeda dari suhu inti tubuh. Oleh karena itu, sistem ini
merupakan purwarupa pembelajaran dan bukan alat medis.
BAB
IV
PENUTUP
4.1 Kesimpulan
Berdasarkan
perancangan dan pengujian yang telah dilakukan, dapat disimpulkan bahwa:
1.
ESP32 berhasil berkomunikasi dengan sensor MAX30102
melalui I2C dan dengan DS18B20 melalui 1-Wire.
2.
Penerapan algoritma peak detection dengan circular
buffer berhasil menstabilkan pembacaan BPM, sementara pendekatan non-blocking
pada DS18B20 mencegah konflik timing yang sebelumnya menyebabkan
kegagalan pembacaan.
3.
Sistem berhasil mengirimkan data detak jantung (V0),
saturasi oksigen (V1), dan suhu (V2) ke platform Blynk IoT secara real-time,
dengan catatan nilai SpO2 masih berupa perkiraan yang belum dikalibrasi.
4.2 Saran
Sistem ini
memiliki potensi pengembangan lebih lanjut, antara lain:
1.
Menambahkan kalibrasi algoritma SpO2 menggunakan rasio
AC/DC dan alat medis standar (pulse oximeter komersial) sebagai
pembanding untuk meningkatkan akurasi.
2.
Menambahkan modul penyimpanan data (SD Card)
atau fitur data logging di Blynk untuk merekam riwayat kesehatan
pengguna dalam jangka panjang.
3.
Membuat enclosure (casing) hasil cetak 3D yang
ergonomis untuk menstabilkan posisi jari dan menghalangi cahaya sekitar,
sehingga mengurangi motion artifact.
4.
Menjaga kerahasiaan auth token dan kredensial
Wi-Fi, misalnya dengan memisahkannya ke berkas konfigurasi yang tidak
dibagikan.
DAFTAR PUSTAKA
Blynk Inc. (n.d.). Blynk IoT platform documentation. https://docs.blynk.io
SparkFun Electronics. (n.d.). MAX30102 pulse oximeter and
heart rate sensor hookup guide. https://learn.sparkfun.com
Aslam Hossain. (n.d.). IoT based patient health monitor system using Blynk and ESP32 | MAX30100 [Video]. YouTube. https://youtu.be/cKIs-TssoTE
Santos, R., & Santos, S. (n.d.). ESP32 with DS18B20 temperature sensor (Arduino IDE). Random Nerd Tutorials. https://randomnerdtutorials.com/esp32-ds18b20-temperature-arduino-ide/
Santos, R., & Santos, S. (n.d.). ESP32 with MAX30102 pulse oximeter and heart rate sensor. Random Nerd Tutorials. https://randomnerdtutorials.com/esp32-max30102-oximeter-heart-rate-sensor/
LAMPIRAN

Tidak ada komentar:
Posting Komentar