#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <PID_v1.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define tempSensor A0
#define iron 10
#define LED 9
const int pinCLK = 2;
const int pinDT = 3;
const int pinSW = 4;
bool IronState = false;
int minTemp = 27;
int maxTemp = 525;
int minADC = 252;
int maxADC = 751;
int currentTemp = 0;
int Temp = 0;
int lcdInterval = 500;
int previousMillis = 0;
volatile int setTemp = 0;
int currentStateCLK;
int lastStateCLK;
unsigned long lastButtonPress = 0;
double Setpoint, Input, Output;
double Kp = 2.5, Ki = 0.01, Kd = 0.02;
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
void setup() {
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.display();
delay(2000);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("D@niel Prodution Inc");
display.display();
delay(3000);
display.clearDisplay();
pinMode(pinCLK, INPUT);
pinMode(pinDT, INPUT);
pinMode(pinSW, INPUT_PULLUP);
pinMode(tempSensor, INPUT);
pinMode(iron, OUTPUT);
pinMode(LED, OUTPUT);
setTemp = 350;
display.setCursor(0, 10);
display.print("OFF");
display.display();
myPID.SetMode(AUTOMATIC);
myPID.SetOutputLimits(0, 255);
attachInterrupt(digitalPinToInterrupt(pinCLK), updateEncoder, CHANGE);
lastStateCLK = digitalRead(pinCLK);
}
void loop() {
int buttonState = digitalRead(pinSW);
currentTemp = map(analogRead(tempSensor), minADC, maxADC, minTemp, maxTemp);
Input = currentTemp;
Setpoint = setTemp;
Temp = currentTemp;
display.setCursor(0, 10);
display.setTextSize(2);
display.print("SET :");
display.print(setTemp);
display.print((char)223);
display.print("C ");
display.setTextSize(1);
display.display();
myPID.Compute();
myPID.SetTunings(Kp, Ki, Kd);
if (IronState == LOW) {Output = 0; }
if (setTemp > 525) { setTemp = 525; }
if (setTemp < 35) { setTemp = 35; }
analogWrite(iron, Output);
analogWrite(LED, Output);
if (buttonState == LOW) {
if (millis() - lastButtonPress > 300) {
IronState = !IronState;
digitalWrite(iron, IronState ? HIGH : LOW);
display.setCursor(0, 10);
if (IronState == LOW) {
display.clearDisplay();
display.display();
display.print("OFF");
}
if (IronState == HIGH) {
display.clearDisplay();
display.display();
display.print("ON ");
}
lastButtonPress = millis();
}
}
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= lcdInterval){
previousMillis = currentMillis;
display.clearDisplay();
display.display();
display.setCursor(0, 20);
display.print("Ferro:");
display.print(Temp);
display.print((char)248);
display.print("C ");
display.setCursor(0, 20);
if (IronState == HIGH) {display.print("ON ");}
if (IronState == LOW) {display.print("OFF");}
}
}
void updateEncoder() {
currentStateCLK = digitalRead(pinCLK);
if (currentStateCLK != lastStateCLK && currentStateCLK == HIGH) {
int currentStateDT = digitalRead(pinDT);
if (currentStateDT != currentStateCLK) {
setTemp++;
} else {
setTemp--;
}
}
lastStateCLK = currentStateCLK;
}