// Program Counter Rakaat Shalat Berbasis Arduino UNO
#include <TM1637Display.h>
// Definisi Pin
#define TRIG_PIN A0
#define ECHO_PIN A1
#define CLK 4
#define DIO 5
#define RESET_BUTTON_PIN 3
#define BUZZER_PIN 6
// Inisialisasi library display dengan pin CLK dan DIO
TM1637Display display(CLK, DIO);
// Variabel Global
int sujud = 0;
int rakaat = 0;
bool isSujud = false; // Penanda status sedang sujud atau tidak
bool systemActive = false; // Penanda sistem aktif atau tidak
bool lastResetButtonState = HIGH; // Menyimpan status tombol reset sebelumnya
// Variabel untuk blinking display
unsigned long lastBlinkTime = 0;
bool blinkState = true;
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RESET_BUTTON_PIN, INPUT_PULLUP); // Menggunakan pull-up internal
pinMode(BUZZER_PIN, OUTPUT);
display.setBrightness(7); // Atur kecerahan display (0-7)
display.showNumberDecEx(0, 0b01000000, true, 4, 0); // Tampilan awal 00:00
}
void loop() {
int resetState = digitalRead(RESET_BUTTON_PIN);
// Cek jika tombol reset ditekan (transisi dari HIGH ke LOW)
// KESALAHAN SEBELUMNYA: 'lastResetButtonState = HIGH' (assignment)
// PERBAIKAN: 'lastResetButtonState == HIGH' (perbandingan)
if (resetState == LOW && lastResetButtonState == HIGH) {
// Aktifkan sistem jika belum aktif
if (!systemActive) {
systemActive = true;
}
// Reset hitungan rakaat dan sujud
rakaat = 0;
sujud = 0;
// Bunyikan buzzer sebagai tanda reset
digitalWrite(BUZZER_PIN, HIGH);
delay(200);
digitalWrite(BUZZER_PIN, LOW);
delay(50); // Delay untuk debounce tombol
}
lastResetButtonState = resetState; // Simpan status tombol saat ini
if (systemActive) {
// --- Logika Sensor Ultrasonik ---
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
long distance = duration * 0.034 / 2; // Hitung jarak dalam cm
// --- Logika Deteksi Sujud ---
// Deteksi sujud jika jarak < 10 cm dan belum dalam status sujud
if (distance < 10 && !isSujud) {
sujud++;
isSujud = true; // Set status sedang sujud
// Tambah hitungan rakaat setiap 2 kali sujud
if (sujud % 2 == 0) {
rakaat++;
}
delay(1000); // Jeda untuk menghindari double counting saat sujud
}
// Reset status sujud jika jarak > 15 cm
if (distance > 15) {
isSujud = false;
}
// --- Logika Tampilan Display ---
unsigned long now = millis();
// Buat titik dua berkedip setiap 500ms
if (now - lastBlinkTime > 500) {
lastBlinkTime = now;
blinkState = !blinkState; // Balik status kedip
}
// Gabungkan nilai rakaat dan sujud untuk ditampilkan
// Contoh: rakaat ke-2, sujud ke-1 -> 0201
int displayValue = (rakaat * 100) + sujud;
// Tampilkan angka dengan titik dua yang berkedip
display.showNumberDecEx(displayValue, (blinkState ? 0b01000000 : 0), true, 4, 0);
} else {
// Jika sistem belum aktif, tampilkan 00:00
display.showNumberDecEx(0, 0b01000000, true, 4, 0);
}
delay(20); // Delay kecil di akhir loop agar stabil
}