Arduino Temperature Control - Adjust Fan Speed based on Temperature

Published  August 3, 2015   94
S Saddam
Author
Automatic Temperature Controlled Fan Project using Arduino

In this arduino based project, we are going to build a temperature-controlled fan using Arduino. With this circuit, we will be able to adjust the fan speed in our home or office according to the room temperature and also show the temperature and fan speed changes on a 16x2 LCD display. To do this we will be using an Arduino UNO Board, LCD, DHT11 sensor Module, and DC fan that is controlled by using PWM. Let's discuss more on this is done so that you can build one on your own. We have also built a project to perform Automatic AC temperature control, you can also check that out if you are intrested. 

 

Components Required

The following are the materials required to perform a temperature-based fan speed control using Arduino. Most of the components should be easily available in your local hardware shop 

  1. Arduino UNO

  2. DHT11 sensor

  3. DC Fan

  4. 2n2222 transistor

  5. 9 volt battery

  6. 16x2 LCD

  7. 1K resistor

  8. Connecting wires

 

Arduino Fan Speed Control using Temperature Sesnor 

This project consists of three sections. One senses the temperature by using humidity and temperature sensor namely DHT11. The second section reads the dht11 sensor module’s output and extracts temperature value into a suitable number in Celsius scale and control the fan speed by using PWM. And last part of system shows humidity and temperature on LCD and Fan driver.

Here in this project, we have used a sensor module namely DHT11 that already has discuss our previous project namely “Humidity and Temperature Measurement using Arduino”. Here we have only used this DHT sensor for sensing temperature, and then programmed our arduino according to the requirements.

Working on this project is very simple. We have created PWM at pwm pin of arduino and applied it at base terminal of the transistor. Then transistor creates a voltage according to the PWM input.

PWM Wave Form

Fan speed and PWM values and duty cycles values are showing in given table

Temperature

Duty Cycle

PWM Value

Fan Speed

Less 26

0%

0

Off

26

20 %

51

20%

27

40%

102

40%

28

60%

153

60%

29

80%

204

80%

Greater 29

100%

255

100%

 

What is PWM? PWM is a technique by using we can control the voltage or power. To understand it more simply, if you are applying 5 volt for driving a motor then motor will moving with some speed, now if we reduces applied voltage by 2 means we apply 3 volts to motor then motor speed also decreases. This concept is used in the project to control the voltage using PWM. (To understand more about PWM, check this circuit: 1 Watt LED Dimmer)

PWM

The main game of PWM is digital pulse with some duty cycle and this duty cycle is responsible for controlling the speed or voltage.

Suppose we have a pule with duty cycle 50% that means it will give half of voltage that we apply.

Formula for duty cycle given below:

Duty Cycle=  Ton/T

Where T= total time or Ton+Toff

And Ton= On time of pulse (means 1 )

And Toff= Off time of pulse (means 0)

50% Duty Cycle

10% Duty Cycle

90% Duty Cycle

PWM 4

 

Arduino Temperature Controlled Fan Circuit Diagram 

Connections of this temperature controlled fan circuit is very simple, here a liquid crystal display is used for displaying temperature and Fan speed Status. LCD is directly connected to Arduino in 4-bit mode (Check this tutorial for more details: LCD Interfacing with Arduino Uno). Pins of LCD namely RS, EN, D4, D5, D6 and D7 are connected to Arduino digital pin number 7, 6, 5, 4, 3 and 2. And a DHT11 sensor module is also connected to digital pin 12 of Arduino. Digital pin 9 is used for controlling fan speed through the transistor.

Temperature Controlled Fan Circuit Diagram

 

If you are looking for something simple and more cost-effective you can check out the temperature controlled LED using LM35 and Temperature controlled Automatic AC switch projects, both of them are very easy to built and does not need a microcontroller. 

 

Arduino Code for temperature-controlled fan 

First, we include the library for LCD and DHT sensor and then define pin for lcd, dht sensor and for fan.

Define

Then initialize all the things in setup loop. And in loop by using dht function reads DHT sensor and then using some dht functions we extract temperature and display these on LCD.

Temperature reading

After this we compare the temperature with pre define temperature digit and then generate PWM according to the temperature value.

check

For generating PWM we have used “analogWrite(pin, PWM value)” fuction in 8 bit. Mean if PWM value is equivalent of analog value. So if we need to generate 20% of duty cycle then we pass 255/5 value as PWM in “analogWrite” Function. 

Code

#include<dht.h>      // Including library for dht
#include<LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

#define dht_dpin 12 
dht DHT;

#define pwm 9

byte degree[8] = 
              {
                0b00011,
                0b00011,
                0b00000,
                0b00000,
                0b00000,
                0b00000,
                0b00000,
                0b00000
              };

