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. Открываю, радиатор отклеился от процессора. Вот потому он и перегревался. Зарылся в коробку с электроникой, нашёл радиатор от какого-то моста.
Не того моста, что через реку или рот, а от чипа на матплате.
Этот радиатор раза в три массивнее той ерунды что стояла с завода. Приклеил на термопасту, закрепил этот бутерброд крышкой корпуса внатяг. Сижу, смотрю на показатель температуры процессора, а там даже до пятидесяти не доходит.
Ну и вопрос теперь, а надо-ли городить огород с отдельным контроллером охлаждения?
С одной стороны, теперь вряд-ли станет виснуть, но вот с другой… Раз оно уже один раз ломалось, то однажды сломается снова. Так может перестраховаться? Или потратить время на что-нибудь более полезное? Например, продолжить выполнять задачи от Учебного Центра?
Как хотите, но сначала посмотрю новую серию «Монологов Фармацевта», а решение приму после…
Не прощаюсь.
Скетч в контроллер залил. Вроде всё работает. Теперь нужно припаять всю рассыпуху на нужные места. Но… не сегодня. Сегодня буду яростно прокрастинировать и пить аспирин (кажется я… того). Отключаюсь.
Напишите комментарий