#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);
// Button and LED pins
const int powerButton = 2;
const int incButton = 3;
const int decButton = 4;
const int ledButtons[] = {5, 12, 7, 8};
const int ledPins[] = {9, 10, 11, 6};
int brightnessLevels[] = {0, 0, 0, 0}; // LED brightness (0-9)
int selectedLED = -1; // No LED selected initially
bool systemOn = false;
unsigned long powerButtonPressTime = 0;
unsigned long lastActionTime = 0;
bool showOnlyOff = false;
void setup() {
pinMode(powerButton, INPUT_PULLUP);
pinMode(incButton, INPUT_PULLUP);
pinMode(decButton, INPUT_PULLUP);
for (int i = 0; i < 4; i++) {
pinMode(ledButtons[i], INPUT_PULLUP);
pinMode(ledPins[i], OUTPUT);
}
if (!display.begin(SSD1306_PAGEADDR, 0x3C)) {
while (1);
}
display.clearDisplay();
display.setTextSize(4);
display.setTextColor(SSD1306_WHITE);
display.setCursor(30, 15);
display.println("OFF");
display.display();
}
void loop() {
checkPowerButton();
if (systemOn && !showOnlyOff) {
checkLedSelection();
adjustBrightness();
updateLEDs();
updateDisplay();
}
if (!systemOn && (millis() - lastActionTime > 300000)) { // After 5 minutes
showOnlyOffMessage();
}
}
void checkPowerButton() {
if (digitalRead(powerButton) == LOW) {
if (powerButtonPressTime == 0) {
powerButtonPressTime = millis();
}
if (millis() - powerButtonPressTime >= 4000) {
systemOn = !systemOn; // Toggle system power
selectedLED = -1; // Reset LED selection
for (int i = 0; i < 4; i++) {
brightnessLevels[i] = 0; // Reset all LED brightness
analogWrite(ledPins[i], 0);
}
delay(1500);
lastActionTime = millis();
showOnlyOff = false;
updateDisplay();
}
} else {
powerButtonPressTime = 0;
}
}
void checkLedSelection() {
for (int i = 0; i < 4; i++) {
if (digitalRead(ledButtons[i]) == LOW) {
selectedLED = i;
delay(200);
lastActionTime = millis();
}
}
}
void adjustBrightness() {
if (selectedLED != -1) {
if (digitalRead(incButton) == LOW && brightnessLevels[selectedLED] < 5) {
brightnessLevels[selectedLED]++;
delay(200);
lastActionTime = millis();
}
if (digitalRead(decButton) == LOW && brightnessLevels[selectedLED] > 0) {
brightnessLevels[selectedLED]--;
delay(200);
lastActionTime = millis();
}
}
}
void updateLEDs() {
for (int i = 0; i < 4; i++) {
int pwmValue = map(brightnessLevels[i], 0, 9, 0, 255);
analogWrite(ledPins[i], pwmValue);
}
}
void updateDisplay() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
if (systemOn) {
if (selectedLED == -1) {
display.setCursor(20, 20);
display.println("Please select LED");
} else {
display.setCursor(20, 20);
display.print("L");
display.print(selectedLED + 1);
display.print(" = ");
display.print(brightnessLevels[selectedLED]);
}
} else {
display.setTextSize(2);
display.setCursor(10, 20);
display.println("OFF");
display.setTextSize(1);
display.setCursor(20, 45);
display.println("(DO NOT TOUCH)");
}
display.display();
}
void showOnlyOffMessage() {
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(SSD1306_WHITE);
display.setCursor(30, 20);
display.println("OFF");
display.display();
showOnlyOff = true;
}