void setup()
{
 lcd.begin(16, 2);
 lcd.createChar(1, degree);
 lcd.clear();
 lcd.print("   Fan Speed  ");
 lcd.setCursor(0,1);
 lcd.print("  Controlling ");
 delay(2000);
 analogWrite(pwm, 255);
 lcd.clear();
 lcd.print("Circuit Digest ");
 delay(2000);
}

void loop()
{
  DHT.read11(dht_dpin);
  int temp=DHT.temperature;
  lcd.setCursor(0,0);
  lcd.print("Temperature:");
  lcd.print(temp);   // Printing temperature on LCD
  lcd.write(1);
  lcd.print("C");
  lcd.setCursor(0,1);
  if(temp <26 )
    { 
      analogWrite(9,0);
      lcd.print("Fan OFF            ");
      delay(100);
    }
    
    else if(temp==26)
    {
      analogWrite(pwm, 51);
      lcd.print("Fan Speed: 20%   ");
      delay(100);
    }
    
     else if(temp==27)
    {
      analogWrite(pwm, 102);
      lcd.print("Fan Speed: 40%   ");
      delay(100);
    }
    
     else if(temp==28)
    {
      analogWrite(pwm, 153);
      lcd.print("Fan Speed: 60%   ");
      delay(100);
    }
    
    else if(temp==29)
    {
      analogWrite(pwm, 204);
      lcd.print("Fan Speed: 80%    ");
      delay(100);
    }
     else if(temp>29)
    {
      analogWrite(pwm, 255);
      lcd.print("Fan Speed: 100%   ");
      delay(100);
    } 
  delay(3000);
}

Video

Comments

Submitted by vikram on Mon, 08/31/2015 - 00:11

Permalink

arduino ide is showing compilation error due to the dht library. kindly specify the library used in your program code as dht.h is not a valid library

i already change dht.h to DHT.h but i got another error:

pwn_fan.ino:6:1: error: 'dht' does not name a type
pwn_fan.ino: In function 'void loop()':
pwn_fan.ino:39:6: error: expected unqualified-id before '.' token
pwn_fan.ino:40:15: error: expected primary-expression before '.' token
pwn_fan.ino:87:14: error: expected '}' at end of input
Error compiling.

how can i fix this? can you help me please... thanks in advance

Submitted by saleem on Tue, 10/27/2015 - 12:54

Permalink

hello, i want to ask. how did you show the data on digital oscilloscope? is it the interface that allow us to manipulate the temperature setting or anything like that? thank you

Submitted by saddam4201 on Mon, 11/02/2015 - 11:12

Permalink

There is no problem in compiling the code. You need to add DHT library in arduono ide library folder.
Thank you

Submitted by omi on Wed, 11/25/2015 - 13:20

Permalink

I've already run your codes without any error... but the fan spinning at the same speed even though in different temperature. could you help me with the problem please... this technique is so crucial to my project. thank you

Submitted by dhea on Fri, 01/01/2016 - 18:10

Permalink

hallo, by the way thank you for your shared
i have a problem when i want to compile the source code, arduino says 'dht' was not name a type
what should i do?
please your advice
thank you anyway

Submitted by jpaul on Thu, 02/11/2016 - 17:22

Permalink

please assist,
Even after downloading and installing the DHT file,when i compile the code,i get this error
Exit status 1
'dht' does not name a type
Can you assist please? Thank you

Please read all the above comments carefully, and install the DHT library properly, and make sure that dht.h file is there in the folder. Remember that header file name is case sensitive, if file in the DHT library folder is DHT.h then use DHT.h not dht.h

Submitted by Rakesh on Sat, 02/13/2016 - 20:13

Permalink

Does anyone compiled this using proteus if done Please mail to me Thanks in advance. please this is my final year project.you can save my ass.

Submitted by Balwant deshmukh on Sun, 04/03/2016 - 15:58

Permalink

Display shows garbage value and fan does not rotate
connection and program written as per given
And compiled and uploaded properly

Submitted by Austin Melhado on Mon, 05/16/2016 - 21:58

Permalink

it terms of the diagram connection for the fan, is everything correct does there need a ground added to the fan as mention in the first comment or is everything correct

Submitted by Dhruv Mehta on Sat, 06/04/2016 - 17:12

Permalink

friend this connection is for servo ,motor u need to connect fan and wen u connect fan it is nessery to give ground to the ground in auredino if u do dis ur project wil run sucessfully and it will work properly

Submitted by Sachin on Sun, 06/12/2016 - 03:57

Permalink

Please can you explain the resistor parts? To where the two resistors are exactly connecting to? It's not very clear for me and I need to do this as my project so please help?

Submitted by Mohammad Shoaib on Mon, 07/18/2016 - 17:22

Permalink

I have same problem that is:
_12:6: error: 'dht' does not name a type
_12.ino: In function 'void loop()':
_12:39: error: 'DHT' was not declared in this scope

