Библиотека для управления реле на Ардуино. 7 программ работы реле без delay().

Библиотека предназначена для управления любыми устройствами основанными на изменении состояния входа: реле, светодиоды, пьезоэлектрические источники звука и т.д. В библиотеке реализовано 7 программ управления реле:

  • включить реле
  • выключить реле
  • включить реле на время
  • выключить реле на время
  • мигать по маске с заданной длительностью импульса
  • пищать при использовании пьезоэлектрического источника звука по маске с заданной длительностью импульса и частотой
  • переключить реле

Все программы использующие временные задержки реализованы с помощью моей библиотеки Timer без использования функции delay(), ссылка нее будет внизу страницы.

Скачать библиотеку для управления реле на Ардуино.

Описание библиотеки можно посмотреть здесь:Библиотека для управления реле на Ардуино. 7 программ работы реле без delay().

Текущая версия: 0.0.4 / 2019.09.09
Предыдущие версии:
0.0.2 / 2018.03.02
0.0.3 / 2018.11.05

Size: 7 KB
Version: 0.0.4
Published: 09.09.2019


При подключении библиотеки в скетче появляется возможность создавать объекты класса Relay. Каждый созданный объект по-сути является самостоятельным реле. Номера программ для управления реле следующие:

  1. /** [relayProgram]
  2.     * 0 - выключить реле
  3.     * 1 - выключить реле на время, затем включить
  4.     * 2 - включить реле
  5.     * 3 - включить реле на время, затем выключить
  6.     * 4 - мигать по маске
  7.     * 5 - пищать по маске
  8.     * 6 - переключить реле
  9.     */

Для создания экземпляров класса используется 4 конструктора.
Самый простой принимает всего 2 аргумента:

  1. Relay(uint8_t pin, uint8_t relayProgram);
  2. // pin - номер пина, которым мы будем управлять
  3. // relayProgram - номер программы

Данный конструктор подходит для программ 0, 2 и 6.
Конструктор для программ 1 и 3 имеет следующий вид:

  1. Relay(uint8_t pin, uint8_t relayProgram, uint32_t time);
  2. // pin - номер пина, которым мы будем управлять
  3. // relayProgram - номер программы
  4. // time - время в мс на которое включается или выключается реле

Для мигания по маске, программа 4, используем следующий конструктор:

  1. Relay(uint8_t pin, uint8_t relayProgram, uint32_t pattern, uint32_t interval);
  2. // pin - номер пина, которым мы будем управлять
  3. // relayProgram - номер программы
  4. // pattern - маска мигания
  5. // interval- время длительности 1 импульса в маске.

Для того чтобы извлекать звуки из пассивной пьезопищалки с помощью программы 5, используем конструктор с самым большим числом параметров:

  1. Relay(uint8_t pin, uint8_t relayProgram, uint32_t pattern, uint32_t interval, uint16_t frequency);
  2. // pin - номер пина, которым мы будем управлять
  3. // relayProgram - номер программы
  4. // pattern - маска мигания
  5. // interval- время длительности 1 импульса в маске
  6. // frequency - частота сигнала

В принципе, можно использовать только первый конструктор, а остальные свойства добить сеттерами.

Не считая сеттеров и геттеров класс содержит следующие доступные методы:

  1. void start();  /*Запускает программу реле. Для остановки выполнения программ 4 и 5 испльзуется метод stop()*/
  2. void stop();   /*Останавливает любую запущенную программу реле и устанавливает реле в исходное состояние*/
  3. void loop();   /*Данный метод должен крутиться в цикле loop{} скетча*/
  4. relayState getState(); /*Возвращает состояние реле, см. relayState*/

Обратите внимание, что тип возвращаемого значения метода getState() — тип данных ENUM, с именем relayState. Я использовал его для того, чтобы код был более читабельным.

  1. enum relayState {
  2. ON,//реле включено
  3. OFF,//реле выключено 
  4. ON_TIME,//реле включено на время 
  5. ON_TIME_END,//время включения реле истекло, реле выключено 
  6. OFF_TIME,//реле выключено на время 
  7. OFF_TIME_END,//время выключения реле истекло, реле включено 
  8. BLINK,//мигание реле 
  9. BUZZER//баззер реле
  10. };

Обратиться к данным значениям из скетча можно через оператор доступа ::
Пример:

  1. #include <Relay.h> // подключаем библиотеку
  2. Relay rele(4, 0); // создаем реле на 4м пине с программой 0
  3. void setup() {
  4.   Serial.begin(9600);
  5.   if (rele.getState() == Relay::relayState::OFF) Serial.println(F("OFF"));
  6.   else Serial.println(F("ON"));
  7. }
  8. void loop() {}

Сеттеры-геттеры:

  1. void setPin(uint8_t pin);            /*Устанавливает пин управления реле*/
  2. void setTime(uint32_t time);         /*Устанавливает время управления реле для программ 1 и 3*/
  3. void setPattern(uint32_t pattern);   /*Устанавливает маску мигания для программ 4 и 5*/
  4. void setInterval(uint32_t interval); /*Устанавливает время длительности 1 импульса в маске мигания для программ 4 и 5*/
  5. void setFrequency (uint16_t frequency); /*Устанавливает частоту сигнала для программы 5*/
  6. void setRelayProgram (uint8_t relayProgram);  /*Устанавливает тип программы управления реле*/

Теперь о том, как создавать маску для мигания реле или для баззера.


ВНИМАНИЕ! «воспроизведение» идет справа налево и крайним левым значением в вашей маске должна быть единица!


Для примера будем использовать сигнал «SOS». Как известно, данный сигнал передается следующим образом «…—…». Методом setInterval() или через конструктор мы задаем длительность одного импульса. Сделаем так, чтобы точки и паузы были по 1 импульсу, а тире и паузы между буквами по 2. Получаем в бинарной последовательности следующую строку: 1010100110110110010101. Теперь добавим паузу в 4 импульса для паузы в передаче. Вот что получилось: 10101001101101100101010000. Далее, не забывая что у нас длина маски 32 разряда (т.е. все что до левой единицы забывается нулями), делим на квартеты и переводим в 16тиричную систему:
0000.0010.1010.0110.1101.1001.0101.0000 = 0x02A6D950
Если у вас возникают сложности — воспользуйтесь конвертером, коих в сети достаточно.
Вот, собственно мы и получили маску для сигнала SOS, которую мы передаем в конструкторе или устанавливаем с помощью метода setPattern().


Ниже приведен тестовый скетч для управления реле в ардуино. В нем мы создаем 4 реле под разные программы и управляем ими через интерфейс RS-232 (com port).


Внимание! С программой 5 (баззер) одновременно может работать только одно реле (один пин). Если вы создадите несколько таких реле — запускайте их по очереди. Так же для ардуино УНО лучше не использовать для этих целей ШИМ выходы : 3 и 11 пины.


  1. #include <Relay.h> //подключаем библиотеку
  2. Relay rele1(4, 0); // создаем реле 1 с программой 0 на 4 пине
  3. Relay rele2(5, 1, 2000); // создаем реле 2 с программой 1 и временем управления 2 сек на 5 пине
  4. Relay rele3(6, 4, 0x02A6D950, 150); // создаем реле 3 с программой 4, маской SOS и длительностью импульса 150 мс на 6 пине 
  5. Relay rele4(7, 5, 0x02A6D950, 120, 2000); // создаем реле 4 с программой 5, маской SOS, длительностью импульса 150 мс и частотой 2кГц на 7 пине.
  6. void setup() {
  7.   Serial.begin(9600); // инициализируем соединение по RS-232
  8. }
  9. void loop() {
  10.   rele1.loop(); // обработчик реле 1
  11.   rele2.loop(); // обработчик реле 2
  12.   rele3.loop(); // обработчик реле 3
  13.   rele4.loop(); // обработчик реле 4
  14.   test();  
  15. }
  16. void test() {
  17.   if (Serial.available()) {
  18.     byte symbol = Serial.read();
  19.     switch (symbol){
  20.       case '0' : // если пришел символ 0
  21.         rele1.setRelayProgram(0); // устанавливаем для реле 1 программу 0
  22.       break;
  23.       case '1' : // если пришел символ 1
  24.         rele1.setRelayProgram(2); // устанавливаем для реле 1 программу 2
  25.       break;
  26.       case '2' : // если пришел символ 2
  27.         rele1.setRelayProgram(6); // устанавливаем для реле 1 программу 6
  28.       break;
  29.       case '3' : // если пришел символ 3
  30.         rele2.setRelayProgram(1); // устанавливаем для реле 2 программу 1
  31.       break;
  32.       case '4' : // если пришел символ 4
  33.         rele2.setRelayProgram(3); // устанавливаем для реле 2 программу 3
  34.       break;
  35.       case '5' : // если пришел символ 5
  36.         rele1.start(); // запускаем 1 реле
  37.       break;
  38.       case '6' : // если пришел символ 6
  39.         rele2.start(); // запускаем 2 реле
  40.       break;
  41.       case '7' : // если пришел символ 7
  42.         rele3.start(); // запускаем 3 реле
  43.       break;
  44.       case '8' : // если пришел символ 8
  45.         rele4.start(); // запускаем 4 реле
  46.       break;
  47.       case '9' : // если пришел символ 9
  48.         rele1.stop(); // останавливаем и возвращаем в исходное состояние реле 1
  49.         rele2.stop(); // останавливаем и возвращаем в исходное состояние реле 2
  50.         rele3.stop(); // останавливаем и возвращаем в исходное состояние реле 3
  51.         rele4.stop(); // останавливаем и возвращаем в исходное состояние реле 4
  52.       break;
  53.       default :
  54.       break;
  55.     }
  56.   }
  57. }

На этом все. Пользуйтесь на здоровье.
[poll id=»8″]
Связанные статьи:
Ардуино. Задержка без delay() с помощью millis(). Библиотека Timer.

Оцените пожалуйста статью:

ПечальноТак себеНе плохоХорошоОтличная статья! 2 оценок.
Загрузка...

Добавить комментарий