Управляем вентилятором с помощью Arduino

Хотите автоматизировать работу вентилятора? С помощью Arduino и датчика температуры LM35 это возможно!

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/digitrode/139-upravlyaem-ventilyatorom-s-pomoschyu-arduino/images/upravlyaem-ventilyatorom-s-pomoschyu-arduino-1.jpg

Схема:

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/digitrode/139-upravlyaem-ventilyatorom-s-pomoschyu-arduino/images/upravlyaem-ventilyatorom-s-pomoschyu-arduino-2.png

Код:

#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,5,4,3,2);
int tempPin = A1; // выход LM35
int fan = 11; // вывод на вентилятор
int led = 8; // вывод на светодиод
int temp;
int tempMin = 30; // температура начала вращения вентилятора
int tempMax = 70; // максимальная температура, когда вентилятор вращается на 100%
int fanSpeed;
int fanLCD;

void setup() {
pinMode(fan, OUTPUT);
pinMode(led, OUTPUT);
pinMode(tempPin, INPUT);
lcd.begin(16,2);
}

void loop() {
temp = readTemp(); // получаем температуру
if(temp < tempMin) { // если temp меньше минимума
fanSpeed = 0; // кулер не вращается
digitalWrite(fan, LOW);
}
if((temp >= tempMin) && (temp <= tempMax)) { // если temp больше минимума
fanSpeed = map(temp, tempMin, tempMax, 32, 255); // текущая скорость вентилятора
fanLCD = map(temp, tempMin, tempMax, 0, 100); // скорость вращения для отображения на LCD
analogWrite(fan, fanSpeed); // вращаем кулер со скоростью fanSpeed
}
if(temp > tempMax) { // если temp больше максимума
digitalWrite(led, HIGH); // включаем светодиод
} else { // иначе выключаем светодиод
digitalWrite(led, LOW);
}
lcd.print("TEMP: ");
lcd.print(temp); // отображение температуры
lcd.print("C ");
lcd.setCursor(0,1); // перевод курсора на следующую сторку
lcd.print("FANS: ");
lcd.print(fanLCD); // отображение скорости вращения вентилятора
lcd.print("%");
delay(200);
lcd.clear();
}

int readTemp() { // получить температуру и переконвертировать ее в цельсии
temp = analogRead(tempPin);
return temp * 0.48828125;
}

При желании для визуализации значения температуры можно использовать LCD-дисплей. Для этого в код включена библиотека LiquidCrystal. Также следует для конкретного типа вентилятора подобрать свой транзистор. В данном случае используется широко распространенный BD139.

Важно задать требуемые значения tempMin и tempMax. Значение tempMin определяет теипературу, при которой вентилятор начинает вращаться, а tempMax представляет температуру, при достижении которой загорится красный светодиод, оповещающий о достижении максимальной температуры. Например, если установить tempMin=30, а tempMax=35, то кулер начнет вращаться при температуре 30°C, и достигнет максимальной скорости при температуре 35°C.

Текущее значение температуры сохраняется в переменной temp, а затем используются структуры if() для сравнения этой переменной с tempMin. Если temp меньше tempMin, то вентилятор отключается. Следующий if() сравнивает, больше ли temp значение minTemp и меньше tempMax. И если это так, то используется функция map() для преобразования temp из одного значения в другое. В нашем случае переменная fanSpeed будет иметь значение 32 при tempMin и 255 при tempMax. Этизначения применяются для управления скоростью вентилятора с помощью ШИМ и функции analogWrite().

fanLCD преобразует temp в диапазон от 0% до 100%, что соответствует полной остановки кулера и максимальной скорости вращения.