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

Интересна ли Вам данная тема? Нужны ли видеоуроки или так все понятно?

Просмотреть результаты

Загрузка ... Загрузка ...

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

Итак, приступим.

Новый класс мы назовем Smoke1Loop и т.к. он является наследником класса SignalLoop часть свойств и методов мы будем использовать из родителя.

Дымовой шлейф будет использовать два пина:

  • аналоговый пин для анализа АЦП (свойство _controlpin из SignalLoop)
  • цифровой пин для управления питанием (свойство _managepin, новое)

Новые свойства класса Smoke1Loop:

  • _managepin – пин для управления питанием
  • _timeanalyze – время анализа шлейфа после перезапуска до сброса срабатывания
  • _timereset – время перезапуска шлейфа по питанию
  • _timeevent – для хранения времени срабатывания, используем millis()
  • _alarmflag – вспомогательный флаг для контроля шлейфа

все они так же будут в секции protected, поэтому для них создадим set-get методы.

Новые свойства класса Smoke1Loop:

  • PowerOn () – устанавливает пин с номером _managepin в состояние логической 1
  • PowerOff () – устанавливает пин с номером _managepin в состояние логического 0
  • PowerStatus () – считывает значение пина с номером _managepin, возвращает false если на пине лог.0 и true если лог.1
  • LoopPowerReset () – сбрасывает питание на пине заданном свойством _managepin на время заданное свойством _timereset. Возвращает TRUE если питание сброшено и FALSE если питание подано.
  • LoopCheck () – контролирует состояние шлейфа по заданным параметрам. Если шлейф в норме – метод возвращает 5. В случае срабатывания возвращает 1, после этого осуществляет сброс питания на пине заданном свойством _managepin на время заданное свойством _timereset. После восстановления питания, если в течении времени, заданном свойством _timeanalyze происходит повторное срабатывание – снова возвращает 1, если не происходит – возвращает -1. Таким образом осуществляется логика работы дымового шлейфа со сбросом питания. В случае иных отклонений параметров шлейфа возвращает 2,3,4. См. возвращаемые значения метода LoopState() базового класса.

Алгоритм работы метода LoopPowerReset()

Алгоритм работы метода LoopPowerReset()

Алгоритм работы метода LoopCheck()

Алгоритм работы медота LoopCheck()

