Задумался я тут над тем, чтобы сделать на базе контроллера 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() будет возвращать целое шестнадцатибитовое число. Это будет значение АЦП на контролируемом пине.
Итак описываем класс, определяем свойства и методы:
class SignalLoop {
protected:
uint8_t _loopid; // номер шлейфа
uint8_t _looptype; // 0- по умолчанию
uint8_t _sectionnumber; // номер раздела к которому принадлежит шлейф
int16_t _normal; // Значение АЦП норма
int16_t _alarm; // Значение АЦП сработка
int16_t _gist; // Значение гистерезиса
int16_t _oc; // Значение менее которого обрыв
int16_t _sc; // Значение более которого короткое
int8_t _controlpin; // пин для анализа
public:
SignalLoop // конструктор(uint8_t loopid,uint8_t sectionnumber,int16_t normal,int16_t alarm,int16_t gist,int16_t oc,int16_t sc,int8_t controlpin);
// ---set-get методы для доступа к свойствам из других классов// void setLoopId (uint8_t val);// void setLoopType (uint8_t val);// void setSectionNumber (uint8_t val);// void setNormal (int16_t val);// void setAlarm (int16_t val);// void setGist (int16_t val);// void setOC (int16_t val);// void setSC (int16_t val);// void setControlPin (int8_t val);uint8_t getLoopId();
uint8_t getLoopType();
uint8_t getSectionNumber();
int16_t getNormal();
int16_t getAlarm();
int16_t getGist();
int16_t getOC();
int16_t getSC();
int8_t getControlPin();
// set-get методы для доступа к свойствам из других классов--->int8_t LoopState();
int16_t GetADC();
};
// <<<конструкторSignalLoop::SignalLoop
(uint8_t loopid,uint8_t sectionnumber,int16_t normal,int16_t alarm,int16_t gist,int16_t oc,int16_t sc,int8_t controlpin){
_loopid=loopid;
_sectionnumber=sectionnumber;
_normal=normal;
_alarm=alarm;
_gist=gist;
_oc=oc;
_sc=sc;
_controlpin=controlpin;
_looptype=0;
};
// конструктор>>>// <<<set-get методы для доступа к свойствам из других классов//void SignalLoop::setLoopId (uint8_t val){_loopid = val;};//void SignalLoop::setLoopType (uint8_t val){_looptype = val;};//void SignalLoop::setSectionNumber (uint8_t val){_sectionnumber = val;};//void SignalLoop::setNormal (int16_t val){_normal = val;};//void SignalLoop::setAlarm (int16_t val){_alarm = val;};//void SignalLoop::setGist (int16_t val){_gist = val;};//void SignalLoop::setOC (int16_t val){_oc = val;};//void SignalLoop::setSC (int16_t val){_sc = val;};//void SignalLoop::setControlPin (int8_t val){_controlpin = val;};uint8_t SignalLoop::getLoopId() {return _loopid;};
uint8_t SignalLoop::getLoopType() {return _looptype;};
uint8_t SignalLoop::getSectionNumber() {return _sectionnumber;};
int16_t SignalLoop::getNormal() {return _normal;};
int16_t SignalLoop::getAlarm() {return _alarm;};
int16_t SignalLoop::getGist() {return _gist;};
int16_t SignalLoop::getOC() {return _oc;};
int16_t SignalLoop::getSC() {return _sc;};
int8_t SignalLoop::getControlPin() {return _controlpin;};
// set-get методы для доступа к свойствам из других классов>>>// <<< базовые методы классаint8_t SignalLoop::LoopState(){
int16_t value = GetADC (); // считываем значение АЦП
if (((_normal - _gist) <= value) && (value <= (_normal + _gist))) {return 1;} // шлейф в норме
else if (((_alarm - _gist) <= value) && (value <= (_alarm + _gist))) {return 0;} // сработка шлейфа
else if ( _sc <= value) {return 2;} // короткое
else if (value <= _oc) {return 3;} // обрыв
else return 4; // промежуточное состояние
}int16_t SignalLoop::GetADC (){
return(analogRead(_controlpin));
};
// базовые методы класса
Все классы, которые будут касаться этой темы я буду добавлять в библиотеку, в ней есть подробное описание свойств и методов, так же есть файл keywords.txt, в котором указаны методы для подсветки в ARDUINO IDE. Библиотека, я надеюсь, будет периодически обновляться. В описании к загрузке я буду указывать дату последней и предпоследней версий для возможности отслеживания.
- Версия: 1.01
- Дата предпоследнего обновления: -.
- Дата последнего обновления: 2018.03.02.
Классы:
SignalLoop: базовый класс, типовой шлейф
Smoke1Loop: наследник SignalLoop, дымовой шлейф со сбросом питания
На этом первую часть эпоса под названием Супер универсальный, всемогущий, охранно-пожарно-СКД-GSM-Ethernet и т.д. прибор можно закончить. Продолжение обязательно будет.
Задавайте вопросы в комментариях.


5 оценок.