В пятницу вырубился кондиционер в серверной в новом помещении. Врубил второй - через несколько часов и он вырубился. Я там рядышком сижу, так что прекрасно слышно как начинают выть кулера в серваках HP, там достаточно минут на 30 вырубить охлаждение и возможен летальный исход. Как оказалось чуть позже, кондиционеры исправны, вырубился автомат в щитовой.
В общем, со всей серьёзностью встала проблема мониторинга температуры в серверных.
Мониторинг видится так: в комнате стоит некая хрень с температурным датчиком. Хрень эта получает с датчика температуру и каким-то макаром позволяет удалённо эту самую температуру узнать. А в случае превышения заданного порога - сигнализирует мне на мобилу. Ну или ещё куда-нить.
Готовых решений за нормальные деньги не нашёл. Может, плохо искал, а мож и правда нету их, готовых недорогих решений. Так что, как всегда, пришлось свой огород городить.
А нагородил вот что:
Очень кстати вспомнил про подаренные мне
Подробности пока не буду описывать ибо всё элементарно, а спать хочется. На данный момент температура уже успешно определяется, но затык в отправке данных о температуре на сервак. Ардуина через Ethernet-Shield будет отправлять эти данные на локальный веб-сервачок, где админы смогут её увидеть (график изменения температуры будет). А в случае опасности будет звонить мне на мобилу и голосом материться "шухер, у нас жарко!". Ага, Hylafax и не такое может :-) Плюс к автономности - на Ардуине будет свой веб-сервер, где тоже температуре отображаться будет. На случай если веб-сервак недоступен. Ну и к Ардуине датчиков будет подключено несколько, так как в старом помещении серверная одна, а в новом их две.
Затык в том что Ардуина напрочь отказывается работать с эзернет модулем на базе чипа ENC28J60. Светодиодики весело моргают, а вот коннект не устанавливается. Шылд не родной ардуиновский, но вроде как полностью совместимый (?), так что непонятно в чём затык, уж весь инет перерыл а бестолку.
Пока вот проверенный код с робокрафта. Определяет температуру, корректно работает с датчиками 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