#include <TM1637Display.h>
// Khai báo chân kết nối TM1637 7-segment displays
#define CLK1 2
#define DIO1 3
#define CLK2 4
#define DIO2 5
#define CLK3 6
#define DIO3 7
#define CLK4 8
#define DIO4 9
// Khai báo chân kết nối relays và nút nhấn
#define RELAY1 12
#define RELAY2 13
#define START_BTN A0
#define STOP_BTN A1
#define INC_ON_TIME_BTN A2
#define DEC_ON_TIME_BTN A3
#define INC_OFF_TIME_BTN A4
#define DEC_OFF_TIME_BTN A5
#define INC_CYCLES_BTN 10
#define DEC_CYCLES_BTN 11
TM1637Display display1(CLK1, DIO1);
TM1637Display display2(CLK2, DIO2);
TM1637Display display3(CLK3, DIO3);
TM1637Display display4(CLK4, DIO4);
int onTime = 1320; // Thời gian ON ban đầu (phút)
int offTime = 120; // Thời gian OFF ban đầu (phút)
int cycles = 4; // Số chu kỳ ban đầu
int completedCycles = 0;
int countdownSeconds = 0;
bool running = false;
bool paused = false;
unsigned long previousMillis = 0;
const long interval = 1000; // 1 giây
void setup() {
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
pinMode(START_BTN, INPUT_PULLUP);
pinMode(STOP_BTN, INPUT_PULLUP);
pinMode(INC_ON_TIME_BTN, INPUT_PULLUP);
pinMode(DEC_ON_TIME_BTN, INPUT_PULLUP);
pinMode(INC_OFF_TIME_BTN, INPUT_PULLUP);
pinMode(DEC_OFF_TIME_BTN, INPUT_PULLUP);
pinMode(INC_CYCLES_BTN, INPUT_PULLUP);
pinMode(DEC_CYCLES_BTN, INPUT_PULLUP);
digitalWrite(RELAY1, LOW);
digitalWrite(RELAY2, LOW);
display1.setBrightness(0x0f);
display2.setBrightness(0x0f);
display3.setBrightness(0x0f);
display4.setBrightness(0x0f);
updateDisplays();
}
void loop() {
if (digitalRead(START_BTN) == LOW) {
if (!running) {
startProgram();
} else if (paused) {
resumeProgram();
}
}
if (digitalRead(STOP_BTN) == LOW) {
delay(500);
if (digitalRead(STOP_BTN) == LOW) {
if (paused) {
resetProgram();
} else {
pauseProgram();
}
}
}
if (digitalRead(INC_ON_TIME_BTN) == LOW) {
onTime += 10;
delay(200);
updateDisplays();
}
if (digitalRead(DEC_ON_TIME_BTN) == LOW) {
if (onTime > 0) onTime -= 10;
delay(200);
updateDisplays();
}
if (digitalRead(INC_OFF_TIME_BTN) == LOW) {
offTime += 10;
delay(200);
updateDisplays();
}
if (digitalRead(DEC_OFF_TIME_BTN) == LOW) {
if (offTime > 0) offTime -= 10;
delay(200);
updateDisplays();
}
if (digitalRead(INC_CYCLES_BTN) == LOW) {
cycles++;
delay(200);
updateDisplays();
}
if (digitalRead(DEC_CYCLES_BTN) == LOW) {
if (cycles > 0) cycles--;
delay(200);
updateDisplays();
}
if (running && !paused) {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
countdownSeconds--;
if (countdownSeconds <= 0) {
if (digitalRead(RELAY1) == HIGH) {
digitalWrite(RELAY1, LOW);
countdownSeconds = offTime * 60;
} else {
completedCycles++;
if (completedCycles >= cycles) {
digitalWrite(RELAY2, HIGH);
running = false;
} else {
digitalWrite(RELAY1, HIGH);
countdownSeconds = onTime * 60;
}
}
}
updateDisplays();
}
}
}
void startProgram() {
running = true;
paused = false;
digitalWrite(RELAY1, HIGH);
countdownSeconds = onTime * 60;
updateDisplays();
}
void pauseProgram() {
paused = true;
updateDisplays();
}
void resumeProgram() {
paused = false;
updateDisplays();
}
void resetProgram() {
running = false;
paused = false;
digitalWrite(RELAY1, LOW);
digitalWrite(RELAY2, LOW);
onTime = 1440;
offTime = 0;
cycles = 0;
completedCycles = 0;
countdownSeconds = 0;
updateDisplays();
}
void updateDisplays() {
display1.showNumberDec(onTime);
display2.showNumberDec(offTime);
display3.showNumberDecEx((cycles * 100) + completedCycles, 0b01000000);
display4.showNumberDec(countdownSeconds);
}