#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_Address 0x3C // 0x3C device address of I2C OLED
Adafruit_SSD1306 oled(128, 64); // create our screen object setting resolution to 128x64
int a = 0;
int lasta = 0;
int lastb = 0;
int LastTime = 0;
int ThisTime;
bool BPMTiming = false;
bool BeatComplete = false;
int randomNumber = 0; // Menyimpan hasil angka acak
#define UpperThreshold 560
#define LowerThreshold 530
void setup() {
oled.begin(SSD1306_SWITCHCAPVCC, OLED_Address);
oled.clearDisplay();
oled.setTextSize(1);
randomSeed(analogRead(0)); // Mengambil random seed dari input analog
}
void loop() {
// Efek jarum jam untuk loading angka 1-5
int centerX = oled.width() / 2;
int centerY = oled.height() / 2;
int radius = 20; // Radius lingkaran
int segments = 36; // Jumlah segmen untuk membuat lingkaran padat
// Tampilkan teks "Acak Kelompok" di atas efek spin
oled.clearDisplay();
oled.setCursor(10, 0);
oled.print("Acak Kelompok");
oled.display();
delay(1000); // Tampilkan teks selama 1 detik
// Animasi jarum jam
for (int i = 0; i < segments; i++) {
oled.clearDisplay();
oled.setCursor(0, 0);
oled.print("Loading:");
// Menggambar segmen garis untuk membuat lingkaran padat
for (int j = 0; j < i; j++) {
int angle = map(j, 0, segments, 0, 360); // Menghitung sudut
int endX = centerX + radius * cos(radians(angle));
int endY = centerY + radius * sin(radians(angle));
oled.drawLine(centerX, centerY, endX, endY, WHITE); // Menggambar garis dari pusat ke pinggir
}
oled.display();
delay(50); // Kecepatan animasi
}
// Menghasilkan angka acak antara 1 dan 5
randomNumber = random(1, 6);
// OLED: Tampilkan hasil acak
oled.clearDisplay();
oled.setCursor(0, 0);
oled.print("Detak Jantung");
oled.setCursor(0, 30); // Pindah ke posisi baru untuk "Kelompok :"
oled.print("Kelompok :");
oled.setCursor(30, 50); // Posisi untuk menampilkan hasil acak
oled.print(randomNumber);
oled.display();
delay(2000); // Tampilkan hasil acak selama 2 detik
// Tampilkan grafik ECG secara terus menerus
showECG();
}
void showECG() {
a = 0;
lasta = 0;
lastb = 0;
LastTime = 0;
while (true) { // Looping tanpa henti
if (a > 127) {
oled.clearDisplay();
a = 0;
lasta = a;
}
ThisTime = millis();
int value = analogRead(0);
oled.setTextColor(WHITE);
int b = 60 - (value / 16);
oled.drawLine(lasta, lastb, a, b, WHITE);
lastb = b;
lasta = a;
if (value > UpperThreshold) {
if (BeatComplete) {
// Tidak lagi menghitung BPM, tapi menggunakan randomNumber
BeatComplete = false;
tone(8, 1000, 250); // Bunyi beep
}
if (!BPMTiming) {
LastTime = millis();
BPMTiming = true;
}
}
if ((value < LowerThreshold) && (BPMTiming)) {
BeatComplete = true;
}
oled.fillRect(0, 50, 128, 16, BLACK); // Menghapus area untuk tampilan hasil acak
oled.setCursor(0, 50);
oled.print("Jantung Kelompok:"); // Menampilkan "Kelompok :"
oled.print(randomNumber); // Menampilkan hasil acak sebagai nilai
oled.display();
a++;
delay(50); // Kecepatan detak jantung
}
}