#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// Definisi pin dan konstanta
#define PULSE_PER_BEAT 1 // Jumlah detak per denyut jantung
#define INTERRUPT_PIN 2
#define BUZZER_PIN 3
#define LED_PIN 4
#define DHT_PIN 5
#define SAMPLING_INTERVAL 1000 // Interval pengambilan sampel dalam milidetik
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define DHTTYPE DHT22
volatile uint16_t pulse; // Variabel untuk menyimpan jumlah detak
uint16_t count; // Variabel untuk menghitung detak jantung
float heartRate;
float temperature;
float humidity;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // Inisialisasi OLED display
LiquidCrystal_I2C lcd20x4(0x27, 20, 4);
DHT dht(DHT_PIN, DHTTYPE);
void HeartRateInterrupt() {
pulse++; // Menambah jumlah detak setiap kali interrupt terjadi
}
void setup() {
Serial.begin(115200); // Memulai komunikasi serial
pinMode(INTERRUPT_PIN, INPUT); // Mengatur pin interrupt sebagai input
pinMode(BUZZER_PIN, OUTPUT); // Mengatur pin buzzer sebagai output
pinMode(LED_PIN, OUTPUT); // Mengatur pin LED sebagai output
attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), HeartRateInterrupt, RISING); // Mengatur interrupt
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Memulai OLED display
Serial.println(F("SSD1306 allocation failed"));
for (;;); // Jika gagal, berhenti
}
display.display();
delay(2000);
display.clearDisplay();
lcd20x4.init(); // Memulai LCD
lcd20x4.backlight(); // Mengaktifkan backlight LCD
lcd20x4.clear(); // Membersihkan layar LCD
dht.begin(); // Memulai sensor DHT22
}
void loop() {
HeartRate(); // Memanggil fungsi HeartRate untuk menghitung detak jantung
}
void HeartRate() {
static unsigned long startTime; // Variabel untuk menyimpan waktu mulai
if (millis() - startTime < SAMPLING_INTERVAL) return; // Mengecek interval sampling
startTime = millis(); // Memperbarui waktu mulai
noInterrupts(); // Mematikan interrupt
count = pulse; // Menyimpan jumlah detak ke dalam count
pulse = 0; // Mengatur ulang detak
interrupts(); // Menghidupkan kembali interrupt
heartRate = map(count, 0, 220, 0, 220); // Mengkonversi jumlah detak ke detak jantung
// Membaca suhu dan kelembaban dari sensor DHT22
temperature = dht.readTemperature();
humidity = dht.readHumidity();
// Mengecek apakah pembacaan sensor gagal
if (isnan(temperature) || isnan(humidity)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
// Memperbarui tampilan OLED dengan BPM
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print(String(heartRate, 2));
display.print(" BPM");
display.setCursor(0, 30);
if (heartRate < 50) {
display.print("Sangat Lemah");
} else if (heartRate >= 50 && heartRate < 60) {
display.print("Lemah");
} else if (heartRate >= 60 && heartRate <= 100) {
display.print("Normal");
} else {
display.print("Cepat");
}
display.display();
// Memperbarui tampilan LCD 20x4 dengan kondisi suhu dan saran kesehatan
lcd20x4.clear();
if (temperature < 35.0) {
lcd20x4.setCursor(0, 0);
lcd20x4.print("Suhu Rendah!");
lcd20x4.setCursor(0, 1);
lcd20x4.print("Segera Konsultasi");
lcd20x4.setCursor(0, 2);
lcd20x4.print("ke Dokter!");
} else if (temperature >= 35.0 && temperature <= 37.8) {
lcd20x4.setCursor(0, 0);
lcd20x4.print("Suhu Normal");
lcd20x4.setCursor(0, 1);
lcd20x4.print("Wish You A Good");
lcd20x4.setCursor(0, 2);
lcd20x4.print("Health");
} else {
lcd20x4.setCursor(0, 0);
lcd20x4.print("Suhu Tinggi!");
lcd20x4.setCursor(0, 1);
lcd20x4.print("Segera Konsultasi");
lcd20x4.setCursor(0, 2);
lcd20x4.print("ke Dokter!");
}
// Mengontrol Buzzer dan LED berdasarkan kondisi detak jantung dan suhu
if (heartRate < 50 || temperature > 37.8) { // BPM sangat lemah atau suhu tinggi
tone(BUZZER_PIN, 1000); // Buzzer berbunyi terus-menerus
digitalWrite(LED_PIN, HIGH); // LED menyala terus-menerus
} else if (temperature < 35.0) { // Suhu rendah
tone(BUZZER_PIN, 1000, 1000); // Buzzer berbunyi selama 1000ms
delay(1000); // Jeda selama 1000ms
noTone(BUZZER_PIN);
digitalWrite(LED_PIN, HIGH); // LED menyala
delay(1000);
digitalWrite(LED_PIN, LOW); // LED mati
} else if (temperature >= 35.0 && temperature <= 37.8 && heartRate >= 60 && heartRate <= 100) { // Suhu normal dan BPM normal
tone(BUZZER_PIN, 1000, 200); // Buzzer berbunyi selama 200ms
delay(300); // Jeda selama 300ms
noTone(BUZZER_PIN);
digitalWrite(LED_PIN, HIGH); // LED menyala
delay(300);
digitalWrite(LED_PIN, LOW); // LED mati
} else { // Suhu normal tapi BPM lemah atau cepat
tone(BUZZER_PIN, 1000, 200); // Buzzer berbunyi selama 500ms
delay(170); // Jeda selama 500ms
noTone(BUZZER_PIN);
digitalWrite(LED_PIN, HIGH); // LED menyala
delay(170);
digitalWrite(LED_PIN, LOW); // LED mati
}
// Output ke Serial Monitor
Serial.println("Heart Rate: " + String(heartRate, 2) + " BPM");
Serial.println("Temperature: " + String(temperature, 2) + " °C");
Serial.println("Humidity: " + String(humidity, 2) + " %");
}