В данной публикации, продолжая тему создания прибора охранного всемогущего, мы опишем класс для дымового пожарного шлейфа со сбросом питания. Данный класс будет наследником класса 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()
Алгоритм работы метода LoopCheck()
Теперь сам код:
class Smoke1Loop : public SignalLoop {
protected:
int8_t _managepin; // пин для управления
uint32_t _timeanalyze; // время анализа шлейфа после перезапуска
uint32_t _timereset; // время перезапуска
uint32_t _timeevent; // для хранения времени миллис 4294967249
boolean _alarmflag; // вспомогательный флаг для контроля шлейфа
public:
Smoke1Loop // конструктор(uint8_t loopid,uint8_t sectionnumber,int16_t normal,int16_t alarm,int16_t gist,int16_t oc,int16_t sc,int8_t controlpin,int8_t managepin,uint32_t timeanalyze,uint32_t timereset);
//--- set-get методы Smoke1Loop// void setManagePin (int8_t val);// void setTimeAnalyze (uint32_t val);// void setTimeReset (uint32_t val);// void setTimeEvent (uint32_t val);int8_t getManagePin();
uint32_t getTimeAnalyze();
uint32_t getTimeReset();
uint32_t getTimeEvent();
boolean getAlarmFlag();
//set-get методы Smoke1Loop---void PowerOn ();
void PowerOff ();
boolean PowerStatus();
boolean LoopPowerReset ();
int8_t LoopCheck();
};
// ---описание конструктора Smoke1LoopSmoke1Loop::Smoke1Loop
(uint8_t loopid,uint8_t sectionnumber,int16_t normal,int16_t alarm,int16_t gist,int16_t oc,int16_t sc,int8_t controlpin,int8_t managepin,uint32_t timeanalyze,uint32_t timereset) : SignalLoop (
loopid
, sectionnumber
, normal
, alarm
, gist
, oc
, sc
, controlpin
) // вызов коструктора базового класса
{_managepin=managepin;
_timeanalyze=timeanalyze;
_timereset=timereset;
_timeevent=0;
_alarmflag=false;
pinMode(_managepin, OUTPUT);
_looptype=1;
};
// описание конструктора Smoke1Loop---//--- Описание set-get методов Smoke1Loop// void Smoke1Loop::setManagePin (int8_t val){_managepin=val;};// void Smoke1Loop::setTimeAnalyze (uint32_t val){_timeanalyze=val;};// void Smoke1Loop::setTimeReset (uint32_t val){_timereset=val;};// void Smoke1Loop::setTimeEvent (uint32_t val) {_timeevent=val;};int8_t Smoke1Loop::getManagePin() {return _managepin;};
uint32_t Smoke1Loop::getTimeAnalyze(){return _timeanalyze;};
uint32_t Smoke1Loop::getTimeReset() {return _timereset;};
uint32_t Smoke1Loop::getTimeEvent() {return _timeevent;};
boolean Smoke1Loop::getAlarmFlag () {return _alarmflag;};
//Описание set-get методов Smoke1Loop---void Smoke1Loop::PowerOn (){
digitalWrite(_managepin , HIGH);
};
void Smoke1Loop::PowerOff (){
digitalWrite(_managepin , LOW);
};
boolean Smoke1Loop::PowerStatus(){
return digitalRead(_managepin);
};
boolean Smoke1Loop::LoopPowerReset (){
if(!_timeevent) {
_timeevent=millis();
this->PowerOff ();
}else {
return false; // Питание подано
};
if((_timeevent + _timereset)< millis()){
this->PowerOn ();
_timeevent=0;
return false; // Питание подано
}else {return true;} // Питание снято
};
int8_t Smoke1Loop::LoopCheck(){
if(millis()>_timeevent+_timereset){
if(!(this->PowerStatus())){this->PowerOn();};
if(this->LoopState() == 1){
if(_alarmflag){
if(millis()>(_timeevent+_timeanalyze+_timereset)){
_alarmflag=false;
return -1; // отсутствие повторного срабатывания
}else{
return 5; // шлейф в норме
}}else{
return 5; // шлейф в норме
};
}else if (this->LoopState() == 0){
this->PowerOff();
_timeevent=(millis());
_alarmflag=true;
return 1; // срабатывание
}else {
return this->LoopState(); // неисправность
}}else{
return 0; // Инициализация / сброс питания
};
};
- Версия: 1.01
- Дата предпоследнего обновления: -.
- Дата последнего обновления: 2018.03.02.
Классы:
SignalLoop: базовый класс, типовой шлейф
Smoke1Loop: наследник SignalLoop, дымовой шлейф со сбросом питания
На этом пока все. Будем продолжать. Если есть вопросы — задавайте в комментариях.




