ITСooky

IT-рецепты съедобные и не очень!

Автоматическое включение веньтилятров ПК по температуре на Arduino!

дата 24.10.2020

Чуть ранее я организовал программный способ включения/выключения вентилятор через реле на Arduino при входе в ОС. Он работает на Ubuntu(выключались), он работал на Windows через PowerShell(включались), но сейчас уже не хочет работать… так за чем нам вообще привязываться к ОС если можно на Arduino повесить датчик температуру!

Arduino будет само отслеживать температуру и включать дополнительные вентиляторs. По serial port можно будет включать/выключать вентиляторы принудительно, включать/выключать автоматический режим, смотреть температуры.

Беру из статьи Включаем дополнительные вентиляторы на ПК через Arduino!
1. Arduino c micro USB и 5V пином. Подошел бы оригинальный Arduino Nano но у меня его не было, а был вот этот RobotDyn UNO R3 CH340G (R3-ATmega328/CH340G)
2. Реле двойное, типа такого Relay Module 2 relays, 5V
3. Корпус под Ардуино
4. Переходник Molex на 4 (2x5V 2x12V) вентиляторных разъема. У меня был старый Zalman ZM-MC 1, пришлось разъемы под вентиляторы подрезать, чтобы подходили под разъемы PWM
5. Кабель Molex to Molex

Добавляю
6. Температурный датчик на DS18B20, его плюс что он уже откалиброван и можно несколько подключать на одну линию, но у меня один вот такой Модуль датчика температуры DS18B20, 2 шт., плата модуля датчика обнаружения для Arduino DC 5V 18B20, выход цифрового сигнала
7. Переходник с USB на материнский платы на обычный вот такой USB 2,0 9-контактный Женский адаптер kebidu с 2 портами, конвертер, материнская плата, плата, расширитель карт, Внутренний ПК
К нему подключаю Ардуино и он оченьблизко встает к видео карте, даже пришлось его изолировать, надеюсь изолента не загорится!

Схема подключения получается такая

В программу Arduino Software (IDE) надо добавить две библиотеки One Wire library by Paul Stoffregen и Dallas Temperature library вот тут все расписано randomnerdtutorials.com

Идем в Sketch > Include Library > Manage Libraries и там ищем и устанавливаем

Код

#include <EEPROM.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is conntec to the Arduino digital pin 4
#define ONE_WIRE_BUS 7
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);

const int PIN9 = 9; 
const int PIN8 = 8; 
const int tempOFF = 40; 
const int tempON = 45; 
bool value;
bool autostate;
String sdata="";  // Initialised to nothing.
String version="    Arduino Fan Temperature Control by itcooky.com v1.0"; 
int con = 0;
int coff = 0;


void setup() {
  // initialize digital pin LED_BUILTIN as an output.
   pinMode(PIN8, OUTPUT);
   pinMode(PIN9, OUTPUT);
   Serial.begin(9600);
   sensors.begin();
   value = EEPROM.read(0);
   autostate = EEPROM.read(1);
   Serial.println(version);
   Serial.print("    Started with ");
      if (autostate == 1)
    {
          Serial.println("AUTO ON");
    } else {
          Serial.println("AUTO OFF");      
    }
   Serial.println("---> Type \"help\" + [enter] for Help");


}


