// Nim : 21552011304
// Nama : Alfridus Elman
// Sertakan Library
#include <SPI.h> // Library untuk komunikasi SPI
#include <Wire.h> // Library untuk komunikasi I2C
#include <Adafruit_GFX.h> // Library untuk grafik dasar
#include <Adafruit_SSD1306.h> // Library untuk display OLED SSD1306
#include <OneWire.h> // Library untuk komunikasi OneWire
#include <DallasTemperature.h> // Library untuk sensor suhu Dallas
// Ukuran layar OLED dalam piksel
#define SCREEN_WIDTH 128 // Lebar layar OLED, dalam piksel
#define SCREEN_HEIGHT 64 // Tinggi layar OLED, dalam piksel
#define SENSOR_PIN A4 // Pin sensor DS18B20
#define BUZZER_PIN 11 // Pin buzzer
// Deklarasi untuk display SSD1306 yang terhubung ke I2C (pin SDA, SCL)
#define OLED_RESET -1 // Reset pin # (atau -1 jika berbagi pin reset Arduino)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
OneWire oneWire(SENSOR_PIN); // Setup komunikasi OneWire
DallasTemperature tempSensor(&oneWire); // Pass OneWire ke library sensor suhu Dallas
// Deklarasi Variabel
unsigned long previousMillisGetHR = 0; // Simpan waktu terakhir pembacaan detak jantung
unsigned long previousMillisResultHR = 0; // Simpan waktu terakhir pembacaan hasil BPM
unsigned long previousMillis = 0; // Simpan waktu sebelumnya
String tempString, tempString1; // String untuk menyimpan suhu
float batas = 35; // Batas suhu untuk mengaktifkan alarm
float tempCelsius; // Variabel untuk menyimpan suhu dalam Celsius
const long intervalGetHR = 20; // Interval pembacaan detak jantung (20 ms)
const long intervalResultHR = 10000; // Interval pembacaan hasil BPM (10 detik)
int PulseSensorSignal; // Variabel untuk menyimpan nilai sinyal dari sensor detak jantung
const int PulseSensorHRWire = 0; // PulseSensor terhubung ke pin analog A0
const int LED_A1 = A1; // LED untuk mendeteksi detak jantung terhubung ke pin A1 pada Arduino UNO
int UpperThreshold = 550; // Ambang atas untuk mendeteksi detak jantung
int LowerThreshold = 500; // Ambang bawah untuk mendeteksi detak jantung
int cntHB = 0; // Variabel untuk menghitung jumlah detak jantung
boolean ThresholdStat = true; // Variabel pemicu dalam menghitung detak jantung
int BPMval = 0; // Variabel untuk menyimpan hasil perhitungan detak jantung
int x = 0; // Variabel untuk nilai grafik sumbu x pada OLED
int y = 0; // Variabel untuk nilai grafik sumbu y pada OLED
int lastx = 0; // Variabel untuk nilai sumbu x terakhir pada grafik OLED
int lasty = 0; // Variabel untuk nilai sumbu y terakhir pada grafik OLED
// Ikon Hati, 16x16 piksel
const unsigned char Heart_Icon[] PROGMEM = {
0x00, 0x00, 0x18, 0x30, 0x3c, 0x78, 0x7e, 0xfc, 0xff, 0xfe, 0xff, 0xfe, 0xee, 0xee, 0xd5, 0x56,
0x7b, 0xbc, 0x3f, 0xf8, 0x1f, 0xf0, 0x0f, 0xe0, 0x07, 0xc0, 0x03, 0x80, 0x01, 0x00, 0x00, 0x00
};
// Fungsi setup
void setup() {
pinMode(LED_A1, OUTPUT); // Tetapkan pin LED_A1 sebagai keluaran
Serial.begin(9600); // Mengatur komunikasi serial dengan kecepatan 9600 bps
// Inisialisasi display OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;); // Berhenti jika gagal
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setCursor(22, 20);
display.setTextSize(1);
display.println("Alfridus Elman");
display.setTextColor(BLACK, WHITE); // Teks 'terbalik'
display.setCursor(40, 37);
display.println("Hidup Sehat");
display.display();
delay(5000);
// Menampilkan "Loading..."
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 22);
display.print(" Loading...");
display.display();
delay(3000);
// Menampilkan tampilan awal nilai BPM
display.clearDisplay();
display.drawBitmap(0, 47, Heart_Icon, 16, 16, WHITE); // Gambar ikon hati
display.drawLine(0, 43, 127, 43, WHITE); // Garis horizontal
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(20, 48);
display.print(": 0 BPM");
display.display();
Serial.println();
Serial.println("Silakan tunggu 3 detik untuk mendapatkan nilai BPM");
pinMode(BUZZER_PIN, OUTPUT); // Tetapkan pin buzzer sebagai keluaran
digitalWrite(BUZZER_PIN, LOW);
delay(2000); // Tunggu inisialisasi
display.clearDisplay(); // Bersihkan display
display.setTextSize(1); // Ukuran teks
display.setTextColor(WHITE); // Warna teks
displayDisplayCenter("Suhu & Detak Jantung", 4);
displayDisplayCenter("22091387005", 56);
display.setTextSize(2);
display.setCursor(0, 32); // Posisi untuk menampilkan teks
tempSensor.begin(); // Inisialisasi sensor suhu
tempString.reserve(10);
}
// Fungsi loop utama
void loop() {
tempSensor.requestTemperatures(); // Kirim perintah untuk mendapatkan suhu
tempCelsius = tempSensor.getTempCByIndex(0); // Baca suhu dalam Celsius
tempString = String(tempCelsius, 2); // Simpan suhu dengan dua desimal
tempString += (char)247; // Tambahkan simbol derajat
tempString += "C";
// Jika suhu berubah, bersihkan tampilan sebelumnya
if (tempString != tempString1) {
display.setTextColor(BLACK);
displayDisplayCenter(tempString1, 28);
}
tempString1 = tempString;
Serial.println(tempString); // Cetak suhu dalam Celsius ke Serial Monitor
// Tulis suhu baru dengan warna putih
display.setTextColor(WHITE);
displayDisplayCenter(tempString, 28);
// Cek apakah suhu melebihi batas dan aktifkan buzzer jika ya
if (tempCelsius >= 37.2) {
tone(BUZZER_PIN, 1000); // Aktifkan buzzer dengan frekuensi 1kHz
delay(1000); // Suara aktif selama 1 detik
noTone(BUZZER_PIN); // Matikan suara
} else {
noTone(BUZZER_PIN); // Matikan suara
}
GetHeartRate(); // Panggil subrutin GetHeartRate()
}
// Fungsi untuk mendapatkan detak jantung
void GetHeartRate() {
unsigned long currentMillisGetHR = millis();
if (currentMillisGetHR - previousMillisGetHR >= intervalGetHR) {
previousMillisGetHR = currentMillisGetHR;
PulseSensorSignal = analogRead(PulseSensorHRWire);
if (PulseSensorSignal > UpperThreshold && ThresholdStat == true) {
cntHB++;
ThresholdStat = false;
digitalWrite(LED_A1, HIGH);
}
if (PulseSensorSignal < LowerThreshold) {
ThresholdStat = true;
digitalWrite(LED_A1, LOW);
}
}
// Proses untuk mendapatkan nilai BPM
unsigned long currentMillisResultHR = millis();
if (currentMillisResultHR - previousMillisResultHR >= intervalResultHR) {
previousMillisResultHR = currentMillisResultHR;
BPMval = cntHB * 6; // Kalikan total detak jantung dalam 10 detik untuk mendapatkan nilai BPM
Serial.print("BPM : ");
Serial.println(BPMval);
display.fillRect(20, 48, 108, 18, BLACK);
display.drawBitmap(0, 47, Heart_Icon, 16, 16, WHITE);
display.drawLine(0, 43, 127, 43, WHITE);
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(20, 48);
display.print(": ");
display.print(BPMval);
display.print(" BPM");
display.display();
cntHB = 0; // Reset penghitung detak jantung
}
}
// Fungsi untuk menampilkan teks di tengah layar OLED
void displayDisplayCenter(String text, int posisi) {
int16_t x1;
int16_t y1;
uint16_t width;
uint16_t height;
display.getTextBounds(text, 0, 0, &x1, &y1, &width, &height);
display.setCursor((SCREEN_WIDTH - width) / 2, posisi);
display.println(text); // Tampilkan teks
display.display();
}