Теперь сам код:

  1. class Smoke1Loop : public SignalLoop {
  2.   protected:
  3.   int8_t _managepin;         // пин для управления
  4.   uint32_t _timeanalyze;     // время анализа шлейфа после перезапуска
  5.   uint32_t _timereset;       // время перезапуска
  6.   uint32_t _timeevent;       // для хранения времени миллис  4294967249
  7.   boolean _alarmflag;        // вспомогательный флаг для контроля шлейфа  
  8.   public:
  9.    Smoke1Loop // конструктор
  10.     (
  11. 		uint8_t loopid
  12. 		,uint8_t sectionnumber
  13.         ,int16_t normal 
  14.         ,int16_t alarm  
  15.         ,int16_t gist   
  16.         ,int16_t oc 
  17.         ,int16_t sc  
  18.         ,int8_t controlpin 
  19.         ,int8_t managepin
  20.         ,uint32_t timeanalyze
  21.         ,uint32_t timereset
  22.     );
  23.     //--- set-get методы Smoke1Loop
  24. //    void setManagePin (int8_t val);
  25. //    void setTimeAnalyze (uint32_t val);
  26. //    void setTimeReset (uint32_t val);
  27. //    void setTimeEvent (uint32_t val);
  28. int8_t   getManagePin();
  29. uint32_t getTimeAnalyze();
  30. uint32_t getTimeReset();
  31. uint32_t getTimeEvent();
  32. boolean  getAlarmFlag();
  33.     //set-get методы Smoke1Loop---
  34.  
  35. void PowerOn ();
  36. void PowerOff ();
  37. boolean PowerStatus();
  38. boolean LoopPowerReset ();
  39. int8_t LoopCheck();
  40. };
  41.  
  42. // ---описание конструктора Smoke1Loop
  43. Smoke1Loop::Smoke1Loop 
  44. (  	
  45. 	uint8_t loopid
  46. 	,uint8_t sectionnumber
  47. 	,int16_t normal
  48. 	,int16_t alarm
  49. 	,int16_t gist 
  50. 	,int16_t oc  
  51. 	,int16_t sc 
  52. 	,int8_t controlpin 
  53. 	,int8_t managepin
  54. 	,uint32_t timeanalyze
  55. 	,uint32_t timereset
  56. ) : SignalLoop (
  57. 	loopid
  58. 	, sectionnumber
  59. 	, normal
  60. 	, alarm
  61. 	, gist
  62. 	, oc
  63. 	, sc
  64. 	, controlpin
  65. ) // вызов коструктора базового класса
  66. {
  67. 	_managepin=managepin;
  68. 	_timeanalyze=timeanalyze;
  69. 	_timereset=timereset;
  70. 	_timeevent=0;
  71. 	_alarmflag=false;
  72. 	pinMode(_managepin, OUTPUT);
  73. 	_looptype=1;
  74. };
  75. // описание конструктора Smoke1Loop---
  76.  
  77. //--- Описание set-get методов Smoke1Loop
  78.  
  79. //  void Smoke1Loop::setManagePin (int8_t val){_managepin=val;};
  80. //  void Smoke1Loop::setTimeAnalyze (uint32_t val){_timeanalyze=val;};
  81. // void Smoke1Loop::setTimeReset (uint32_t val){_timereset=val;};
  82. //  void Smoke1Loop::setTimeEvent (uint32_t val) {_timeevent=val;};
  83.  
  84. int8_t   Smoke1Loop::getManagePin() {return _managepin;};
  85. uint32_t Smoke1Loop::getTimeAnalyze(){return _timeanalyze;};
  86. uint32_t Smoke1Loop::getTimeReset() {return _timereset;};
  87. uint32_t Smoke1Loop::getTimeEvent()  {return _timeevent;};
  88. boolean  Smoke1Loop::getAlarmFlag () {return _alarmflag;};
  89. //Описание set-get методов Smoke1Loop---
  90.  
  91.  
  92. void Smoke1Loop::PowerOn (){
  93. 	digitalWrite(_managepin , HIGH);
  94.   };
  95. void Smoke1Loop::PowerOff (){
  96. 	digitalWrite(_managepin , LOW);
  97.   };
  98. boolean Smoke1Loop::PowerStatus(){
  99. 	return digitalRead(_managepin);
  100.   };
  101. boolean Smoke1Loop::LoopPowerReset (){
  102. 	if(!_timeevent) {
  103. 		_timeevent=millis();
  104. 		this->PowerOff ();
  105. 	}
  106. 	else {
  107. 		return false; // Питание подано
  108. 	};
  109. 	if((_timeevent + _timereset)< millis()){
  110. 		this->PowerOn ();
  111. 		_timeevent=0;
  112. 		return false; // Питание подано
  113. 	}
  114. 	else {return true;} // Питание снято
  115. };
  116. int8_t Smoke1Loop::LoopCheck(){
  117.   if(millis()>_timeevent+_timereset){
  118.     if(!(this->PowerStatus())){this->PowerOn();};
  119.     if(this->LoopState() == 1){
  120.         if(_alarmflag){
  121.             if(millis()>(_timeevent+_timeanalyze+_timereset)){
  122.                 _alarmflag=false;
  123.                 return -1; // отсутствие повторного срабатывания
  124.               }
  125.             else{
  126.                 return 5; // шлейф в норме
  127.               }
  128.           }
  129.         else{
  130.           return 5; // шлейф в норме
  131.           };
  132.  
  133.       }
  134.       else if (this->LoopState() == 0){
  135.         this->PowerOff();
  136.         _timeevent=(millis());
  137.         _alarmflag=true;
  138.         return 1; // срабатывание 
  139.       }
  140.       else {
  141.         return this->LoopState(); // неисправность
  142.         }
  143.   }
  144.   else{
  145.     return 0; // Инициализация / сброс питания
  146.   };
  147. };

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

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


На этом пока все. Будем продолжать. Если есть вопросы – задавайте в комментариях.

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

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

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

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