12.02.2024: Год дракона стартовал

Ну всё. В эти выходные китайцы отметили Новый год, а значит теперь он стартовал вот уже прямо совсем точно.

Именно поэтому все выходные я ничегошеньки не делал, а только праздновал.

Ведь поэтому? Не потому, что залип в Палворлд?

И пока не забыл, объявляю эту неделю неделей без Palworld! Тем более, что там я взял максимальный уровень, прокачал отличного маунта и начал качать Лилин Нокт, моего будущего босскиллера. А потому, хватит, пауза, перерыв.

Пока я играл у меня копились дела. Да и серверок с Hass несколько раз намертво зависал. Не помогал не перезагрузчик контейнера, ни вотчдог. Он просто выключался и всё. Не знаю почему. Может перегрев?

В общем, требуется устройство, которое будет следить за температурой процессора и состоянием сервера, которое сможет сделать перезапуск, если потребуется.

Хм… Пусть это будет обычная «нанка» (Arduino Nano).

Сделаю для этого в 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. Открываю, радиатор отклеился от процессора. Вот потому он и перегревался. Зарылся в коробку с электроникой, нашёл радиатор от какого-то моста.

Не того моста, что через реку или рот, а от чипа на матплате.

Этот радиатор раза в три массивнее той ерунды что стояла с завода. Приклеил на термопасту, закрепил этот бутерброд крышкой корпуса внатяг. Сижу, смотрю на показатель температуры процессора, а там даже до пятидесяти не доходит.

Ну и вопрос теперь, а надо-ли городить огород с отдельным контроллером охлаждения?

С одной стороны, теперь вряд-ли станет виснуть, но вот с другой… Раз оно уже один раз ломалось, то однажды сломается снова. Так может перестраховаться? Или потратить время на что-нибудь более полезное? Например, продолжить выполнять задачи от Учебного Центра?

Как хотите, но сначала посмотрю новую серию «Монологов Фармацевта», а решение приму после…

Не прощаюсь.

Скетч в контроллер залил. Вроде всё работает. Теперь нужно припаять всю рассыпуху на нужные места. Но… не сегодня. Сегодня буду яростно прокрастинировать и пить аспирин (кажется я… того). Отключаюсь.

Напишите комментарий

Введите имя

Введите адрес электронной почты

Введите адрес вашего сайта

Нажмите эту кнопку, чтобы отправить комментарий.

Введите текст комментария