please help me as i am beginner about arduino.
I need final working code.Please please help me.
[]

Submitted by Jay on Tue, 08/02/2016 - 04:15

Permalink

Instead of using a battery, can I use a 12V power adapter and have the ground from the fan into ground on my board, and the 12v power running through the 2n2222 transistor and the power from fan into the other end of the 2n2222 transistor?

Submitted by deadpool on Mon, 10/03/2016 - 16:07

Permalink

Sir , I'm having a problem I tried to compile the code but there was an error "LiquidCrystal" does not name a type I hope you could help me here thank you

Submitted by Salman on Sat, 10/29/2016 - 07:30

Permalink

Instead of DHT11. Is it possible to use DHT22. I have read in many articles, DHT22 have more accuracy. So I guess DHT22 will be more useful. If it is possible to use, will be there any change in coding and other electronic components used in the circuit ??

Submitted by Quinno on Wed, 11/09/2016 - 17:27

Permalink

Can I know what is the voltage of the DC fan used in this project?

Submitted by Shubhang kedia on Thu, 11/17/2016 - 22:48

Permalink

i did all the things same as said but my fan moves at constant speed.....it doesn't even switches off when temperature falls below the limit and its speed doesn't increases when temperature increases...
PLEASE HELP..

Thanks a lot!
It's only after I read your comment I was able to get my fan to stop spinning at a constant speed for all temp.
Great project,very useful.
So yeah, if your error is that fan is spinning at constant speed connect negative of fan to collector of 2222 ,negative of 9V to emitter and a wire from emitter to GND line of arduino.

New to this environment and struggling with finding the right combination of library and code statements.  The constant appears to be  'dht' does not name a type.  The library you refer to does not appear in the library manager - updated, renamed or absorbed into a larger one ?  

I was hoping this 'Temperature controlled Fan' would be working on my Solar furnace by now but this code problem has held me up 2 long and frustrating days.....

Any more specific direction on this library/code would be appreciated.

Submitted by sai vasavi on Mon, 02/06/2017 - 16:01

Permalink

