#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <EEPROM.h>
// ===== OLED =====
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// ===== PINS =====
#define BTN_UP 7
#define BTN_DOWN 8
#define STBY_BTN 10
#define BUZZER 5
#define MOSFET 9
#define TEMP_PIN A0
// ===== EEPROM STRUCT =====
struct Settings {
int tip1;
int tip2;
int sleep;
int selected;
};
Settings data;
// ===== VARIABLES =====
int menuIndex = 0;
int setTemp = 300;
int currentTemp = 0;
int tip1_temp = 300;
int tip2_temp = 380;
int selectedTip = 0;
// Sleep
int sleepMode = 0;
unsigned long lastActivity = 0;
bool heaterOn = true;
bool wakePressed = false;
// STBY
bool standby = false;
bool lastState = HIGH;
bool lastStandby = false;
// PID
float Kp = 5;
float output = 0;
// ===== BUZZER =====
void beep(int t)
{
digitalWrite(BUZZER, HIGH);
delay(t);
digitalWrite(BUZZER, LOW);
}
// ===== TEMP READ =====
int readTemp()
{
return map(analogRead(TEMP_PIN), 0, 1023, 20, 450);
}
// ===== SAVE EEPROM =====
void saveSettings()
{
data.tip1 = tip1_temp;
data.tip2 = tip2_temp;
data.sleep = sleepMode;
data.selected = selectedTip;
EEPROM.put(0, data);
}
// ===== LOAD EEPROM =====
void loadSettings()
{
EEPROM.get(0, data);
if(data.tip1 < 150 || data.tip1 > 400) data.tip1 = 300;
if(data.tip2 < 200 || data.tip2 > 450) data.tip2 = 400;
if(data.sleep < 0 || data.sleep > 5) data.sleep = 0;
if(data.selected < 0 || data.selected > 1) data.selected = 0;
tip1_temp = data.tip1;
tip2_temp = data.tip2;
sleepMode = data.sleep;
selectedTip = data.selected;
setTemp = (selectedTip == 0) ? tip1_temp : tip2_temp;
}
// ===== SETUP =====
void setup()
{
pinMode(BTN_UP, INPUT_PULLUP);
pinMode(BTN_DOWN, INPUT_PULLUP);
pinMode(STBY_BTN, INPUT_PULLUP);
pinMode(BUZZER, OUTPUT);
pinMode(MOSFET, OUTPUT);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(1,4);
display.print("Diy Lab ");
display.setCursor(6,25);
display.print("Technology ");
display.setTextSize(1);
display.setCursor(10,50);
display.print("DLT iv 1.0");
display.display();
beep(100);
delay(400);
loadSettings(); // 🔥 EEPROM LOAD
lastActivity = millis();
}
// ===== LOOP =====
void loop()
{
currentTemp = readTemp();
// ===== STBY BUTTON =====
bool currentState = digitalRead(STBY_BTN);
standby = (currentState == LOW);
if(lastState == HIGH && currentState == LOW)
{
beep(60);
}
lastState = currentState;
// ===== STBY EXIT SAVE =====
if(lastStandby == true && standby == false)
{
saveSettings(); // 🔥 SAVE HERE
beep(80);
}
lastStandby = standby;
// ================= STBY MENU =================
if(standby)
{
digitalWrite(MOSFET, LOW);
display.clearDisplay();
display.setTextSize(3);
display.setCursor(43,30);
display.print("STBY");//STBY MENU
if(!digitalRead(BTN_UP))
{
delay(200);
beep(30);
if(menuIndex == 0)
{
tip1_temp += 10;
tip1_temp = constrain(tip1_temp,150,400);
selectedTip = 0;
setTemp = tip1_temp;
}
else if(menuIndex == 1)
{
tip2_temp += 10;
tip2_temp = constrain(tip2_temp,200,450);
selectedTip = 1;
setTemp = tip2_temp;
}
else if(menuIndex == 2)
{
sleepMode++;
if(sleepMode > 5) sleepMode = 0;
}
}
if(!digitalRead(BTN_DOWN))
{
delay(200);
beep(30);
menuIndex++;
if(menuIndex > 2) menuIndex = 0;
}
display.setTextSize(1);//new
display.setCursor(0,3);
display.print(menuIndex == 0 ? ">Tip1 " : " Tip1 ");
if(selectedTip == 0) display.print(menuIndex == 0 ? "**" : "ON");
display.setCursor(0,12);
display.print(menuIndex == 1 ? ">Tip2 " : " Tip2 ");
if(selectedTip == 1) display.print(menuIndex == 1 ? "**" : "ON");
display.setCursor(0,22);
display.print(menuIndex == 2 ? ">Sleep " : " Sleep ");
//display.setCursor(0,35);
//display.print("Temp:"); //abadoto use krbona
display.setTextSize(2);
display.setCursor(60,0);
display.print(selectedTip == 0 ? tip1_temp : tip2_temp);
display.setCursor(4,32);
if(sleepMode == 0) display.print("OFF");
if(sleepMode == 1) display.print("1m");
if(sleepMode == 2) display.print("3m");
if(sleepMode == 3) display.print("5m");
if(sleepMode == 4) display.print("7m");
if(sleepMode == 5) display.print("10m");
display.display();
return;
}
// ================= NORMAL BUTTON =================
if(!standby)
{
if(!digitalRead(BTN_UP))
{
delay(200);
beep(30);
lastActivity = millis();
if(selectedTip == 0)
{
tip1_temp += 10;
tip1_temp = constrain(tip1_temp,150,400);
setTemp = tip1_temp;
}
else
{
tip2_temp += 10;
tip2_temp = constrain(tip2_temp,200,450);
setTemp = tip2_temp;
}
}
if(!digitalRead(BTN_DOWN))
{
delay(200);
beep(30);
lastActivity = millis();
if(selectedTip == 0)
{
tip1_temp -= 10;
tip1_temp = constrain(tip1_temp,150,400);
setTemp = tip1_temp;
}
else
{
tip2_temp -= 10;
tip2_temp = constrain(tip2_temp,200,450);
setTemp = tip2_temp;
}
}
}
// ================= SLEEP =================
unsigned long now = millis();
unsigned long limit = 0;
if(sleepMode == 1) limit = 60000;
else if(sleepMode == 2) limit = 180000;
else if(sleepMode == 3) limit = 300000;
else if(sleepMode == 4) limit = 420000;
else if(sleepMode == 5) limit = 600000;
wakePressed = false;
static bool lastBtnState = HIGH;
bool currentBtnState = digitalRead(BTN_UP) && digitalRead(BTN_DOWN);
if(lastBtnState == HIGH && currentBtnState == LOW)
{
wakePressed = true;
lastActivity = millis();
}
lastBtnState = currentBtnState;
if(sleepMode != 0)
{
if(now - lastActivity > limit)
{
heaterOn = false;
}
if(wakePressed)
{
heaterOn = true;
}
}
// ================= PID =================
if(heaterOn)
{
int error = setTemp - currentTemp;
output = Kp * error;
output = constrain(output, 0, 255);
analogWrite(MOSFET, output);
}
else
{
analogWrite(MOSFET, 0);
}
// ================= DISPLAY =================
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0,0);
display.print("Set:");//ok
display.print(setTemp);
display.setTextSize(1);
display.setCursor(0,30);
display.print("Tip:");
display.print(selectedTip + 1);
display.setCursor(0,20);
display.print("Sleep:");
if(sleepMode == 0) display.print("OFF");
if(sleepMode == 1) display.print("1m");
if(sleepMode == 2) display.print("3m");
if(sleepMode == 3) display.print("5m");
if(sleepMode == 4) display.print("7m");
if(sleepMode == 5) display.print("10m");
display.setTextSize(4);
display.setCursor(50,28);
display.print(currentTemp);
if(!heaterOn)
{
display.setTextSize(1);
display.setCursor(0,40);
display.print("Sleeping");
}
display.display();
}