#include <Wire.h>
#include <RTClib.h>
#include <TM1637Display.h>
// پینهای متصل به دکمهها
const int buttonModePin = 2;
const int buttonUpPin = 3;
const int buttonDownPin = 4;
// پینهای متصل به ماژول TM1637
const int CLK = 9; // پایه ساعت
const int DIO = 8; // پایه داده
// ایجاد شیء نمایشگر و RTC
TM1637Display display(CLK, DIO);
RTC_DS1307 rtc;
// متغیرهایی برای ذخیره وضعیت دکمهها
bool modePressed = false;
bool upPressed = false;
bool downPressed = false;
// متغیر برای نگه داشتن حالت تنظیمات
bool inSettingsMode = false;
bool settingHours = true;
void setup() {
// شروع ارتباط با RTC و نمایشگر
rtc.begin();
display.setBrightness(0x0f);
// تعریف پینهای دکمه به عنوان ورودی
pinMode(buttonModePin, INPUT);
pinMode(buttonUpPin, INPUT);
pinMode(buttonDownPin, INPUT);
// بررسی کنید که آیا RTC در حال اجرا است
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
// خواندن وضعیت دکمهها
modePressed = digitalRead(buttonModePin);
upPressed = digitalRead(buttonUpPin);
downPressed = digitalRead(buttonDownPin);
// بررسی حالت تنظیمات
if (modePressed) {
inSettingsMode = !inSettingsMode;
settingHours = true; // شروع با تنظیم ساعت
delay(200); // جلوگیری از پرشهای دکمه
}
if (inSettingsMode) {
DateTime now = rtc.now();
int hours = now.hour();
int minutes = now.minute();
// تنظیم ساعت یا دقیقه
if (settingHours) {
if (upPressed) {
hours = (hours + 1) % 24;
} else if (downPressed) {
hours = (hours + 23) % 24;
}
display.showNumberDecEx(hours, 0b01000000, true, 2, 0); // نمایش 'H' برای ساعت
} else {
if (upPressed) {
minutes = (minutes + 1) % 60;
} else if (downPressed) {
minutes = (minutes + 59) % 60;
}
display.showNumberDecEx(minutes, 0b11100000, true, 2, 2); // نمایش 'E' برای دقیقه
}
// بهروزرسانی زمان در RTC
rtc.adjust(DateTime(now.year(), now.month(), now.day(), hours, minutes, 0));
// تغییر بین تنظیم ساعت و دقیقه
if (modePressed) {
settingHours = !settingHours;
delay(200); // جلوگیری از پرشهای دکمه
}
} else {
// نمایش زمان فعلی
DateTime now = rtc.now();
display.showNumberDecEx(now.hour(), 0, true, 2, 0);
display.showNumberDecEx(now.minute(), 0, true, 2, 2);
}
// تأخیر کوتاه برای جلوگیری از پرشهای دکمه
delay(200);
}