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

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

Подход к программированию будет объектно-ориентированный, т.е. ООП.

В данной публикации мы опишем базовый класс типового шлейфа, на базе которого в дальнейшем будут реализовываться различные типы шлейфов. Имя класса : SignalLoop.

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

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

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

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

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

  1. class SignalLoop {
  2.  protected:
  3. 	uint8_t _loopid;   // номер шлейфа
  4. 	uint8_t _looptype;  // 0- по умолчанию
  5. 	uint8_t _sectionnumber; // номер раздела к которому принадлежит шлейф
  6.     int16_t _normal; // Значение АЦП норма
  7.     int16_t _alarm;  // Значение АЦП сработка 
  8.     int16_t _gist;   // Значение гистерезиса
  9.     int16_t _oc;   // Значение менее которого обрыв
  10.     int16_t _sc;  // Значение более которого короткое
  11.     int8_t _controlpin; // пин для анализа
  12.  public:
  13.     SignalLoop // конструктор 
  14.     (
  15. 		uint8_t loopid,
  16. 		uint8_t sectionnumber,
  17.         int16_t normal, 
  18.         int16_t alarm,  
  19.         int16_t gist,   
  20.         int16_t oc,  
  21.         int16_t sc,  
  22.         int8_t controlpin 
  23.     );
  24.     // ---set-get методы для доступа к свойствам из других классов  
  25. //  void setLoopId (uint8_t val);
  26. //	void setLoopType (uint8_t val);
  27. //	void setSectionNumber (uint8_t val);
  28. //	void setNormal (int16_t val);
  29. //  void setAlarm (int16_t val);
  30. //  void setGist (int16_t val);
  31. //  void setOC (int16_t val);
  32. //  void setSC (int16_t val);
  33. //  void setControlPin (int8_t val);
  34.  
  35. uint8_t getLoopId();
  36. uint8_t getLoopType();
  37. uint8_t getSectionNumber();
  38. int16_t getNormal();
  39. int16_t getAlarm();
  40. int16_t getGist();
  41. int16_t getOC();
  42. int16_t getSC();
  43. int8_t getControlPin();
  44.     // set-get методы для доступа к свойствам из других классов--->
  45.  
  46. int8_t LoopState();
  47. int16_t GetADC();
  48.   };
  49. // <<<конструктор
  50. SignalLoop::SignalLoop
  51. (
  52. 	uint8_t loopid    
  53. 	,uint8_t sectionnumber 
  54. 	,int16_t normal 
  55. 	,int16_t alarm   
  56. 	,int16_t gist   
  57. 	,int16_t oc 
  58. 	,int16_t sc  
  59. 	,int8_t controlpin 
  60. ){
  61. 	_loopid=loopid;
  62. 	_sectionnumber=sectionnumber;
  63. 	_normal=normal; 
  64. 	_alarm=alarm;   
  65. 	_gist=gist; 
  66. 	_oc=oc;
  67. 	_sc=sc; 
  68. 	_controlpin=controlpin;
  69. 	_looptype=0;
  70. };
  71. // конструктор>>>
  72.  // <<<set-get методы для доступа к свойствам из других классов
  73. //void SignalLoop::setLoopId (uint8_t val){_loopid = val;};
  74. //void SignalLoop::setLoopType (uint8_t val){_looptype = val;};
  75. //void SignalLoop::setSectionNumber (uint8_t val){_sectionnumber = val;};
  76. //void SignalLoop::setNormal (int16_t val){_normal = val;};
  77. //void SignalLoop::setAlarm (int16_t val){_alarm = val;};
  78. //void SignalLoop::setGist (int16_t val){_gist = val;};
  79. //void SignalLoop::setOC (int16_t val){_oc = val;};
  80. //void SignalLoop::setSC (int16_t val){_sc = val;};
  81. //void SignalLoop::setControlPin (int8_t val){_controlpin = val;};
  82.  
  83. uint8_t SignalLoop::getLoopId() {return _loopid;};
  84. uint8_t SignalLoop::getLoopType() {return _looptype;};
  85. uint8_t SignalLoop::getSectionNumber() {return _sectionnumber;};
  86. int16_t SignalLoop::getNormal()  {return _normal;};
  87. int16_t SignalLoop::getAlarm()  {return _alarm;};
  88. int16_t SignalLoop::getGist()  {return _gist;};
  89. int16_t SignalLoop::getOC()  {return _oc;};
  90. int16_t SignalLoop::getSC()  {return _sc;};
  91. int8_t SignalLoop::getControlPin()  {return _controlpin;};
  92. // set-get методы для доступа к свойствам из других классов>>>
  93. // <<< базовые методы класса
  94. int8_t SignalLoop::LoopState(){
  95. int16_t value = GetADC ();                                                           // считываем значение АЦП
  96. 	if (((_normal - _gist) <= value) && (value <= (_normal + _gist))) {return 1;}    // шлейф в норме
  97. 	else if (((_alarm - _gist) <= value) && (value <= (_alarm + _gist))) {return 0;} // сработка шлейфа
  98. 	else if ( _sc <= value) {return 2;}                                              // короткое
  99. 	else if (value <= _oc) {return 3;}                                               // обрыв
  100. 	else return 4;                                                                  // промежуточное состояние
  101. }
  102.  
  103. int16_t SignalLoop::GetADC (){
  104. 	return(analogRead(_controlpin));
  105.   };
  106. // базовые методы класса

Все классы, которые будут касаться этой темы я буду добавлять в библиотеку, в ней есть подробное описание свойств и методов, так же есть файл keywords.txt, в котором указаны методы для подсветки в ARDUINO IDE. Библиотека, я надеюсь, будет периодически обновляться. В описании к загрузке я буду указывать дату последней и предпоследней версий для возможности отслеживания.

Библиотека Loop. Сигнализация на ардуино.
  • Версия: 1.01
  • Дата предпоследнего обновления: -.
  • Дата последнего обновления: 2018.03.02.

Классы:
SignalLoop: базовый класс, типовой шлейф
Smoke1Loop: наследник SignalLoop, дымовой шлейф со сбросом питания


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

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

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

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

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