Сигнализация на Ардуино. Часть 1. Описываем базовый класс типового шлейфа.

Задумался я тут над тем, чтобы сделать на базе контроллера AVR универсальный прибор который контролировал бы шлейфы сигнализации, управлял релюшками, осуществлял функции контроля доступа и т.д. с возможностью связи по каналу GSM и Ethernet. Физическая реализация пока не определена. Будет ли это ардуино или еще какой-то вариант — я пока не знаю. Но экспериментировать буду на Ардуино Уно или Мега, если нужно будет больше памяти. Описывать что такое ардуино смысла большого нет, т.к. в сети уже столько всего написано что читать- не перечитать.

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

У базового шлейфа будет 6 свойств :

  • _normal  Значение АЦП норма
  • _alarm   Значение АЦП при котором шлейф переходит в состояние тревога
  • _gist  Значение гистерезиса для учета допустимых колебаний напряжения
  • _oc  Значение АЦП  менее которого обрыв в шлейфе
  • _sc  Значение АЦП более которого короткое замыкание в шлейфе
  • _controlpin  Номер пина для анализа

Все они будут в секции Private. Для возможности их изменения и чтения в секции Public мы создадим соответствующие методы. Так же определим и реализуем еще два базовых метода:

  • LoopState() будет возвращать целое восьмибитовое число. Это будет код состояния шлейфа:
    • 0 — тревога
    • 1 — норма
    • 2 — короткое
    • 3 — обрыв
    • 4 — промежуточное состояние
  • GetADC() будет возвращать целое восьмибитовое число. Это будет значение АЦП на контролируемом пине.

Итак описываем класс, определяем свойства и методы:

  1.  class SignalLoop {
  2.  private:
  3.     int16_t _normal; // Значение АЦП норма
  4.     int16_t _alarm;  // Значение АЦП сработка 
  5.     int16_t _gist;   // Значение гистерезиса
  6.     int16_t _oc;   // Значение менее которого обрыв
  7.     int16_t _sc;  // Значение более которого короткое
  8.     int8_t _controlpin; // пин для анализа
  9.  public:
  10.     SignalLoop // конструктор 
  11.     (
  12.         int16_t normal, 
  13.         int16_t alarm,  
  14.         int16_t gist,   
  15.         int16_t oc,  
  16.         int16_t sc,  
  17.         int8_t controlpin 
  18.     );
  19.     // ---set-get методы для доступа к свойствам из других классов 
  20.     void setNormal (int16_t val);
  21.     void setAlarm (int16_t val);
  22.     void setGist (int16_t val);
  23.     void setOC (int16_t val);
  24.     void setSC (int16_t val);
  25.     void setControlPin (int8_t val);
  26.  
  27.     int16_t getNormal();
  28.     int16_t getAlarm();
  29.     int16_t getGist();
  30.     int16_t getOC();
  31.     int16_t getSC();
  32.     int8_t getControlPin();
  33.     // set-get методы для доступа к свойствам из других классов---
  34.  
  35.     int8_t LoopState();
  36.     int8_t GetADC();
  37.   };

Теперь описываем реализацию методов и конструктор:

  1. // ---конструктор
  2. SignalLoop::SignalLoop
  3. (
  4.   int16_t normal, 
  5.   int16_t alarm,   
  6.   int16_t gist,   
  7.   int16_t oc,  
  8.   int16_t sc,  
  9.   int8_t controlpin 
  10. ){
  11.   _normal=normal; 
  12.   _alarm=alarm;   
  13.   _gist=gist; 
  14.   _oc=oc;
  15.   _sc=sc; 
  16.   _controlpin=controlpin;        
  17. };
  18. // конструктор---
  19.  // ---set-get методы для доступа к свойствам из других классов
  20. void SignalLoop::setNormal (int16_t val){_normal = val;};
  21. void SignalLoop::setAlarm (int16_t val){_alarm = val;};
  22. void SignalLoop::setGist (int16_t val){_gist = val;};
  23. void SignalLoop::setOC (int16_t val){_oc = val;};
  24. void SignalLoop::setSC (int16_t val){_sc = val;};
  25. void SignalLoop::setControlPin (int8_t val){_controlpin = val;};
  26.  
  27. int16_t SignalLoop::getNormal()  {return _normal;};
  28. int16_t SignalLoop::getAlarm()  {return _alarm;};
  29. int16_t SignalLoop::getGist()  {return _gist;};
  30. int16_t SignalLoop::getOC()  {return _oc;};
  31. int16_t SignalLoop::getSC()  {return _sc;};
  32. int8_t SignalLoop::getControlPin()  {return _controlpin;};
  33. // set-get методы для доступа к свойствам из других классов---
  34. // --- базовые методы класса
  35. int8_t SignalLoop::LoopState(){
  36.        int16_t value = analogRead(_controlpin);                                         // инициализируем пин на вход
  37.        if (((_normal - _gist) <= value) && (value <= (_normal + _gist))) {return 1;}    // шлейф в норме
  38.        else if (((_alarm - _gist) <= value) && (value <= (_alarm + _gist))) {return 0;} // сработка шлейфа
  39.        else if ( _sc <= value) {return 2;}                                              // короткое
  40.        else if (value <= _oc) {return 3;}                                               // обрыв
  41.        else return 4;                                                                  // промежуточное состояние
  42.   }
  43.  
  44. int8_t SignalLoop::GetADC (){
  45.    return(analogRead(_controlpin));
  46.   };
  47. // базовые методы класса---
  48.  
  49. void setup(){}
  50. void loop(){}

SignalLoop.ino

Описание класса SignalLoop.

Для проверки компиляции добавлены setup и loop.


На этом первую часть эпоса под названием Супер универсальный охранно-пожарно-СКД-GSM-Ethernet и т.д. прибор можно закончить. Продолжение обязательно будет.
Задавайте вопросы в комментариях.

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

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *