I am working on a project on Arduino OLED MAX6675 thermocouple and SSR for my oven. My problem is when my SSR goes in LOW or HIGH state it turn ON and OFF several times before going to permanent HIGH or LOW state. This make my load(Heater) on and off many times. Since the temperature crosses the set-point to change the output state, the process temperature will be cycling rapidly, going from below set-point to above, and back below. This frequent ON OFF will damage my SSR and heater. My Question. Is there any hardware or software solution. To reduce the frequency of ON OFF . I can’t increase the delay() time because it make my button input slow. My codes are below.
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include "max6675.h"
//oled
//oled i2c addresss
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(-1);
// 128 x 64 pixel display
#define SSD1306_LCDHEIGHT 64
//MAX6675
//Pin initialization
int so = 2;
int cs = 3;
int sck = 4;
MAX6675 thermocouple(sck, cs, so);
float current_temp;
int set_temp;
int const h_temp = 2;
//Button
int button_up = 7;
int button_down = 8;
int button_upv;
int button_downv;
//SSR
int ssr_u = 10;
int ssr_d = 12;
void setup() {
Wire.begin();
delay(1000);
// initialize and clear display
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(8, 20);
display.println("Welcome..");
display.display();
display.clearDisplay();
delay(1000);
//Button
pinMode(button_up, INPUT);
pinMode(button_down, INPUT);
set_temp = 20;
pinMode(ssr_u, OUTPUT);
pinMode(ssr_d, OUTPUT);
}
void loop() {
current_temp = thermocouple.readCelsius();
delay(100);
button_upv = digitalRead(button_up);
button_downv = digitalRead(button_down);
//button
if (button_upv == HIGH && set_temp < 180) {
set_temp = set_temp + 5;
}
if (button_downv == HIGH && set_temp > 20) {
set_temp = set_temp - 5;
}
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(5, 10);
display.println(current_temp);
display.setCursor(5, 30);
display.println(set_temp);
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(30, 40);
if (button_upv == HIGH) {
display.println("Up");
}
if (button_downv == HIGH) {
display.println("Down");
}
display.display();
//SSR
if (current_temp < set_temp - h_temp) {
digitalWrite(ssr_u, HIGH);
digitalWrite(ssr_d, HIGH);
delay(500);
}
if else(current_temp > set_temp + h_temp) {
digitalWrite(ssr_u, LOW);
digitalWrite(ssr_d, LOW);
delay(500);
}
}
Thanks in advance for help