12.02.2024: Год дракона стартовал
Ну всё. В эти выходные китайцы отметили Новый год, а значит теперь он стартовал вот уже прямо совсем точно.
Именно поэтому все выходные я ничегошеньки не делал, а только праздновал.
Ведь поэтому? Не потому, что залип в Палворлд?
И пока не забыл, объявляю эту неделю неделей без Palworld! Тем более, что там я взял максимальный уровень, прокачал отличного маунта и начал качать Лилин Нокт, моего будущего босскиллера. А потому, хватит, пауза, перерыв.
Пока я играл у меня копились дела. Да и серверок с Hass несколько раз намертво зависал. Не помогал не перезагрузчик контейнера, ни вотчдог. Он просто выключался и всё. Не знаю почему. Может перегрев?
В общем, требуется устройство, которое будет следить за температурой процессора и состоянием сервера, которое сможет сделать перезапуск, если потребуется.
Сделаю для этого в HASS (Home Assistant) какой-нибудь command_line switch, который станет тупо посылать команду на получение температуры процессора в консоль, а затем, по условию, отдавать по USB-COM ноль (если температура процессора приемлемая) или единицу (если пора включать кулер).
Команда типа echo «1» > /dev/ttyS0 или вроде того.
За основу скетча для нанки возьму вот такой код и творчески доработаю напильником.
void setup() { pinMode(CANCEL_PIN, INPUT_PULLUP); //Переключатель отмены ресета pinMode(CANCEL_LED_PIN, OUTPUT); //Пин светодиода активированной отмены ресета pinMode(CULLER_PIN, OUTPUT); //Пин кулера pinMode(RESET_RELAY, OUTPUT); //Пин реле ресета pinMode(RESET_LED_PIN, OUTPUT); //Пин светодиода перезагрузки Serial.begin(9600); digitalWrite(CULLER_PIN, LOW); } void loop() { int counter = 300000; //Счётчик миллисекунд до перезагрузки int counter_start = 300000; //Стартовое значение счетчика до перезагрузки int DELAY = 20; while (counter >= 0) { //Светодиод режима отмены ресета if (!digitalRead(CANCEL_PIN)) { digitalWrite(CANCEL_LED_PIN, HIGH); }else{ digitalWrite(CANCEL_LED_PIN, LOW); } if (Serial.available() > 0) { //Если порт доступен switch((char)Serial.read()) { case '1': digitalWrite(CULLER_PIN, HIGH); //Включаю кулер counter = counter_start; break; case '0': digitalWrite(CULLER_PIN, LOW); //Выключаю кулер counter = counter_start; break; } } delay(DELAY); //Делаю задержку counter = counter - DELAY; //Вычитаю из счётчика время задержки } //Если мы выпали из цикла, значит сервер висит и нужно сделать ресет, если ресет не выключен принудительно if (digitalRead(CANCEL_PIN)) { digitalWrite(RESET_RELAY, HIGH); //Размыкаю реле digitalWrite(RESET_LED_PIN, HIGH); //Включаю индикацию перезагрузки delay(15000); //Жду 15 секунд digitalWrite(RESET_RELAY, LOW); //Замыкаю реле delay(60000); //Жду минуту digitalWrite(RESET_LED_PIN, LOW); //Выключаю индикацию перезагрузки } }
Если в течение пяти минут (тут примерно, но мне нормально) нанка не получит никаких данных, то произойдёт ресет.
На плате нужно развести штырьки под подключение кулера к пину, два светодиода, разъём питания, штекер питания и выключатель режима отмены ресета.
Осталось найти нанку. Кажется у меня была одна в давно неиспользуемом термостате.
А теперь — стартую рабочий день. Сегодня нужно автоматизировать один тесткейс или лучше пару.
Обед.
Вытащил нанку из старого термостата, посмотрел на код, задумался.
- Во-первых, на плате нанки уже есть один светодиод. Именно им мигают новички на первом или втором уроке.
- Во-вторых, если у меня есть переключатель, то зачем подключать его к пину, писать отдельный код для отмены ресета и всякое такое? Можно ведь этим переключателем запараллелить ток в обход реле, и тогда в случае разрыва питание продолжит идти как ни в чём не бывало. И диод туда повесить, для индикации.
И если со светодиодом ещё можно подумать, то с переключателем однозначно надо упрощать.
//Пин кулера #define CULLER_PIN 3 //Пин реле ресета #define RESET_RELAY 4 //Пин светодиода перезагрузки #define RESET_LED_PIN 5 void setup() { pinMode(CULLER_PIN, OUTPUT); //Пин кулера pinMode(RESET_RELAY, OUTPUT); //Пин реле ресета pinMode(RESET_LED_PIN, OUTPUT); //Пин светодиода перезагрузки Serial.begin(9600); digitalWrite(CULLER_PIN, LOW); } void loop() { int counter = 300000; //Счётчик миллисекунд до перезагрузки int counter_start = 300000; //Стартовое значение счетчика до перезагрузки int DELAY = 20; while (counter >= 0) { if (Serial.available() > 0) { //Если порт доступен switch((char)Serial.read()) { case '1': digitalWrite(CULLER_PIN, HIGH); //Включаю кулер counter = counter_start; break; case '0': digitalWrite(CULLER_PIN, LOW); //Выключаю кулер counter = counter_start; break; } } delay(DELAY); //Делаю задержку counter = counter - DELAY; //Вычитаю из счётчика время задержки } //Если мы выпали из цикла, значит сервер висит и нужно сделать ресет digitalWrite(RESET_RELAY, HIGH); //Размыкаю реле digitalWrite(RESET_LED_PIN, HIGH); //Включаю индикацию перезагрузки delay(15000); //Жду 15 секунд digitalWrite(RESET_RELAY, LOW); //Замыкаю реле delay(60000); //Жду минуту digitalWrite(RESET_LED_PIN, LOW); //Выключаю индикацию перезагрузки }
Как-то так.
Светодиоды пущу через резисторы.
Рабочий день окончен.
Полез разбирать коробочку с HASS. Открываю, радиатор отклеился от процессора. Вот потому он и перегревался. Зарылся в коробку с электроникой, нашёл радиатор от какого-то моста.
Не того моста, что через реку или рот, а от чипа на матплате.
Этот радиатор раза в три массивнее той ерунды что стояла с завода. Приклеил на термопасту, закрепил этот бутерброд крышкой корпуса внатяг. Сижу, смотрю на показатель температуры процессора, а там даже до пятидесяти не доходит.
Ну и вопрос теперь, а надо-ли городить огород с отдельным контроллером охлаждения?
С одной стороны, теперь вряд-ли станет виснуть, но вот с другой… Раз оно уже один раз ломалось, то однажды сломается снова. Так может перестраховаться? Или потратить время на что-нибудь более полезное? Например, продолжить выполнять задачи от Учебного Центра?
Как хотите, но сначала посмотрю новую серию «Монологов Фармацевта», а решение приму после…
Не прощаюсь.
Скетч в контроллер залил. Вроде всё работает. Теперь нужно припаять всю рассыпуху на нужные места. Но… не сегодня. Сегодня буду яростно прокрастинировать и пить аспирин (кажется я… того). Отключаюсь.
Напишите комментарий