#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int ledPin = 9;
const int increaseButton = 3;
const int decreaseButton = 2;
const int confirmButton = 4;
int brightnessPercent = 5;
const int brightnessStep = 5;
int durationMinutes = 0;
int durationSeconds = 5;
const int timeStep = 5;
bool brightnessSet = false;
bool durationSet = false;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(increaseButton, INPUT_PULLUP);
pinMode(decreaseButton, INPUT_PULLUP);
pinMode(confirmButton, INPUT_PULLUP);
Serial.begin(9600);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
displayInitialPrompt();
}
void loop() {
if (!brightnessSet) {
checkButtons("Brightness");
} else if (brightnessSet && !durationSet) {
checkButtons("Duration");
} else if (brightnessSet && durationSet) {
startProcess();
}
}
void checkButtons(String settingType) {
if (digitalRead(increaseButton) == LOW) {
delay(200);
if (settingType == "Brightness") {
brightnessPercent += brightnessStep;
if (brightnessPercent > 100) {
brightnessPercent = 100;
}
updateDisplay("Brightness");
} else if (settingType == "Duration") {
durationSeconds += timeStep;
if (durationSeconds >= 60) {
durationMinutes += 1;
durationSeconds = durationSeconds % 60;
}
updateDisplay("Duration");
}
}
if (digitalRead(decreaseButton) == LOW) {
delay(200);
if (settingType == "Brightness") {
brightnessPercent -= brightnessStep;
if (brightnessPercent < 0) {
brightnessPercent = 0;
}
updateDisplay("Brightness");
} else if (settingType == "Duration") {
if (durationSeconds == 0 && durationMinutes > 0) {
durationMinutes -= 1;
durationSeconds = 60 - timeStep;
} else {
durationSeconds -= timeStep;
}
if (durationMinutes < 0) durationMinutes = 0;
if (durationSeconds < 0) durationSeconds = 0;
updateDisplay("Duration");
}
}
if (digitalRead(confirmButton) == LOW) {
delay(200);
if (!brightnessSet) {
brightnessSet = true;
updateDisplay("Duration"); // Go immediately to the duration setting.
} else if (brightnessSet && !durationSet) {
durationSet = true;
display.clearDisplay();
display.setCursor(0, 0);
display.print("Starting...");
display.display();
}
}
}
void displayInitialPrompt() {
display.clearDisplay();
display.setCursor(0, 0);
display.print("Set Brightness:");
display.display();
updateDisplay("Brightness");
}
void updateDisplay(String settingType) {
display.clearDisplay();
display.setCursor(0, 0);
if (settingType == "Brightness") {
display.print("Brightness: ");
display.print(brightnessPercent);
display.println("%");
} else if (settingType == "Duration") {
display.print("Duration:");
display.setCursor(0, 20);
display.print(durationMinutes);
display.print(" min");
display.setCursor(0, 40);
display.print(durationSeconds);
display.println(" sec");
}
display.display();
}
void startProcess() {
int totalTime = (durationMinutes * 60) + durationSeconds;
for (int i = totalTime; i > 0; i--) {
int minutesRemaining = i / 60;
int secondsRemaining = i % 60;
// Checking buttons to adjust light intensity
if (digitalRead(increaseButton) == LOW) {
brightnessPercent += brightnessStep;
if (brightnessPercent > 100) brightnessPercent = 100;
}
if (digitalRead(decreaseButton) == LOW) {
brightnessPercent -= brightnessStep;
if (brightnessPercent < 0) brightnessPercent = 0;
}
// Update light intensity
int mappedBrightness = map(brightnessPercent, 0, 100, 0, 255);
analogWrite(ledPin, mappedBrightness);
display.clearDisplay();
display.setCursor(0, 0);
display.print("Brightness: ");
display.print(brightnessPercent);
display.println("%");
display.setCursor(0, 16);
display.print("Remaining:");
// Position for displaying minutes
display.setCursor(0, 32);
display.print(minutesRemaining);
display.print(" min");
// Position for displaying seconds
display.setCursor(0, 48);
display.print(secondsRemaining);
display.println(" sec");
display.display();
delay(1000);
}
analogWrite(ledPin, 0);
display.clearDisplay();
display.setCursor(0, 0);
display.print("Finish");
display.display();
delay(2000); // Display the completion message for 2 seconds
// Return to initial settings
brightnessSet = false;
durationSet = false;
brightnessPercent = 5;
durationMinutes = 0;
durationSeconds = 5;
displayInitialPrompt(); // Redisplay the initial message
}