Задумался я тут над тем, чтобы сделать на базе контроллера AVR универсальный прибор который контролировал бы шлейфы сигнализации, управлял релюшками, осуществлял функции контроля доступа и т.д. с возможностью связи по каналу GSM и Ethernet. Физическая реализация пока не определена. Будет ли это ардуино или еще какой-то вариант — я пока не знаю. Но экспериментировать буду на Ардуино Уно или Мега, если нужно будет больше памяти. Описывать что такое ардуино смысла большого нет, т.к. в сети уже столько всего написано что читать- не перечитать.
Подход к программированию будет объектно-ориентированный, т.е. ООП. Классы буду описывать следующим образом: свойства и описания методов отдельно, реализация методов отдельно, для того чтобы желающие (если таковые найдутся) могли легко создать из классов библиотеку.
У базового шлейфа будет 6 свойств :
- _normal Значение АЦП норма
- _alarm Значение АЦП при котором шлейф переходит в состояние тревога
- _gist Значение гистерезиса для учета допустимых колебаний напряжения
- _oc Значение АЦП менее которого обрыв в шлейфе
- _sc Значение АЦП более которого короткое замыкание в шлейфе
- _controlpin Номер пина для анализа
Все они будут в секции Private. Для возможности их изменения и чтения в секции Public мы создадим соответствующие методы. Так же определим и реализуем еще два базовых метода:
- LoopState() будет возвращать целое восьмибитовое число. Это будет код состояния шлейфа:
- 0 — тревога
- 1 — норма
- 2 — короткое
- 3 — обрыв
- 4 — промежуточное состояние
- GetADC() будет возвращать целое восьмибитовое число. Это будет значение АЦП на контролируемом пине.
Итак описываем класс, определяем свойства и методы:
-
class SignalLoop {
-
private:
-
int16_t _normal; // Значение АЦП норма
-
int16_t _alarm; // Значение АЦП сработка
-
int16_t _gist; // Значение гистерезиса
-
int16_t _oc; // Значение менее которого обрыв
-
int16_t _sc; // Значение более которого короткое
-
int8_t _controlpin; // пин для анализа
-
public:
-
SignalLoop // конструктор
-
(
-
int16_t normal,
-
int16_t alarm,
-
int16_t gist,
-
int16_t oc,
-
int16_t sc,
-
int8_t controlpin
-
);
-
// ---set-get методы для доступа к свойствам из других классов
-
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);
-
-
int16_t getNormal();
-
int16_t getAlarm();
-
int16_t getGist();
-
int16_t getOC();
-
int16_t getSC();
-
int8_t getControlPin();
-
// set-get методы для доступа к свойствам из других классов---
-
-
int8_t LoopState();
-
int8_t GetADC();
-
};
Теперь описываем реализацию методов и конструктор:
-
// ---конструктор
-
SignalLoop::SignalLoop
-
(
-
int16_t normal,
-
int16_t alarm,
-
int16_t gist,
-
int16_t oc,
-
int16_t sc,
-
int8_t controlpin
-
){
-
_normal=normal;
-
_alarm=alarm;
-
_gist=gist;
-
_oc=oc;
-
_sc=sc;
-
_controlpin=controlpin;
-
};
-
// конструктор---
-
// ---set-get методы для доступа к свойствам из других классов
-
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;};
-
-
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 = analogRead(_controlpin); // инициализируем пин на вход
-
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; // промежуточное состояние
-
}
-
-
int8_t SignalLoop::GetADC (){
-
return(analogRead(_controlpin));
-
};
-
// базовые методы класса---
-
-
void setup(){}
-
void loop(){}
Описание класса SignalLoop.
Для проверки компиляции добавлены setup и loop.
На этом первую часть эпоса под названием Супер универсальный охранно-пожарно-СКД-GSM-Ethernet и т.д. прибор можно закончить. Продолжение обязательно будет.
Задавайте вопросы в комментариях.