We are doing this project,.while running this code we are getting an error like (fatal error:dht.h: No such file or directory.
Compilation terminated

Submitted by Shankar on Thu, 03/09/2017 - 18:03

Permalink

Why should we use DHT 11 or DHT 22 or LM 35 or any what is the reason behind that and you use the dht11 is there any consumption or anything else.....

Submitted by Kuldeep Detroja on Sun, 03/26/2017 - 11:32

Permalink

In proteus it shows these errors: 1.cannot find model file 'DHTXX.MDF'
2.Missing interface model 'DHTXXITF' IN U1 #P
3. PIN 'DATA' is not modelled
4. PIN 'VDD' is not modelled
5. PIN 'GND' is not modelled
Please please help me to solve all these errors and run simulation of this project.

Submitted by simran on Fri, 03/31/2017 - 19:36

Permalink

It's working! But I don't understand meaning of those byte degree values in the code. Plz explain me==>
byte degree[8] =
{
0b00011,
0b00011,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};

Submitted by Adithya on Sun, 04/02/2017 - 15:13

Permalink

As Sai vasavi mentioned above, even I'm getting the same error:dht.h: No such file or directory. Compilation terminated. Please send the exact link of the library and executable code asap as it is to be submitted tomorrow.

Submitted by Sya on Sun, 09/10/2017 - 16:11

Permalink

what is the voltage of the DC fan used in this project? If the voltage of fan is 5 v , and used battery 9v, so we must use voltage regulator or not?

Submitted by Debasish Kalita on Sun, 10/08/2017 - 16:20

Permalink

Arduino: 1.8.1 (Windows 8.1), Board: "Arduino/Genuino Uno"

C:\Users\Debasish Kalita\Documents\Arduino\random\random.ino:1:50: fatal error: dht.h: No such file or directory

#include<dht.h> // Including library for dht

^

compilation terminated.

exit status 1
Error compiling for board Arduino/Genuino Uno.

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

Submitted by Anonymous on Sat, 03/10/2018 - 21:16

Permalink

Can I use arduino nano instead of uno?
and Can I use a thermistor instead of dht11?

Submitted by akira on Sun, 03/11/2018 - 10:54

Permalink

Please how to fix this error

#include <Adafruit_Sensor.h>

^

compilation terminated.

exit status 1
Error compiling for board Arduino/Genuino Uno

Submitted by Danyaal Tayyabkhan on Tue, 03/13/2018 - 06:18

Permalink

i get this error:
Arduino: 1.8.5 (Mac OS X), Board: "Arduino/Genuino Uno"

In file included from /Users/DanyaalT/Documents/Arduino/libraries/DHT-sensor-library-master/DHT_U.cpp:22:0:
/Users/DanyaalT/Documents/Arduino/libraries/DHT-sensor-library-master/DHT_U.h:25:29: fatal error: Adafruit_Sensor.h: No such file or directory
#include <Adafruit_Sensor.h>

^
compilation terminated.
exit status 1
Error compiling for board Arduino/Genuino Uno.

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

what can i do

Submitted by AISHA on Tue, 03/13/2018 - 13:06

In reply to by Danyaal Tayyabkhan

Permalink

You did not add the adafruit_sensor library  to your Arduino IDE correctly.. Try adding it again follow the tutorial to know how it is done 

Hii @Clyde ,, your query is excatly correct, fan keeps rotaing at constant speed. It means Battery supply is directly given to fan.

Means there is no use of code for changing fan speed.

please help us

No it does not mean battery is connected directly fan. As you can see there is a switching transistor in-between the fan and battery. If your fan does not reduce speed it means the transistor is not switching.

Try turning off the fan completly to check if the transistor is working

Submitted by Darshan on Sat, 04/28/2018 - 12:57

Permalink

Even though i have installed the DHT library files,there are lots of error while compiling the program please do correct the program and upload it .

Submitted by Lachie on Tue, 08/21/2018 - 08:01

Permalink

Arduino: 1.8.5 (Windows Store 1.8.10.0) (Windows 10), Board: "Arduino/Genuino Uno"

dht11 DHT11;

^

In function 'void loop()':

sketch_aug17b:34: error: request for member 'read' in '11', which is of non-class type 'int'

DHT11.read(DHT11pin);

^

sketch_aug17b:34: error: 'DHT11pin' was not declared in this scope

DHT11.read(DHT11pin);

^

sketch_aug17b:35: error: request for member 'temperature' in '11', which is of non-class type 'int'

int temp=DHT11.temperature;

^

'dht11' does not name a type
Any suggestions for a solution?

Submitted by Angikar on Thu, 09/06/2018 - 21:30

Permalink

code is executing properly but the lcd does not show any data. Have tried with multiple lcds but shows the same thing....please help!!

Dear Saddam, thanks for the great share. It is working perfect. Just wanted to know how many identical items can I connect to this PWM ? Or how can I run multiple PWM circuits for multiple fans ? Thanks 

I want to control the speed of 3 fans (Not seperately, they will all run same speed regarding the enviroment temperature) They are all 12v 0,30A. Can I connect all 3 to the same PWM circuit ? In other words how many amperes can I run through the circuit ? Thanks

After messing around with issues as descibed in the comments I got it working with these libraries and code below. Hope this helps.

Libraries:

DHT_sensor_library 1.3.0
Adafruit_Unified_Sensor 1.0.2

Code:

//**TEMPERATURE CONTROLLED FAN**
//Authored by Saddam of Circuit Digest 03/08/18
//Modified to work with later DHT libraries by Tim Verkerk 27/11/18

#include<DHT.h>      // Including library for DHT
#include<DHT_U.h>
#include<LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

#define DHTPIN 12 
#define DHTTYPE DHT11
DHT dht(DHTPIN,DHTTYPE);

#define pwm 9

byte degree[8] = 
              {
                0b00011,
                0b00011,
                0b00000,
                0b00000,
                0b00000,
                0b00000,
                0b00000,
                0b00000
              };

void setup()
{
 lcd.begin(16, 2);
 lcd.createChar(1, degree);
 lcd.clear();
 lcd.print("   FAN SPEED  ");
 lcd.setCursor(0,1);
 lcd.print("  CONTROLLER ");
 delay(2000);
 analogWrite(pwm, 255);
 lcd.clear();
 lcd.print("STARTING ");
 delay(2000);
}

void loop()
{
  int temp= dht.readTemperature();
  lcd.setCursor(0,0);
  lcd.print("Temperature:");
  lcd.print(temp);   // Printing temperature on LCD
  lcd.write(1);
  lcd.print("C");
  lcd.setCursor(0,1);
  if(temp <26 )
    { 
      analogWrite(9,0);
      lcd.print("Fan OFF            ");
      delay(100);
    }
    
    else if(temp==26)
    {
      analogWrite(pwm, 51);
      lcd.print("Fan Speed: 20%   ");
      delay(100);
    }
    
     else if(temp==27)
    {
      analogWrite(pwm, 102);
      lcd.print("Fan Speed: 40%   ");
      delay(100);
    }
    
     else if(temp==28)
    {
      analogWrite(pwm, 153);
      lcd.print("Fan Speed: 60%   ");
      delay(100);
    }
    
    else if(temp==29)
    {
      analogWrite(pwm, 204);
      lcd.print("Fan Speed: 80%    ");
      delay(100);
    }
     else if(temp>29)
    {
      analogWrite(pwm, 255);
      lcd.print("Fan Speed: 100%   ");
      delay(100);
    } 
  delay(3000);
}