Библиотека и скетч для работы с 4х проводным дымовым пожарным извещателем с Ардуино (Пожарная сигнализация на Ардуино)

ИП 212-147 и Arduino Mega
Продолжаем тему пожарной сигнализации на ардуино. В прошлом посте Подключение 4х проводного дымового пожарного извещателя к Ардуино мы рассмотрели один из вариантов подключения извещателя пожарного дымового оптико-электронного точечного ИП 212-147 к ардуино. На основе этого способа подключения, с помощью которого путем нехитрых преобразований можно подключить любой 4х проводный извещатель и была написана библиотека SmokeLoop. Она включает в себя также более простые библиотеки (Loop и Timer) также написанные мной.

Данная библиотека реализует распространенный способ анализа аналогового пожарного шлейфа для определения возгорания по нескольким сработкам. Логика простая — контроллер анализирует напряжение на шлейфе, при возникновении задымления и сработке извещателя на пине, который управляет питанием шлейфа устанавливается на определенное время логический нуль, что отключает извещатель для его перезапуска. После включения питания запускается задержка анализа шлейфа. Если по окончании времени задержки задымление не устранилось, то в зависимости от установленного количества тревог для выдачи сигнала ПОЖАР, либо снова происходит перезапуск, либо шлейф блокируется в режиме ПОЖАР.


Теперь давайте перейдем к описанию библиотеки. В библиотеке описан едиственный класс — SmokeLoop. Конструктор по умолчанию я не реализовывал, т.к. у каждого будут свои параметры в зависимости от реализации. Второй конструктор принимает следующие параметры:

  1. uint8_t controlPin /*пин для анализа*/
  2. int16_t normalValue /*Значение АЦП для нормального состояния шлейфа*/
  3. int16_t ocValue /*Значение АЦП для обрыва цепи*/
  4. int16_t scValue /*Значение АЦП для короткого замыкания цепи*/
  5. int16_t alarmValue /*Значение АЦП для перехода шлейфа с состояние "тревога"*/
  6. int16_t gistNormalValue /*Приращение для нормального состояния шлейфа*/
  7. int16_t gistAlarmValue /*Приращение для тревожного состояния шлейфа*/
  8. uint8_t managePin /*пин для управления питанием*/
  9. uint16_t resetTime /*время в мс сброса питания на шлейфе*/
  10. uint16_t delayTime /*время в мс задержки анализа состояния шлейфа после восстановления питания*/
  11. uint8_t alarmsQuantity /*количество сработок шлейфа для выдачи сигнала ПОЖАР*/

Паблик-методы реализованные в классе, по мимо геттров и сеттеров:

  1. virtual smokeLoopState state();/*метод анализирует шлейф и возвращает его состояния согласно enum smokeLoopState*/
  2. void reset();/*метод возвращает шлейф в исходное состояние после того, как он заблокировался в состоянии пожар*/
  3. void managePinInit();/*метод устанавливает пин заданный managePin в состояние OUTPUT*/
  4. /* Helpers */
  5. void printState();/*метод выводит в сериал текущее состояние шлейфа*/
  6. void info();/*метод выводит в сериал параметры шлейфа*/

Последние два метода-хелпера по умолчанию отключены. Для включения нужно раскомментировать константу HELPERS в файлах SmokeLoop.h и SmokeLoop.cpp. Метод state() возвращает тип данных smokeLoopState это enum значения :

  • NORMAL=0, шлейф в норме;
  • ATTENTION=1, сработка шлейфа т.н. «ВНИМАНИЕ!»;
  • FIRE=2, шлейф в состоянии ПОЖАР;
  • SHORT=3, короткое замыкание шлейфа;
  • OPEN=4, обрыв шлейфа;
  • POWER_ON=5, питание подано;
  • POWER_OFF=6, питание снято;
  • DELAY=7, задержка анализа;
  • TROUBLE=8, сопротивление шлейфа отличное от обрыва, КЗ, нормы и сработки.

Для корректного определения состояния короткого замыкания необходимо помнить что мы измеряем напряжение при отключенных дополнительном и оконечном резисторах со второго плеча делителя. Там может быть напряжение отличное от 5В, все зависит от номиналов резисторов делителя. Поэтому измерьте напряжение и укажите корректное значение.


Ниже приведены два скетча, для демонстрации работы библиотеки: первый с включенными хелперами, второй — с выключенными. После блокировки шлейфа в режиме пожар — отправьте в сериал цифру 0 для восстановления шлейфа.

  1. /*
  2. *Пример с включенными хелперами
  3. *ПРОВЕРЬТЕ что строка с объявлением константы HELPERS раскомментирована 
  4. *в файлах SmokeLoop.h и SmokeLoop.cpp  
  5. */
  6. #include "SmokeLoop.h"
  7. SmokeLoop sLoop (54,500,10,1000,300,50,50,45,2000,30000,2); // создаем экземпляр класса
  8. void setup() {
  9.   Serial.begin(9600);
  10.   sLoop.info(); // выводим в сериал параметры шлейфа
  11. }
  12. void loop(){
  13.   test();
  14.   sLoop.printState(); // выводим в сериал текущее состояние шлейфа (установлена задержка 1000 мс)
  15. }
  16. void test() {
  17.   if (Serial.available()) {
  18.     byte symbol = Serial.read();
  19.     if (symbol == '0') {
  20.       Serial.println(F("0 pressed"));
  21.       sLoop.reset(); // восстанавливаем параметры шлейфа после блокировки в пожаре
  22.     }
  23.   }
  24. }
  1. /*
  2. *Пример с выключенными хелперами
  3. */
  4. #include "SmokeLoop.h"
  5. SmokeLoop sLoop (54,500,10,1000,300,50,50,45,2000,30000,2); // создаем экземпляр класса
  6. void setup() {
  7.   Serial.begin(9600);
  8. }
  9. void loop(){
  10.   test();
  11.   Serial.print (F("ADC: ")); Serial.println(sLoop.readADC());
  12.   switch (sLoop.state()){
  13.       case SmokeLoop::smokeLoopState::NORMAL : Serial.println(F("NORMAL")); break;
  14.       case SmokeLoop::smokeLoopState::ATTENTION : Serial.println(F("ATTENTION"));break;
  15.       case SmokeLoop::smokeLoopState::FIRE : Serial.println(F("FIRE"));break;
  16.       case SmokeLoop::smokeLoopState::SHORT : Serial.println(F("SHORT"));break;
  17.       case SmokeLoop::smokeLoopState::OPEN : Serial.println(F("OPEN"));break;
  18.       case SmokeLoop::smokeLoopState::POWER_ON : Serial.println(F("POWER_ON"));break;
  19.       case SmokeLoop::smokeLoopState::POWER_OFF : Serial.println(F("POWER_OFF"));break;
  20.       case SmokeLoop::smokeLoopState::DELAY : Serial.println(F("DELAY"));break;
  21.       case SmokeLoop::smokeLoopState::TROUBLE : Serial.println(F("TROUBLE"));break;
  22.       //default:
  23.     };
  24.     delay(1000);
  25. }
  26. void test() {
  27.   if (Serial.available()) {
  28.     byte symbol = Serial.read();
  29.     if (symbol == '0') {
  30.       Serial.println(F("0 pressed"));
  31.       sLoop.reset(); // восстанавливаем параметры шлейфа после блокировки в пожаре
  32.     }
  33.   }
  34. }
Библиотека для работы с 4х проводным дымовым пожарным извещателем

Текущая версия: 0.0.1 / 2019.01.27
Предыдущие версии:

Size: 9 kB
Version: 0.0.1

Не ленитесь! Оценивайте пожалуйста статью. Ниже есть звездочки:)

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

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

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