#include <U8glib.h>
// U8glib SSD1306 128x64 initialization
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0 | U8G_I2C_OPT_NO_ACK | U8G_I2C_OPT_FAST); // Fast I2C / TWI
// Buton pinleri
#define START_STOP_BUTTON 2
#define RESET_BUTTON 3
#define LAP_SPLIT_BUTTON 4
#define RECALL_BUTTON 5
// Zaman değişkenleri
unsigned long startTime = 0;
unsigned long lapStartTime = 0;
unsigned long elapsedTime = 0;
unsigned long splitTime = 0;
unsigned long lapTime = 0;
// Durum değişkenleri
bool isRunning = false;
int lapCounter = 0;
// Hafıza
const int MAX_RECORDS = 100;
unsigned long splitTimes[MAX_RECORDS];
unsigned long lapTimes[MAX_RECORDS];
// Geri Çağırma Modu
bool isRecalling = false;
int recallIndex = 0;
void setup() {
// Butonları giriş olarak ayarla
pinMode(START_STOP_BUTTON, INPUT_PULLUP);
pinMode(RESET_BUTTON, INPUT_PULLUP);
pinMode(LAP_SPLIT_BUTTON, INPUT_PULLUP);
pinMode(RECALL_BUTTON, INPUT_PULLUP);
// Seri iletişim (isteğe bağlı)
Serial.begin(9600);
}
void loop() {
// Buton kontrolleri
handleButtons();
// Kronometre çalışıyorsa süreleri hesapla
if (isRunning) {
elapsedTime = millis() - startTime;
lapTime = millis() - lapStartTime;
}
// Ekranı güncelle
displayTime();
}
void handleButtons() {
// Başlat/Durdur Butonu
if (digitalRead(START_STOP_BUTTON) == LOW) {
delay(200); // Debounce
if (isRunning) {
isRunning = false;
} else {
if (elapsedTime == 0) { // İlk başlatma
startTime = millis();
lapStartTime = millis();
} else {
// Kronometreyi durdurmadan tekrar başlatırsak zamanı sıfırlamıyoruz
startTime = millis() - elapsedTime;
lapStartTime = millis() - lapTime;
}
isRunning = true;
}
}
// Sıfırla Butonu
if (digitalRead(RESET_BUTTON) == LOW) {
delay(200); // Debounce
isRunning = false;
elapsedTime = 0;
lapTime = 0;
splitTime = 0;
lapCounter = 0;
isRecalling = false;
recallIndex = 0;
for (int i = 0; i < MAX_RECORDS; i++) {
splitTimes[i] = 0;
lapTimes[i] = 0;
}
}
// Lap/Split Butonu
if (digitalRead(LAP_SPLIT_BUTTON) == LOW && isRunning) {
delay(200); // Debounce
splitTime = elapsedTime;
lapTimes[lapCounter] = lapTime;
splitTimes[lapCounter] = splitTime;
lapStartTime = millis();
lapCounter++;
if (lapCounter >= MAX_RECORDS) lapCounter = MAX_RECORDS - 1;
}
// Recall (Geri Çağırma) Butonu
if (digitalRead(RECALL_BUTTON) == LOW) {
delay(200); // Debounce
if (lapCounter > 0) {
isRecalling = true;
recallIndex = 0;
displayMemory();
isRecalling = false;
}
}
}
void displayTime() {
u8g.firstPage();
do {
// Başlık
u8g.setFont(u8g_font_unifont);
u8g.drawStr(40, 10, "Kronometre");
// Toplam Süre
char totalTimeStr[20];
formatTime(elapsedTime, totalTimeStr);
u8g.drawStr(0, 30, "Toplam:");
u8g.drawStr(60, 30, totalTimeStr);
// Tur Süresi
char lapTimeStr[20];
formatTime(lapTime, lapTimeStr);
u8g.drawStr(0, 50, "Tur:");
u8g.drawStr(60, 50, lapTimeStr);
} while (u8g.nextPage());
}
void displayMemory() {
for (int i = 0; i < lapCounter; i++) {
u8g.firstPage();
do {
// Başlık
u8g.setFont(u8g_font_unifont);
char title[20];
sprintf(title, "Tur %d", i + 1);
u8g.drawStr(30, 10, title);
// Split Süre
char splitStr[20];
formatTime(splitTimes[i], splitStr);
u8g.drawStr(0, 30, "Split:");
u8g.drawStr(60, 30, splitStr);
// Lap Süre
char lapStr[20];
formatTime(lapTimes[i], lapStr);
u8g.drawStr(0, 50, "Lap:");
u8g.drawStr(60, 50, lapStr);
} while (u8g.nextPage());
delay(1000); // Her kaydı gösterme süresi
}
}
void formatTime(unsigned long time, char *buffer) {
unsigned long seconds = (time / 1000) % 60;
unsigned long minutes = (time / 60000) % 60;
unsigned long hours = (time / 3600000);
sprintf(buffer, "%02lu:%02lu:%02lu", hours, minutes, seconds);
}