Частое включение и выключение в 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);
}
}
Заранее благодарим за помощь
@Himanshu, 👍1
Обсуждение1 ответ
Лучший ответ:
Вам необходимо реализовать гистерезис. Установите две температурные точки вокруг 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
- Зависание Arduino с OLED-дисплеем
- Считывание 10-контактного 7-сегментного (2 цифры) сингла Arduino 1
- Воспроизведение смоделированных температурных данных с помощью Arduino
- Как выполнять многозадачность с помощью arduino, например, обновлять данные, а также проверять состояние?
- Ошибка при попытке динамического моделирования температуры
- Как заставить 5-вольтовое реле работать с NodeMCU
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
Какую плату Arduino вы используете? Вы используете плату Arduino с напряжением 3,3 В и поддельную твердотельную пластину? Объясните пожалуйста получше, что у вас стоит и как оно питается. Погуглите гистерезис. Вам нужно добавить в эскиз некоторый гистерезис., @Jot
Я использую SSR Pro Mini на 5 В и 40 А., @Himanshu
ключевое слово - гистерезис http://forum.arduino.cc/index.php?topic=526806.0, @Juraj
Есть ли какое-либо аппаратное решение, например, добавление конденсатора, чтобы напряжение оставалось постоянным в течение нескольких секунд?, @Himanshu
Гистерезис будет намного проще в программном обеспечении., @Edgar Bonet