#include <Wire.h>
#include <RTClib.h>
#include <TM1637Display.h>
#include <DHT.h>
#define CLK_PIN 9
#define DIO_PIN 8
#define DHTPIN 5
#define DHTTYPE DHT11
TM1637Display display(CLK_PIN, DIO_PIN);
RTC_DS1307 rtc;
DHT dht(DHTPIN, DHTTYPE);
#define UP_BUTTON_PIN 2
#define DOWN_BUTTON_PIN 3
#define MODE_BUTTON_PIN 4
bool isRandomMode = false;
int mode = 0; // 0: ساعت, 1: تاریخ, 2: دما, 3: تنظیمات
unsigned long lastModeChange = 0;
unsigned long modePressStart = 0;
bool isModePressed = false;
int adjustMode = 0; // 0: ساعت, 1: دقیقه, 2: روز, 3: ماه, 4: سال
void setup() {
Wire.begin();
rtc.begin();
dht.begin();
display.setBrightness(7);
pinMode(UP_BUTTON_PIN, INPUT_PULLUP);
pinMode(DOWN_BUTTON_PIN, INPUT_PULLUP);
pinMode(MODE_BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
DateTime now = rtc.now();
int hour = now.hour();
int minute = now.minute();
int day = now.day();
int month = now.month();
int year = now.year();
// اگر در حالت تصادفی هستیم، نمایش را تغییر بده
if (isRandomMode && mode != 3) {
if (millis() - lastModeChange >= 5000) {
mode = (mode + 1) % 3; // تغییر بین ساعت، تاریخ و دما
lastModeChange = millis();
}
}
// نمایش بر اساس حالت
if (mode == 0) {
display.showNumberDecEx(hour % 12 * 100 + minute, 0b01000000, true); // نمایش ساعت
} else if (mode == 1) {
display.showNumberDecEx(month * 100 + day, 0b00001110, true); // نمایش تاریخ
} else if (mode == 2) {
showTemperature(); // نمایش دما
} else if (mode == 3) {
adjustTime(now); // حالت تنظیمات
}
handleButtons(now); // ارسال now به تابع handleButtons
}
void handleButtons(DateTime now) {
int modeState = digitalRead(MODE_BUTTON_PIN);
int upState = digitalRead(UP_BUTTON_PIN);
int downState = digitalRead(DOWN_BUTTON_PIN);
// تغییر حالت با دکمه Mode
if (modeState == LOW) {
if (!isModePressed) {
isModePressed = true;
modePressStart = millis();
}
} else if (modeState == HIGH) {
if (isModePressed) {
unsigned long pressDuration = millis() - modePressStart;
if (pressDuration >= 3000) {
mode = 3; // ورود به تنظیمات
adjustMode = 0; // شروع از ساعت
isRandomMode = false; // خروج از حالت تصادفی
} else {
isRandomMode = !isRandomMode; // تغییر به حالت تصادفی
if (isRandomMode) {
lastModeChange = millis();
}
}
}
isModePressed = false;
}
// تنظیمات با دکمههای بالا و پایین
if (mode == 3) {
if (upState == LOW) {
delay(200);
adjustDateTime(now, true);
}
if (downState == LOW) {
delay(200);
adjustDateTime(now, false);
}
}
}
void adjustTime(DateTime now) {
int hour = now.hour();
int minute = now.minute();
int day = now.day();
int month = now.month();
int year = now.year();
uint8_t leadingSegments[2] = {0, 0}; // بخش چپ ثابت
int valueToDisplay = 0;
switch (adjustMode) {
case 0: // تنظیم ساعت
leadingSegments[0] = 0b01110110; // 'H'
valueToDisplay = hour % 12;
break;
case 1: // تنظیم دقیقه
leadingSegments[0] = 0b01111001; // 'E'
valueToDisplay = minute;
break;
case 2: // تنظیم روز
leadingSegments[0] = 0b01011110; // 'D'
valueToDisplay = day;
break;
case 3: // تنظیم ماه
leadingSegments[0] = 0b01110001; // 'F'
valueToDisplay = month;
break;
case 4: // تنظیم سال
leadingSegments[0] = 0b00111111; // 'Y'
valueToDisplay = year % 100; // نمایش دو رقمی سال
break;
}
display.setSegments(leadingSegments, 1, 0);
display.showNumberDecEx(valueToDisplay, 0b01000000, true, 2, 1);
if (digitalRead(MODE_BUTTON_PIN) == LOW) {
delay(200);
adjustMode = (adjustMode + 1) % 5; // تغییر بین تنظیمات
if (adjustMode == 0) {
mode = 0; // بازگشت به ساعت
}
}
}
void adjustDateTime(DateTime now, bool increment) {
int hour = now.hour();
int minute = now.minute();
int day = now.day();
int month = now.month();
int year = now.year();
if (adjustMode == 0) {
hour = increment ? hour + 1 : hour - 1;
if (hour > 23) hour = 0;
if (hour < 0) hour = 23;
} else if (adjustMode == 1) {
minute = increment ? minute + 1 : minute - 1;
if (minute > 59) minute = 0;
if (minute < 0) minute = 59;
} else if (adjustMode == 2) {
day = increment ? day + 1 : day - 1;
if (day > 31) day = 1; // تنظیمات ساده برای روز
if (day < 1) day = 31;
} else if (adjustMode == 3) {
month = increment ? month + 1 : month - 1;
if (month > 12) month = 1;
if (month < 1) month = 12;
} else if (adjustMode == 4) {
year = increment ? year + 1 : year - 1; // تنظیم سال
}
rtc.adjust(DateTime(year, month, day, hour, minute, now.second()));
}
void showTemperature() {
float temperature = dht.readTemperature();
if (isnan(temperature)) {
display.showNumberDecEx(8888, 0b00000000, true); // ارور در خواندن دما
} else {
int temp = static_cast<int>(temperature);
uint8_t leadingSegments[2] = {0b01000000, 0b00111001}; // '-C'
display.setSegments(leadingSegments, 2, 0);
display.showNumberDecEx(temp, 0b01000000, true, 2, 2);
}
}