#include <Wire.h>
#include "RTClib.h"
#include "TM1637.h"
#define butonUp 2 // کلید افزایش
#define butonDown 3 // کلید کاهش
#define butonSet 4 // کلید تنظیم
#define goarna 7 // بوق هشدار
#define CLK 9 // پین CLK برای نمایشگر TM1637
#define DIO 8 // پین DIO برای نمایشگر TM1637
RTC_DS1307 rtc;
TM1637 tm1637(CLK, DIO);
int hh, mm; // متغیرهای ساعت و دقیقه
int sethourstemp, setminstemp;
void setup() {
pinMode(butonUp, INPUT_PULLUP);
pinMode(butonDown, INPUT_PULLUP);
pinMode(butonSet, INPUT_PULLUP);
pinMode(goarna, OUTPUT);
digitalWrite(goarna, LOW);
tm1637.init();
tm1637.set(5); // تنظیم روشنایی نمایشگر
rtc.begin();
}
void loop() {
DateTime now = rtc.now();
hh = now.hour();
mm = now.minute();
displayTime(hh, mm); // نمایش ساعت جاری
if (digitalRead(butonSet) == LOW) {
delay(500); // جلوگیری از تداخل فشردن کلید
sethourstemp = hh;
setminstemp = mm;
setClock();
}
}
void setClock() {
sethours();
delay(500);
setmins();
delay(500);
rtc.adjust(DateTime(2025, 2, 13, sethourstemp, setminstemp, 0));
delay(500);
}
void sethours() {
while (true) {
displayTime(sethourstemp, -1); // نمایش ساعت و مخفی کردن دقیقه
if (digitalRead(butonUp) == LOW) {
delay(200);
sethourstemp++;
if (sethourstemp > 23) sethourstemp = 0;
}
if (digitalRead(butonDown) == LOW) {
delay(200);
sethourstemp--;
if (sethourstemp < 0) sethourstemp = 23;
}
if (digitalRead(butonSet) == LOW) break; // خروج از تنظیم ساعت
}
}
void setmins() {
while (true) {
displayTime(-1, setminstemp); // نمایش دقیقه و مخفی کردن ساعت
if (digitalRead(butonUp) == LOW) {
delay(200);
setminstemp++;
if (setminstemp > 59) setminstemp = 0;
}
if (digitalRead(butonDown) == LOW) {
delay(200);
setminstemp--;
if (setminstemp < 0) setminstemp = 59;
}
if (digitalRead(butonSet) == LOW) break; // خروج از تنظیم دقیقه
}
}
void displayTime(int hours, int minutes) {
tm1637.point(POINT_ON);
if (hours != -1) { // اگر مقدار ساعت معتبر بود، نمایش دهد
if (hours / 10 == 0) tm1637.display(0, 17);
else tm1637.display(0, hours / 10);
tm1637.display(1, hours % 10);
} else { // ساعت را مخفی کند
tm1637.display(0, 16);
tm1637.display(1, 16);
}
if (minutes != -1) { // اگر مقدار دقیقه معتبر بود، نمایش دهد
tm1637.display(2, minutes / 10);
tm1637.display(3, minutes % 10);
} else { // دقیقه را مخفی کند
tm1637.display(2, 16);
tm1637.display(3, 16);
}
delay(500);
}