Частое включение и выключение в SSR

Я работаю над проектом термопары Arduino OLED MAX6675 и твердотельного реле для моей духовки. Моя проблема в том, что когда мой SSR переходит в состояние НИЗКИЙ или ВЫСОКИЙ, он включается и выключается несколько раз, прежде чем перейти в постоянное состояние ВЫСОКИЙ или НИЗКИЙ. Из-за этого моя нагрузка (нагреватель) включается и выключается много раз. Поскольку температура пересекает заданное значение и изменяет состояние выхода, температура процесса будет быстро меняться, переходя от нижнего заданного значения к верхнему и обратно ниже. Такое частое включение-выключение приведет к повреждению моего твердотельного реле и обогревателя. Мой вопрос. Есть ли какое-либо аппаратное или программное решение. Чтобы уменьшить частоту включения-выключения. Я не могу увеличить время задержки(), потому что это замедляет ввод кнопки. Мои коды ниже.

#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include "max6675.h"

//олед
// oled-адреса i2c
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(-1);
// дисплей 128 x 64 пикселей
#define SSD1306_LCDHEIGHT 64

//MAX6675
//Инициализация вывода
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;

//Кнопка
int button_up = 7;
int button_down = 8;
int button_upv;
int button_downv;

//ССР
int ssr_u = 10;
int ssr_d = 12;

void setup() {
    Wire.begin();
    delay(1000);

    // инициализируем и очищаем дисплей
    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);

    //Кнопка
    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);

    //кнопка
    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();

    //ССР
    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);
    }
}

Заранее благодарим за помощь

, 👍1

Обсуждение

Какую плату Arduino вы используете? Вы используете плату Arduino с напряжением 3,3 В и поддельную твердотельную пластину? Объясните пожалуйста получше, что у вас стоит и как оно питается. Погуглите гистерезис. Вам нужно добавить в эскиз некоторый гистерезис., @Jot

Я использую SSR Pro Mini на 5 В и 40 А., @Himanshu

ключевое слово - гистерезис http://forum.arduino.cc/index.php?topic=526806.0, @Juraj

Есть ли какое-либо аппаратное решение, например, добавление конденсатора, чтобы напряжение оставалось постоянным в течение нескольких секунд?, @Himanshu

Гистерезис будет намного проще в программном обеспечении., @Edgar Bonet


1 ответ


Лучший ответ:

7

Вам необходимо реализовать гистерезис. Установите две температурные точки вокруг set_temp. Один немного выше, чтобы обозначать предел для выключения нагревателя, и один немного ниже, чем set_temp, чтобы включить нагреватель.

Вам нужно только немного изменить условие if else

if (current_temp < set_temp - HYST_VALUE) {
  digitalWrite(ssr_u, HIGH);
} else if (current_temp > set_temp + HYST_VALUE) {
  digitalWrite(ssr_u, LOW);
}

с чего можно начать

int const HYST_VALUE = 1;
,

Есть ли какое-либо аппаратное решение, например, добавление конденсатора, чтобы напряжение оставалось постоянным в течение нескольких секунд?, @Himanshu

это проблема регулирования, которую невозможно решить аппаратно. температура может долгое время колебаться вокруг заданной температуры. реализация гистерезиса реализована во всех термостатах, @Juraj

я отредактировал ответ, @Juraj

Привет, Юрай, я попробовал то же самое, что и ты сказал, но где-то этот цикл заморозки кода. Я где-то делаю что-то не так, пожалуйста, помогите. Я попробовал тот же код., @Himanshu

Привет, Юрай. Я тоже меняю свой эскиз, пожалуйста, проверьте его., @Himanshu

у вас есть < дважды и это } else if (, @Juraj

Давайте [продолжим обсуждение в чате](https://chat.stackexchange.com/rooms/83681/discussion-between-himanshu-and-juraj)., @Himanshu