void loop(void ) {
byte ch;

sensors.requestTemperatures(); 
int tempCUR = sensors.getTempCByIndex(0);

if (value == 0) {
digitalWrite(PIN9, HIGH);
digitalWrite(PIN8, HIGH);
}
if (value == 1) {
digitalWrite(PIN9, LOW);
digitalWrite(PIN8, LOW);
}
if (autostate == 1)
{
if ( tempCUR <= tempOFF) {
coff++;
con = 0;
if (coff == 100)
{
value = 0;
}
}
if ( tempCUR >= tempON) {
con++;
coff = 0;
if (con == 100)
{
value = 1;
}
}




}
   if (Serial.available()) {
      ch = Serial.read();

      sdata += (char)ch; 

      if (ch=='\r') {  // Command recevied and ready.
         sdata.trim();
         
     if (sdata == "help") 
        { 
          Serial.println("    HELP");
          Serial.println("on - FANs on (set auto off)");
          Serial.println("off - FANs off (set auto off)");
          Serial.println("temp - see sensor temperature");
          Serial.print("autoon - auto start FANs than temp is more than ");
          Serial.print(tempON);
          Serial.print("°C and stop than its less than ");
          Serial.print(tempOFF);
          Serial.println("°C");
          Serial.println("autooff - stop auto FANS control");
        } 
     if (sdata == "autoon") 
        { autostate = 1;
          EEPROM.write(1, 1);
          Serial.println("    AUTO ON");
          Serial.print("FANs on temp ");
          Serial.print(tempON);
          Serial.println("°C");
          Serial.print("FANs off temp ");
          Serial.print(tempOFF);
          Serial.println("°C");
          Serial.print("Temperature now: ");         
          Serial.print(tempCUR); 
          Serial.println("°C");
        }       
      if (sdata == "autooff") 
        { autostate = 0;
          EEPROM.write(1, 0);
          Serial.println("    AUTO OFF");
          Serial.print("FANs on temp ");
          Serial.print(tempON);
          Serial.println("°C");
          Serial.print("FANs off temp ");
          Serial.print(tempOFF);
          Serial.println("°C");
          Serial.print("Temperature now: ");         
          Serial.print(tempCUR); 
          Serial.println("°C");  
        }        
     if (sdata == "temp") 
        {           
          Serial.print("Temperature now: "); 
          Serial.print(sensors.getTempCByIndex(0)); 
          Serial.println("°C");   
        }
     if (sdata == "off") 
        {       
          EEPROM.write(0, 0);
          EEPROM.write(1, 0);
          value = 0;
          autostate = 0;
          Serial.println("    FANs off (AUTO OFF)");
          Serial.print("Temperature now: ");         
          Serial.print(tempCUR); 
          Serial.println("°C"); 
        }
     if (sdata == "on") 
        {
          EEPROM.write(0, 1);
          EEPROM.write(1, 0);
          value = 1;
          autostate = 0;
          Serial.println("    FANs on (AUTO OFF)");
          Serial.print("Temperature now: ");         
          Serial.print(tempCUR); 
          Serial.println("°C"); 

        }   
         sdata = ""; // Clear the string ready for the next command.
        }
     }
}

Здесь надо только изменить конcтанты tempOFF tempON температуры при которых вентилтяоры будут отключаться и включаться, тут надо учесть место где окажется датчки, первое время посмотреть какую он температуру выдает!

Собираем все по схеме, заливаем скетч и ставим в компьютер. У меня корпус Coguar QBX, за чет SFF блока питания в нем есть отличное место чтобы привязать Arduino


Сам датчик распологается над памятью, рядом с видео картой — самым горячим местом ПК

К Arduino по serial port можно подключиться через программу Arduino Software (IDE) через меню Tools > Serial Monitor! Но я в Windows 10 буду подключаться через Putty!

Скачиваем Putty вот тут www.chiark.greenend.org.uk

В Windows смотрим вот тут Select Start > Settings > Devices > Bluetooth & other devices на каком COM порте появилась Arduino, у меня это COM4 с этими настройками и подключаемся, скорость 9600

В появившемся окне ввожу help нажимаю [enter] на экране я не вижу что ввожу!

Получаю список доступных команд

    HELP
on - FANs on (set auto off)
off - FANs off (set auto off)
temp - see sensor temperature
autoon - auto start FANs than temp is more than 45°C and stop than its less than 40°C
autooff - stop auto FANS control

Дальше смотрю температуру команда temp и [enter], она показывает температуру с сотыми
Включаю вентиляторы — это сразу выключает автоматический котроль.
Выключаю вентиляторы, и ставлю на авто — тут температура без сотых учитывается

Реле при срабатывание щелкает, так что всегда понятно что вентиляторы включились — ну и по шуму конечно понятно!


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *