Подключение 4х проводного дымового пожарного извещателя ИП212-45 к цифровому входу Ардуино

В этом посте я расскажу как можно подключить 4х проводный дымовой пожарный извещатель ИП212-45 к цифровому входу Ардуино. Про метод подачи питания на извещатель вы можете прочитать в посте Подключение 4х проводного дымового пожарного извещателя к Ардуино, здесь используется тот же принцип. В данном примере я использовал оптореле AQW212. Оно сильно дешевле отечественных, особенно если заказывать у наших китайских братьев.

Сразу оговорюсь о минусах и плюсах подключения к цифровому входу. Из плюсов — мы экономим аналоговые входы и самое главное — меньше зависим от возможных перепадов напряжения, т.к. при подключении к аналоговому входу мы использовали делители напряжения, на которых это самое напряжение и будет меняться при флуктуациях, а так как разница в измеряемых значениях напряжения не большая — возможны ложняки. Еще один плюс — развязка входа через оптореле. Что бы в шлейфе не произошло — наша Ардуинка не пострадает. Из минусов — нужен еще один канал оптореле для организации развязки и потеря информации о неисправности в шлейфе. Так, при КЗ или срабатывании извещателя у нас будет управляющий сигнал, а при обрыве или норме извещателя его не будет.

Давайте взглянем на принципиальную схему подключения:

Принципиальная схема подключения ИП212-45 к цифровому входу Ардуино с помощью оптореле AQW212
Принципиальная схема подключения ИП212-45 к цифровому входу Ардуино с помощью оптореле AQW212

Данная схема рассчитана на электропитание извещателя от 12В и напряжение шлейфа 12В. Для тех, кто не очень дружит со схемами я дам краткое пояснение.

Принцип работы шлейфа с оптореле

При напряжении 12В ток в шлейфе без ограничительного резистора при срабатывании извещателя будет 24 мА (измерено на нескольких извещателях). Таким образом сопротивление шлейфа при срабатывании извещателя будет равно 500 Ом (верхняя часть рисунка). Теперь подключим ограничительный резистор номиналом 5 кОм, ток уменьшится до 2 мА и на данном резисторе будет падать примерно 11В (средняя часть часть рисунка). Далее, параллельно резистору 5 кОм подключаем вход оптореле, но нам необходимо ограничить ток через него, поэтому последовательно со входом оптореле включаем резистор на 2 кОм (нижняя часть рисунка). Как рассчитывать номинал ограничительного резистора для оптореле я уже писал. Я не буду расписывать простейшие формулы, вы сами можете посчитать что ток в шлейфе будет приблизительно 6 мА.

Таким образом, срабатывая, извещатель управляет каналом оптореле и мы коммутируем ноль на цифровой вход. Почему выбран именно ноль? Чтобы избежать ложняков. Можно было конечно подтянуть вход к земле с помощью резистора и подавать +5В, но зачем нам лишний резистор, если в Ардуинке есть возможность программно подтянуть вход к лог 1. Делается это с помощью функции pinMode ([pin], INPUT_PULLUP).

Есть еще один момент. В своих опытах я обнаружил что при мигании с/д на извещателе в рабочем режиме на очень короткий момент оптореле срабытавает. Думаю что это связано с тем, что в цепь шлейфа включен светодиод сигнализирующий о состоянии извещателя. Это приводит к ложному срабатыванию. Однако достаточно добавить в код задержку на 5 мс и ложные срабатывания пропадают.

Ниже приведен не большой код для проверки:

uint8_t manPin = 2; // задаем пин для управления питанием
uint8_t secPin = 3; // задаем пин для контроля
bool flag1 = false;
bool flag2 = false;
 
void setup() {
 
pinMode (secPin, INPUT_PULLUP); // подтягиваем пин к лог 1
pinMode (manPin, OUTPUT);
digitalWrite(manPin, false); // снимаем питание
 
Serial.begin(9600);
}
 
void loop() {
  if (!flag2){
    if (digitalRead(secPin) == false){
    delay (5);
      if (digitalRead(secPin) == false){
        flag2 = true;
        flag1 = true;
      }       
    }
  } 
  if (flag1) {
    Serial.println(F("Fire!"));
    flag1 = false;
    };
  test();
}
void test() { // функция для управления питанием через монитор сом-порта.
  if (Serial.available()) {
    byte symbol = Serial.read();
    if (symbol == '0') {
      Serial.println(F("0 pressed"));
      digitalWrite(manPin, true); // подаем питание
      flag2 = false;
    }
    else  if (symbol == '1') {
      Serial.println(F("1 pressed"));
      digitalWrite(manPin, false); // снимаем питание      
    }
  }
}

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

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

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