原文:https://circuitdigest.com/microcontroller-projects/automatic-temperature-controlled-fan-project
参考资料
- Arduino关于DHT11和DHT22湿度和温度传感器的完整指南
- Arduino操控1602 LCD液晶屏 https://blog.csdn.net/acktomas/article/details/117074531
- 1602-LiquidCrystal库https://blog.csdn.net/acktomas/article/details/117075021
Arduino温度控制-根据温度调整风扇速度
在这个基于arduino的项目中,我们将使用Arduino构建 **温度控制风扇。**借助此电路,我们将能够根据室温来调节家庭或办公室中的风扇速度,并在16x2 LCD显示屏上显示温度和风扇速度的变化。为此,我们将使用Arduino UNO板,LCD,DHT11传感器模块和可通过PWM控制的DC风扇。让我们讨论更多有关此操作的信息,以便您可以自己构建一个。我们还建立了一个执行交流温度自动控制的项目 ,您也可以检查一下是否感兴趣。
所需组件
以下是使用Arduino执行基于温度的风扇速度控制所需的材料**。** 大多数组件应该可以在本地硬件商店轻松获得
- Arduino UNO
- DHT11传感器
- 直流风扇
- 2N2222晶体管
- 9伏电池
- 16x2液晶屏
- 1K电阻
- 连接线
使用温度传感器进行Arduino风扇速度控制
该项目包括三个部分。人们通过使用湿度和温度传感器即DHT11来感测温度。第二 部分读取dht11传感器模块的输出,并将温度值提取为以摄氏度为单位的合适数值,并使用PWM控制风扇速度。系统的最后一部分在LCD和风扇驱动器上显示湿度和温度。
在此项目中,我们使用了传感器模块DHT11,该模块已经讨论了我们先前的项目“使用Arduino进行湿度和温度测量”。在这里,我们仅使用该DHT传感器来感测温度,然后根据要求对arduino进行编程。
这个项目的工作非常简单。我们在arduino的pwm引脚上创建了PWM,并将其应用于晶体管的基极端子。然后,晶体管根据PWM输入产生电压。
风扇速度和PWM值以及占空比值在给定表中显示
温度 | 占空比 | PWM值 | 风扇转速 |
---|---|---|---|
<26 | 0% | 0 | 离开 |
26 | 20% | 51 | 20% |
27 | 40% | 102 | 40% |
28 | 60% | 153 | 60% |
29 | 80% | 204 | 80% |
>29 | 100% | 255 | 100% |
什么是PWM? PWM是一种通过使用我们可以控制电压或功率的技术。为了更简单地理解它,如果您施加5伏电压来驱动电动机,那么电动机将以一定速度运动,现在,如果我们将施加的电压减小2表示我们将3伏电压施加给电动机,那么电动机速度也会降低。该概念在项目中用于通过PWM控制电压。(要了解有关PWM的更多信息,请检查以下电路:1瓦LED调光器)
PWM的主要功能是具有一定占空比的数字脉冲,该占空比负责控制速度或电压。
假设我们有一个占空比为50%的电池,这意味着它将提供我们施加电压的一半。
占空比的公式如下:
占空比(Duty Cycle)= Ton/T
其中 T= (total time) or (Ton+Toff)
Ton =脉冲的导通时间(means 1)
Toff =脉冲关闭时间(means 0)
Arduino温度控制风扇电路图
该温度控制风扇电路的连接非常简单,此处使用液晶显示器显示温度和风扇速度状态。LCD以4位模式直接连接到Arduino(有关更多详细信息,请参阅本教程:LCD与Arduino Uno的接口)。LCD的引脚(即RS,EN,D4,D5,D6和D7)连接至Arduino数字引脚编号2、3、4、5、6、7。DHT11传感器模块连接至Arduino的数字引脚12。数字引脚9用于控制通过晶体管的风扇速度。
如果您正在寻找简单且更具成本效益的产品,则可以使用LM35和温控自动交流开关项目来检查 温控LED,它们都很容易构建并且不需要微控制器。
用于温控风扇的Arduino代码
首先,我们包括用于LCD和DHT传感器的库,然后为LCD,DHT传感器和风扇定义引脚。
#include <dht.h> // Including library for dht
#include <LiquidCrystal.h>
LiquidCrystal lcd(2,3,4,5,6,7);//连接的引脚需要按“ RS,En,D4,D5,D6,D7”的顺序表示
#define dht_dpin 12
dht DHT;
#define pwm 9
然后在设置循环中初始化所有内容。然后通过使用dht功能读取DHT传感器,然后使用一些dht功能循环提取温度并将其显示在LCD上。
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);
此后,我们将温度与预定义的温度数字进行比较,然后根据温度值生成PWM。
为了生成PWM,我们在8位中使用了“ analogWrite(pin,PWM value)”功能。如果PWM值等于模拟值,则表示平均值。因此,如果我们需要产生20%的占空比,则在“ analogWrite”函数中将255/5值作为PWM传递。
Code
#include <dht.h> // Including library for dht
#include <LiquidCrystal.h>
LiquidCrystal lcd(2,3,4,5,6,7);//连接的引脚需要按“ RS,En,D4,D5,D6,D7”的顺序表示
#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);
}