Так как непосредственно моей обязанностью было поднимать сервера после таких аварий и, мягко говоря, надоело надеяться на службу мониторинга стал искать решение кроме SNMP трапов. После разбора руководств, шедших в комплекте с ИБП и кондиционерами, было обнаружено, что все они поддерживают сухие контакты. Осталось найти, как с ними работать. На помощь пришла отладочная плата MSP430 Launchpad от Texas Instruments.
Для неспециалистов сухие контакты работают как включатели/выключатели, замыкающие/размыкающие контакты при определенных условиях. Производитель может заложить, например, такие условия: общий аларм (любая неисправность с оборудованием), отсутствие напряжения на входных контактах, разряд батарей, повышение температуры. Все это подробно описывается в руководствах, там же приводятся схемы контактов, к которым нужно подключиться.
Данные выключатели позволяют сформировать критерии HIGH и LOW для микроконтроллера: если контакт разомкнут, то относительно земли будем иметь HIGH на пине контроллера, если замкнут, то сформируется LOW. Такие условия позволяют управлять при помощи простого оператора “if” включением/выключением других пинов на плате. Недолго думая, решил управлять светодиодами и пьезо-пищалкой, чтобы подавать звуковой и визуальный сигнал аларма. Спустя 5 минут на основе примеров, шедших в комплекте с средой Energia, был составлен скетч:
const int ledPin0 = P1_0; const int ledPin1 = P1_1; const int ledPin2 = P1_2; const int ledPin3 = P1_3; const int ledPin4 = P1_4; const int ledPin5 = P1_5; const int buttonPin0 = P2_0; const int buttonPin1 = P2_1; const int buttonPin2 = P2_2; const int buttonPin3 = P2_3; const int buttonPin4 = P2_4; const int buttonPin5 = P2_5; const int tonePin = P1_7; int buttonState0 = 0; int buttonState1 = 0; int buttonState2 = 0; int buttonState3 = 0; int buttonState4 = 0; int buttonState5 = 0; void setup() { pinMode(ledPin0, OUTPUT); pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(ledPin3, OUTPUT); pinMode(ledPin4, OUTPUT); pinMode(ledPin5, OUTPUT); pinMode(buttonPin0, INPUT_PULLUP); pinMode(buttonPin1, INPUT_PULLUP); pinMode(buttonPin2, INPUT_PULLUP); pinMode(buttonPin3, INPUT_PULLUP); pinMode(buttonPin4, INPUT_PULLUP); pinMode(buttonPin5, INPUT_PULLUP); } void loop() { buttonState0 = digitalRead(buttonPin0); buttonState1 = digitalRead(buttonPin1); buttonState2 = digitalRead(buttonPin2); buttonState3 = digitalRead(buttonPin3); buttonState4 = digitalRead(buttonPin4); buttonState5 = digitalRead(buttonPin5); // LED P1_0 if (buttonState0 == LOW) { digitalWrite(ledPin0, HIGH); tone(tonePin, 440, 200); } else { digitalWrite(ledPin0, LOW); } // LED P1_1 if (buttonState1 == LOW) { digitalWrite(ledPin1, HIGH); tone(tonePin, 440, 200); } else { digitalWrite(ledPin1, LOW); } // LED P1_2 if (buttonState2 == LOW) { digitalWrite(ledPin2, HIGH); tone(tonePin, 440, 200); } else { digitalWrite(ledPin2, LOW); } // LED P1_3 if (buttonState3 == LOW) { digitalWrite(ledPin3, HIGH); tone(tonePin, 440, 200); } else { digitalWrite(ledPin3, LOW); } // LED P1_4 if (buttonState4 == LOW) { digitalWrite(ledPin4, HIGH); tone(tonePin, 440, 200); } else { digitalWrite(ledPin4, LOW); } // LED P1_5 if (buttonState5 == LOW) { digitalWrite(ledPin5, HIGH); tone(tonePin, 440, 200); } else { digitalWrite(ledPin5, LOW); } }
Поясню немного, в серверном помещении расположено 4 ИБП и 2 промышленных кондиционера. Именно они подключены как buttonPinX, светодиоды подключены как ledPinX, пищалка подключена на tonePin. Сложностей с дальнейшим разбором скетча думаю не будет.
Пульты сигнализации планировалось установить в двух помещениях: в кабинете, где размещаются администраторы, и центре мониторинга. Две платы для этого было использовать жалко, поэтому решил распараллелить выводы сигналов. Доставку сигналов до помещений было решено сделать довольно необычно – при помощи уже проложенных сетевых кабелей через кроссировочный шкаф и вывод из розеток. Получилось довольно удобно – 6 кабельков UTP кабеля используются для положительных контактов светодиодов, один для положительного контакта пищалки и последний для земли. Кабеля, шедшие от сухих контактов оборудования, не решил подключить напрямую к плате, использовал резисторы по 10k Ом. Также побоялся того, что со временем светодиоды могут сгореть, так как ток потребления по показаниям тестера составил 6mA, а контроллер MSP430G2553 может обеспечивать до 50mA на выходе. Решил использовать ограничительные резисторы в 390 Ом. В итоге схема получилось такой
Справа образовывается шлейф сигнальных кабелей до пульта, в реальной схеме у меня 2 таких шлейфа для 2 пультов. Пронумерованные выводы идут до сухих контактов ИБП и кондиционеров в паре с землей. На ИБП подключены сухие контакты, информирующие о старте разряда батарей, одновременно это означает, что отсутствует и входное напряжение. На кондиционерах к сухим контактам общего аларма.
Сигнализация сразу же вступила в эксплуатацию, с первого же дня начав уведомлять о нарушении в работе, так как проблемы с питанием практически ежедневно. В планах включение UART для чтения данных о состоянии пинов и образования E-mail или SMS нотификации
ссылка на оригинал статьи http://habrahabr.ru/post/161203/
Добавить комментарий