?

Log in

No account? Create an account

Previous Entry Share Next Entry
Перегрев в серверной.
g0l
Жара на улице не стихает, в серверных начинают барахлить кондиционеры. В старом офисе уже один кондей сдох, в итоге температура в комнате быстренько поднялась до 60 градусов. Врубили второй кондей, которому уж лет пять. Вроде пока справляется, но всё равно стрёмно - вырубиться могёт в любой момент. Починить сломавшийся не получается - фирма-установщик говорит что запись на ремонт возможна только в ноябре ибо заказов у них дофига, не справляются. Другие фирмы отказываются чинить кондиционеры, которые не они ставили. Третьи фирмы не хотят работать с мелкими объёмами. Т.е. 10 кондиционеров заправить/починить - эт они с радостью, а вот ради одного париться не хотят. Короче, придётся пока жить с полудохлым кондеем.

В пятницу вырубился кондиционер в серверной в новом помещении. Врубил второй - через несколько часов и он вырубился. Я там рядышком сижу, так что прекрасно слышно как начинают выть кулера в серваках HP, там достаточно минут на 30 вырубить охлаждение и возможен летальный исход. Как оказалось чуть позже, кондиционеры исправны, вырубился автомат в щитовой.

В общем, со всей серьёзностью встала проблема мониторинга температуры в серверных.

Мониторинг видится так: в комнате стоит некая хрень с температурным датчиком. Хрень эта получает с датчика температуру и каким-то макаром позволяет удалённо эту самую температуру узнать. А в случае превышения заданного порога - сигнализирует мне на мобилу. Ну или ещё куда-нить.

Готовых решений за нормальные деньги не нашёл. Может, плохо искал, а мож и правда нету их, готовых недорогих решений. Так что, как всегда, пришлось свой огород городить.

А нагородил вот что:

Очень кстати вспомнил про подаренные мне SysCat'ом Ардуины и датчики Dallas 18B20. Датчики эти как раз и есть высокоточные градусники с интерфейсом 1-Wire. То что нужно. Датчики эти можно напрямую к компу подключить, но это гемор и не интересно. Хоцца автономную железяку. Так что будем делать на базе Ардуины.

Подробности пока не буду описывать ибо всё элементарно, а спать хочется. На данный момент температура уже успешно определяется, но затык в отправке данных о температуре на сервак. Ардуина через Ethernet-Shield будет отправлять эти данные на локальный веб-сервачок, где админы смогут её увидеть (график изменения температуры будет). А в случае опасности будет звонить мне на мобилу и голосом материться "шухер, у нас жарко!". Ага, Hylafax и не такое может :-) Плюс к автономности - на Ардуине будет свой веб-сервер, где тоже температуре отображаться будет. На случай если веб-сервак недоступен. Ну и к Ардуине датчиков будет подключено несколько, так как в старом помещении серверная одна, а в новом их две.

Затык в том что Ардуина напрочь отказывается работать с эзернет модулем на базе чипа ENC28J60. Светодиодики весело моргают, а вот коннект не устанавливается. Шылд не родной ардуиновский, но вроде как полностью совместимый (?), так что непонятно в чём затык, уж весь инет перерыл а бестолку.

Так что пока вопрос по этой плате остаётся открытым. Всё, проблема решена. Надо внимательнее мануал читать. Со стандартной либой ethernet.h не пашет, нужна либа etherShield.h Скачать можно на странице с мануалом по шилду, либо тут у меня.

Пока вот проверенный код с робокрафта. Определяет температуру, корректно работает с датчиками DS18S20 и DS18B20.

#include <OneWire.h>

/*
* Получаем температуру от датчиков серии DS18x20
*/

// Поддерживаемые датчики
#define DS18S20_ID 0x10
#define DS18B20_ID 0x28

// Линия 1-Wire будет на pin 2
OneWire ds(2);

void setup(void) {
Serial.begin(9600);
}

void loop(void) {
byte i;
byte present = 0;
byte data[12];
byte addr[8];

if (!ds.search(addr)) {
ds.reset_search();
return;
}

if (OneWire::crc8( addr, 7) != addr[7]) {
Serial.print("CRC is not valid!\n");
return;
}

if (addr[0] != DS18S20_ID && addr[0] != DS18B20_ID) {
Serial.print("Device is not a DS18x20 family device.\n");
return;
}

ds.reset();
ds.select(addr);

// Запускаем конвертацию
ds.write(0x44, 1);

// Подождем...
delay(1000);

present = ds.reset();
ds.select(addr);

// Считываем ОЗУ датчика
ds.write(0xBE);

// Обрабатываем 9 байт
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}

// Высчитываем температуру :)
int HighByte, LowByte, TReading, Tc_100, SignBit, Whole, Fract;
LowByte = data[0];
HighByte = data[1];

TReading = (HighByte << 8) + LowByte;

// Проверяем дубак там или нет
SignBit = TReading & 0x8000;

// Если на улице дубак :)
if (SignBit) {
TReading = (TReading ^ 0xffff) + 1;
}

// Умножаем на (100 * 0.0625) или 6.25
Tc_100 = (6 * TReading) + TReading / 4;

// Отделяем целые от дробных чисел
Whole = Tc_100 / 100;
Fract = Tc_100 % 100;

Serial.print("Temperature: ");

// Если на улице дубак напишем минус перед цифрами :)
if (SignBit) {
Serial.print("-");
}

Serial.print(Whole);
Serial.print(".");

if (Fract < 10) {
Serial.print("0");
}

Serial.print(Fract);
Serial.print("\n");
}


UPD> Сделал на пробу, датчик за окном. Меряем жару на улице в тени.

Заметка закросспостена с моего блога g0l.ru


  • 1

Ethershield ENC28J60

Вдруг кому пригодится:
ENC28J60 не хватает питания от компьютерного USB. У меня всё заработало при включении в HUB с автономным питанием.

  • 1