#include <TM1637Display.h> // Library untuk TM1637 7-Segment Display
// ----- DEFINISI PIN -----
const int heartRatePin = PA0; // Potensiometer untuk simulasi detak jantung
const int ledGreenPin = PB0; // LED Hijau untuk status 'Sangat Relaks' / 'Normal'
const int ledYellowPin = PB1; // LED Kuning untuk status 'Sedikit Stres'
const int ledRedPin = PC13; // LED Merah untuk status 'Stres Tinggi!'
const int buzzerPin = PA1; // Buzzer untuk feedback audio
// Pin CLK dan DIO untuk TM1637 7-Segment Display
#define CLK_TM1637 PB3
#define DIO_TM1637 PB4
// ----- OBJEK & VARIABEL GLOBAL -----
// Inisialisasi objek TM1637 display
TM1637Display display(CLK_TM1637, DIO_TM1637);
int rawValue = 0; // Nilai mentah dari potensiometer
int heartRate = 0; // Detak jantung dalam BPM (hasil konversi)
unsigned long lastUpdateMillis = 0; // Waktu terakhir update LED/Buzzer/Serial
const int updateInterval = 200; // Interval update LED/Buzzer/Serial (ms)
unsigned long lastDisplayUpdateMillis = 0; // Waktu terakhir update TM1637 display
const int displayUpdateInterval = 500; // Interval update TM1637 display (ms, lebih lambat dari yang lain)
// ----- FUNGSI SETUP -----
void setup() {
Serial.begin(115200); // Inisialisasi komunikasi Serial Monitor
delay(100); // Beri sedikit waktu untuk Serial Monitor inisialisasi
Serial.println("Projektor Stres & Relaksasi Siap!");
Serial.println("-----------------------------------");
Serial.flush(); // Pastikan buffer Serial dikosongkan
// Konfigurasi pin LED sebagai OUTPUT
pinMode(ledGreenPin, OUTPUT);
pinMode(ledYellowPin, OUTPUT);
pinMode(ledRedPin, OUTPUT);
// Konfigurasi pin Buzzer sebagai OUTPUT
pinMode(buzzerPin, OUTPUT);
// Matikan semua LED di awal
digitalWrite(ledGreenPin, LOW);
digitalWrite(ledYellowPin, LOW);
digitalWrite(ledRedPin, LOW);
noTone(buzzerPin); // Pastikan buzzer mati
// Inisialisasi TM1637 display
display.setBrightness(0x0a); // Atur kecerahan display (nilai 0x00 hingga 0x0f)
display.clear(); // Bersihkan display, tampilkan '----'
}
// ----- FUNGSI LOOP -----
void loop() {
// Baca nilai dari potensiometer (input ADC 0-1023)
rawValue = analogRead(heartRatePin);
// Konversi nilai potensiometer (0-1023) ke rentang detak jantung yang masuk akal (40-180 BPM)
heartRate = map(rawValue, 0, 1023, 40, 180);
// --- Update visual (LED), audio (Buzzer), dan tampilan Serial Monitor ---
if (millis() - lastUpdateMillis >= updateInterval) {
lastUpdateMillis = millis(); // Perbarui waktu update terakhir
// Reset semua LED
digitalWrite(ledGreenPin, LOW);
digitalWrite(ledYellowPin, LOW);
digitalWrite(ledRedPin, LOW);
// Logika Indikator Stres/Relaksasi (LED & Buzzer)
String status = ""; // Variabel untuk menyimpan teks status
if (heartRate < 60) {
status = "Sangat Relaks";
digitalWrite(ledGreenPin, HIGH); // Hijau menyala
tone(buzzerPin, 500); // Nada rendah (relaksasi)
} else if (heartRate >= 60 && heartRate < 90) {
status = "Normal";
digitalWrite(ledGreenPin, HIGH); // Hijau tetap menyala
noTone(buzzerPin); // Tidak ada nada khusus
} else if (heartRate >= 90 && heartRate < 120) {
status = "Sedikit Stres";
digitalWrite(ledYellowPin, HIGH); // Kuning menyala
tone(buzzerPin, 1000); // Nada sedang
} else { // heartRate >= 120 (Stres Tinggi!)
status = "Stres Tinggi!";
digitalWrite(ledRedPin, HIGH); // Merah menyala
tone(buzzerPin, 2000); // Nada tinggi (stres)
}
// Tampilkan Output di Serial Monitor
Serial.print("Raw Value: ");
Serial.print(rawValue);
Serial.print("\tBPM: ");
Serial.println(heartRate);
Serial.print("Status: ");
Serial.println(status);
Serial.println("---"); // Pemisah antar update
}
// --- Update TM1637 7-Segment Display (dengan interval terpisah) ---
if (millis() - lastDisplayUpdateMillis >= displayUpdateInterval) {
lastDisplayUpdateMillis = millis();
display.showNumberDec(heartRate, false); // Tampilkan nilai heartRate tanpa leading zero
}
}Loading
stm32-bluepill
stm32-bluepill