#include <Wire.h>
#include <TM1637Display.h>
#include <RTClib.h>
#include <DHT.h>
// پینهای TM1637
#define CLK 9
#define DIO 8
TM1637Display display(CLK, DIO);
// پین و نوع DHT
#define DHTPIN 5
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// پینهای کلیدهای تنظیم ساعت
#define BTN_HOUR 2
#define BTN_MIN 3
#define BTN_SET 4
RTC_DS1307 rtc;
bool settingMode = false; // حالت تنظیم ساعت
int adjHour, adjMinute; // مقادیر موقت ساعت و دقیقه
unsigned long lastPressTime = 0; // برای جلوگیری از نویز کلیدها
void setup() {
Serial.begin(9600);
// راهاندازی نمایشگر
display.setBrightness(0x0f);
// راهاندازی DHT22
dht.begin();
// راهاندازی DS1307
if (!rtc.begin()) {
Serial.println("RTC not found!");
while (1);
}
if (!rtc.isrunning()) {
Serial.println("RTC is not running!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // تنظیم اولیه زمان
}
// تنظیم پینهای کلیدها
pinMode(BTN_HOUR, INPUT_PULLUP);
pinMode(BTN_MIN, INPUT_PULLUP);
pinMode(BTN_SET, INPUT_PULLUP);
}
void loop() {
unsigned long currentMillis = millis();
// خواندن کلید SET برای ورود به حالت تنظیم
if (digitalRead(BTN_SET) == LOW && currentMillis - lastPressTime > 500) {
lastPressTime = currentMillis;
settingMode = !settingMode;
if (settingMode) {
DateTime now = rtc.now();
adjHour = now.hour();
adjMinute = now.minute();
} else {
rtc.adjust(DateTime(2025, 2, 2, adjHour, adjMinute, 0));
}
}
if (settingMode) {
// افزایش ساعت
if (digitalRead(BTN_HOUR) == LOW && currentMillis - lastPressTime > 300) {
lastPressTime = currentMillis;
adjHour = (adjHour + 1) % 24;
}
// افزایش دقیقه
if (digitalRead(BTN_MIN) == LOW && currentMillis - lastPressTime > 300) {
lastPressTime = currentMillis;
adjMinute = (adjMinute + 1) % 60;
}
display.showNumberDecEx(adjHour * 100 + adjMinute, 0b01000000, true);
return;
}
// نمایش ساعت و دما در حالت عادی
DateTime now = rtc.now();
float h = dht.readHumidity();
float t = dht.readTemperature();
// نمایش ساعت با افکت چشمکزن
display.showNumberDecEx(now.hour() * 100 + now.minute(), 0b01000000, true);
delay(2000);
// نمایش دما
display.showNumberDec((int)t, false);
delay(1000);
display.showNumberDecEx((int)t, 0b01000000, false);
delay(1000);
// نمایش رطوبت
display.showNumberDec((int)h, false);
delay(1000);
display.showNumberDecEx((int)h, 0b01000000, false);
delay(1000);
}