#include <Wire.h>
#include <U8g2lib.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// Khởi tạo màn hình SH1106 với U8g2
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
const int ledPin = 9; // LED chính
const int ledPin2 = 13; // LED thứ hai
const int startButtonPin = 4;
const int stopButtonPin = 5;
const int buzzPin = 11;
const int selectButtonPin = 6;
const int setButtonPin = 7;
unsigned long startTime = 0;
unsigned long elapsedTime = 0;
unsigned long ledDuration = 3600000;
bool isRunning = false;
bool isPaused = false;
int ledBrightness = 110; // Độ sáng mặc định tối đa
int valueReference = 0; // Giá trị tham chiếu từ 0-5000
const unsigned long debounceDelay = 110; // Thời gian chống nhảy nút
unsigned long lastDebounceTimeSelect = 0;
unsigned long lastDebounceTimeSet = 0;
// Khai báo các hàm
void welcomeMessage();
void updateDisplay();
void checkLedDuration();
void pauseAndBuzz(const char* message);
void fadeInLED();
void fadeOutLED();
void setTime();
void displayTime(unsigned long duration);
void setLEDBrightness();
void displayBrightness(int brightness);
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT); // Thiết lập chân LED thứ hai
pinMode(startButtonPin, INPUT_PULLUP);
pinMode(stopButtonPin, INPUT_PULLUP);
pinMode(buzzPin, OUTPUT);
pinMode(selectButtonPin, INPUT_PULLUP);
pinMode(setButtonPin, INPUT_PULLUP);
digitalWrite(buzzPin, LOW);
TCCR1B = TCCR1B & B11111000 | B00000001;
Serial.begin(9600);
// Khởi tạo màn hình với U8g2
u8g2.begin();
welcomeMessage();
}
void loop() {
if (!isRunning) {
if (digitalRead(selectButtonPin) == LOW && millis() - lastDebounceTimeSelect > debounceDelay) {
setTime(); // Cài đặt thời gian
lastDebounceTimeSelect = millis();
}
if (digitalRead(setButtonPin) == LOW && millis() - lastDebounceTimeSet > debounceDelay) {
setLEDBrightness(); // Cài đặt độ sáng LED
lastDebounceTimeSet = millis();
}
}
updateDisplay();
if (digitalRead(stopButtonPin) == LOW && isRunning && millis() - lastDebounceTimeSet > debounceDelay) {
pauseAndBuzz("Stopped");
lastDebounceTimeSet = millis();
}
if (digitalRead(startButtonPin) == LOW && !isRunning) {
if (isPaused) {
isPaused = false;
} else {
elapsedTime = 0;
}
isRunning = true;
startTime = millis();
digitalWrite(buzzPin, LOW);
// Bật ngay LED ở chân 13
digitalWrite(ledPin2, HIGH);
// Bật LED ở chân 9 theo quy luật sáng dần
fadeInLED();
}
if (isRunning) {
checkLedDuration();
}
delay(100);
}
// Hiển thị thông báo khởi động
void welcomeMessage() {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB14_tr);
u8g2.drawStr(0, 24, " To Soi");
u8g2.drawStr(0, 44, "Mai Phuong");
u8g2.drawStr(0, 64, "0368978597");
u8g2.sendBuffer();
delay(2000);
}
// Cập nhật hiển thị màn hình
void updateDisplay() {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB14_tr);
if (isRunning) {
unsigned long currentTime = elapsedTime + (millis() - startTime);
char timeStr[20];
snprintf(timeStr, sizeof(timeStr), "TG: %lus", currentTime / 1000);
u8g2.drawStr(0, 24, timeStr);
char brightnessStr[20];
snprintf(brightnessStr, sizeof(brightnessStr), "TD: %d", ledBrightness);
u8g2.drawStr(0, 44, brightnessStr);
valueReference = map(ledBrightness, 0, 110, 0, 3250);
char valueStr[20];
snprintf(valueStr, sizeof(valueStr), "V/P: %d", valueReference);
u8g2.drawStr(0, 64, valueStr);
} else {
unsigned long currentTime = elapsedTime;
char timeStr[20];
snprintf(timeStr, sizeof(timeStr), "TG: %lus", currentTime / 1000);
u8g2.drawStr(0, 24, timeStr);
if (digitalRead(stopButtonPin) == LOW) {
u8g2.drawStr(0, 44, "Stopped");
} else {
char brightnessStr[20];
snprintf(brightnessStr, sizeof(brightnessStr), "TD: %d", ledBrightness);
u8g2.drawStr(0, 44, brightnessStr);
}
}
u8g2.sendBuffer();
}
// Kiểm tra thời gian LED
void checkLedDuration() {
if (elapsedTime + (millis() - startTime) >= ledDuration) {
fadeOutLED();
digitalWrite(ledPin, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(buzzPin, HIGH);
isRunning = false;
elapsedTime = 0;
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB14_tr);
u8g2.drawStr(0, 24, "Done");
u8g2.sendBuffer();
delay(2000);
}
}
// Dừng và phát âm báo
void pauseAndBuzz(const char* message) {
isPaused = true;
isRunning = false;
elapsedTime += millis() - startTime;
fadeOutLED();
digitalWrite(ledPin, LOW); // Tắt LED 9
digitalWrite(ledPin2, LOW); // Tắt LED 13
digitalWrite(buzzPin, HIGH);
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB14_tr);
u8g2.drawStr(0, 24, message);
u8g2.sendBuffer();
delay(2000);
}
// Hàm tăng độ sáng LED từ từ
void fadeInLED() {
for (int i = 0; i <= ledBrightness; i++) {
analogWrite(ledPin, i);
delay(35);
}
}
// Hàm giảm độ sáng LED từ từ
void fadeOutLED() {
for (int i = ledBrightness; i >= 0; i--) {
analogWrite(ledPin, i);
delay(10);
}
}
// Cài đặt thời gian
void setTime() {
unsigned long tempDuration = 0;
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB14_tr);
char timeStr[20];
snprintf(timeStr, sizeof(timeStr), "ST: %lus", tempDuration / 1000);
u8g2.drawStr(0, 24, timeStr);
u8g2.sendBuffer();
while (true) {
if (digitalRead(startButtonPin) == LOW && millis() - lastDebounceTimeSelect > debounceDelay) {
tempDuration += 60000;
displayTime(tempDuration);
lastDebounceTimeSelect = millis();
} else if (digitalRead(stopButtonPin) == LOW && millis() - lastDebounceTimeSelect > debounceDelay) {
if (tempDuration >= 60000) tempDuration -= 60000;
displayTime(tempDuration);
lastDebounceTimeSelect = millis();
} else if (digitalRead(setButtonPin) == LOW && millis() - lastDebounceTimeSet > debounceDelay) {
ledDuration = tempDuration;
lastDebounceTimeSet = millis();
break;
}
}
}
// Hiển thị thời gian
void displayTime(unsigned long duration) {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB14_tr);
char timeStr[20];
snprintf(timeStr, sizeof(timeStr), "ST: %lus", duration / 1000);
u8g2.drawStr(0, 24, timeStr);
u8g2.sendBuffer();
}
// Cài đặt độ sáng LED
void setLEDBrightness() {
int tempBrightness = ledBrightness;
displayBrightness(tempBrightness);
while (true) {
if (digitalRead(startButtonPin) == LOW && millis() - lastDebounceTimeSelect > debounceDelay) {
tempBrightness += 1;
if (tempBrightness > 110) tempBrightness = 110;
displayBrightness(tempBrightness);
lastDebounceTimeSelect = millis();
} else if (digitalRead(stopButtonPin) == LOW && millis() - lastDebounceTimeSelect > debounceDelay) {
tempBrightness -= 1;
if (tempBrightness < 0) tempBrightness = 0;
displayBrightness(tempBrightness);
lastDebounceTimeSelect = millis();
} else if (digitalRead(setButtonPin) == LOW && millis() - lastDebounceTimeSet > debounceDelay) {
ledBrightness = tempBrightness;
lastDebounceTimeSet = millis();
break;
}
}
}
// Hiển thị độ sáng LED
void displayBrightness(int brightness) {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB14_tr);
char brightnessStr[20];
snprintf(brightnessStr, sizeof(brightnessStr), "TD: %d", brightness);
u8g2.drawStr(0, 24, brightnessStr);
u8g2.sendBuffer();
}