LED UV Controller - Bambu3Design – 3D Printing & Design
Smart High-Power LED / UV Controller

LED UV Controller

#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

}


Scroll to Top