РЕЛЕЙНЫЙ РЕГУЛЯТОР НА ARDUINO

Сразу поясню – это библиотека не для модулей реле (им не нужны библиотеки), это библиотека для релейного регулятора, т.е. реализация релейного закона регулирования с гистерезисом и обратной связью по скорости изменения величины через коэффициент усиления. Что позволяет делать релейный регулятор:

  • Управлять какой-то величиной, включая и выключая орган управления (температура – обогреватель или холодильник, влажность – увлажнитель, и так далее)
  • Гистерезис – “окно” вокруг установленного значения, чтобы уменьшить количество включений/выключений реле (управляющего устройства)
  • Обратная связь (ОС) по изменению – в библиотеку встроено автоматическое вычисление производной измеряемой величины. Подобрав коэффициент усиления ОС можно добиться максимальной стабильности и точности удержания заданной величины: обратная связь по изменению позволяет отключать управляющее устройство до перехода через заданную величину снизу, и заранее включать при приближении к ней сверху
  • Выбор направления регулирования

БИБЛИОТЕКА GYVERRELAY

Библиотека классического релейного регулятора для Arduino

  • Обратная связь по скорости изменения величины
  • Настройка гистерезиса, коэффициента усиления ОС, направления регулирования
  • Возвращает результат по встроенному таймеру или в ручном режиме

Поддерживаемые платформы: все Arduino (используются стандартные Wiring-функции)

ДОКУМЕНТАЦИЯ


// принимает установку, ширину гистерезиса, направление (NORMAL, REVERSE)
// NORMAL - включаем нагрузку при переходе через значение снизу (пример: охлаждение)
// REVERSE - включаем нагрузку при переходе через значение сверху (пример: нагрев)
GyverRelay(float new_setpoint, float new_hysteresis, boolean direction);
GyverRelay();

// расчёт возвращает состояние для управляющего устройства (реле, транзистор) (1 вкл, 0 выкл)
boolean getResult();                        // расчёт
boolean getResult(float new_input);         // расчёт, принимает текущую величину с датчика
boolean getResultTimer();                   // расчёт по встроенному таймеру
boolean getResultTimer(float new_input);    // расчёт, принимает текущую величину с датчика (+ по встроенному таймеру)
 
void setDirection(boolean);                 // направление регулирования (NORMAL, REVERSE)
 
float input;                        // сигнал с датчика (например температура, которую мы регулируем)
float setpoint;                     // заданная величина, которую должен поддерживать регулятор (температура)
 
float signal;                       // сигнал (для отладки)
float hysteresis;                   // ширина гистерезиса (половина в минус, половина в плюс)
float k = 0;                        // коэффициент усиления	по скорости (по умолч. 0)
float rate;                         // скорость изменения величины (производная)
int16_t sampleTime = 1000;          // время итерации, мс (по умолч. секунда)

ПРИМЕРЫ


/*
   Пример работы релейного регулятора в автоматическом режиме по встроенному таймеру
   Давайте представим, что на 3 пине у нас спираль нагрева, подключенная через реле
   И есть какой то абстрактный датчик температуры, на который влияет спираль
*/
#include "GyverRelay.h"

// установка, гистерезис, направление регулирования
GyverRelay regulator(50, 5, REVERSE);  // 50 градусов, гистерезис 2,5 в обе стороны, направление на нагрев

void setup() {
  pinMode(3, OUTPUT);
}

void loop() {
  int temp;                 // читаем с датчика температуру
  regulator.input = temp;   // сообщаем регулятору текущую температуру

  // getResult возвращает значение для управляющего устройства
  digitalWrite(3, regulator.getResult());  // отправляем на реле
}

ОСТАЛЬНЫЕ БИБЛИОТЕКИ

У меня есть ещё очень много всего интересного! Смотрите полный список библиотек вот здесь.