GyverRelay - библиотека классического релейного регулятора для Arduino
- Обратная связь по скорости изменения величины
- Настройка гистерезиса, коэффициента усиления ОС, направления регулирования
- Возвращает результат по встроенному таймеру или в ручном режиме
Совместима со всеми Arduino платформами (используются Arduino-функции)
К библиотеке есть расширенная документация
- Библиотеку можно найти по названию GyverRelay и установить через менеджер библиотек в:
- Arduino IDE
- Arduino IDE v2
- PlatformIO
- Скачать библиотеку .zip архивом для ручной установки:
- Распаковать и положить в C:\Program Files (x86)\Arduino\libraries (Windows x64)
- Распаковать и положить в C:\Program Files\Arduino\libraries (Windows x32)
- Распаковать и положить в Документы/Arduino/libraries/
- (Arduino IDE) автоматическая установка из .zip: Скетч/Подключить библиотеку/Добавить .ZIP библиотеку… и указать скачанный архив
- Читай более подробную инструкцию по установке библиотек здесь
- Рекомендую всегда обновлять библиотеку: в новых версиях исправляются ошибки и баги, а также проводится оптимизация и добавляются новые фичи
- Через менеджер библиотек IDE: найти библиотеку как при установке и нажать "Обновить"
- Вручную: удалить папку со старой версией, а затем положить на её место новую. "Замену" делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам!
GyverRelay regulator;
GyverRelay regulator(mode); // mode: NORMAL / REVERSE
// расчёт возвращает состояние для управляющего устройства (реле, транзистор) (1 вкл, 0 выкл)
boolean compute(float dt = 0); // моментальный расчёт. Принимает dt в секундах для режима с ОС
boolean getResult(); // моментальный расчёт. Встроенный таймер для режима с ОС
boolean getResultTimer(); // расчёт по встроенному таймеру
void setDirection(boolean dir); // направление регулирования (NORMAL, REVERSE)
float input = 0; // сигнал с датчика (например температура, которую мы регулируем)
float setpoint = 0; // заданная величина, которую должен поддерживать регулятор (температура)
bool output = 0; // выход регулятора (0 или 1)
float hysteresis = 0; // ширина окна гистерезиса
float k = 0; // коэффициент усиления по скорости (по умолч. 0)
int16_t dT = 1000; // время итерации, мс (по умолч. секунда)
Остальные примеры смотри в examples!
/*
Пример работы релейного регулятора в автоматическом режиме по встроенному таймеру
Давайте представим, что на 3 пине у нас спираль нагрева, подключенная через реле
И есть какой то абстрактный датчик температуры, на который влияет спираль
*/
#include "GyverRelay.h"
// установка, гистерезис, направление регулирования
GyverRelay regulator(REVERSE);
// либо GyverRelay regulator(); без указания направления (будет REVERSE)
void setup() {
pinMode(3, OUTPUT); // пин реле
regulator.setpoint = 40; // установка (ставим на 40 градусов)
regulator.hysteresis = 5; // ширина гистерезиса
regulator.k = 0.5; // коэффициент обратной связи (подбирается по факту)
//regulator.dT = 500; // установить время итерации для getResultTimer
}
// вариант с delay
void loop() {
int temp; // например читаем с датчика температуру
regulator.input = temp; // сообщаем регулятору текущую температуру
// getResult возвращает значение для управляющего устройства
digitalWrite(3, regulator.getResult()); // отправляем на реле (ОС работает по своему таймеру)
delay(100);
}
/*
// вариант со встроенным таймером
void loop() {
int temp; // например читаем с датчика температуру
regulator.input = temp; // сообщаем регулятору текущую температуру
// getResult возвращает значение для управляющего устройства
digitalWrite(3, regulator.getResultTimer()); // отправляем на реле
// также можно получить значение с выхода регулятора
// regulator
}
*/
/*
// вариант со своим таймером
void loop() {
static uint32_t myTimer = 0;
if (millis() - myTimer > 2000) { // свой таймер на миллис, 2 секунды
myTimer = millis();
int temp; // например читаем с датчика температуру
regulator.input = temp; // сообщаем регулятору текущую температуру
// getResult возвращает значение для управляющего устройства
digitalWrite(3, regulator.compute(2)); // отправляем на реле. Время передаём вручную, у нас 2 секунды
}
}
*/
- v2.1 - исправлена getResultTimer
- v2.2 - улучшен и упрощён алгоритм
При нахождении багов создавайте Issue, а лучше сразу пишите на почту alex@alexgyver.ru
Библиотека открыта для доработки и ваших Pull Request'ов!
При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать:
- Версия библиотеки
- Какой используется МК
- Версия SDK (для ESP)
- Версия Arduino IDE
- Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде
- Какой код загружался, какая работа от него ожидалась и как он работает в реальности
- В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код