利用Arduino的自动风扇速度控制电路设计

描述

利用Arduino的自动风扇速度控制电路设计(一)

自动风扇速度控制电路Arduino LM35编程非常容易实验,可用于根据温度水平通过继电器控制任何目标设备。对于这里的温度测量,我们使用 LM35,这是一种精密集成电路温度器件,其输出电压与摄氏度温度成线性比例。由于其输出特性,我们在输出值计算中不需要采用开尔文。该LM35温度传感器无需任何外部元件即可工作,只需要4 V至30 V稳压直流电源作为偏置。在此电路中,我们使用 Arduino 开发板的 +5V DC。该传感器在室温下提供±1/4°C的温度输出,在-55°C至150°C的整个温度范围内提供±3/4°C的温度输出。

由于该 LM35 提供模拟输出(线性 + 10-mV/°C 比例因子),因此我们可以将 LM35 的输出引脚直接连接到 Arduino 板的任何模拟输入引脚。 LM35 可以采用单电源或双电源供电,其自身运行功耗仅为 60 μA。它有不同的封装,如 TO-CAN (3)、TO-92 (3)。这里我们使用德州仪器 (TI) 的 LM35 TO-92。

Arduino

直流风扇控制电路图

Arduino

继电器(交流风扇)控制电路图

Arduino

该电路可以构建在面包板或普通 PCB 板上,具有额外的 12V 直流电源用于风扇或继电器。如前所述,LM35 只需要 5V,因此 Arduino 的 5V 引脚和 Gnd 引脚与 LM35 连接,输出引脚直接连接到模拟输入引脚 A0,并在以下程序中提到。指示 LED 与数字引脚 D8 连接并声明为输出引脚。 D3 PWM引脚声明为输出引脚,连接至开关晶体管 2N2219A 的基极。这里我们必须根据 LM35 感测到的温度水平来更改输出脉冲宽度。顺便说一下,我们可以达到不同的速度级别。每当温度传感器检测到 Arduino 外部的温度变化时,D3 引脚的 PWM 输出就会发生变化,因此风扇的速度也会发生变化。

为了控制继电器,使用 D3 引脚作为数字输出引脚并在 Arduino 代码中声明它。这样我们只能根据温度水平来打开和关闭交流风扇。根据温度水平使用任何目标负载来打开和关闭。每当温度传感器检测到温度变化超过 30°C 时,Arduino 就会改变 D3 引脚的数字输出(高电平),从而风扇速度发生变化。低于 25°C 时,D3 引脚的数字输出变为(低)。

自动风扇速度控制电路Arduino LM35编程

int tempPin = A0;   // connect Sensor output pin
int fan = 3;       // Output drive for fan
int led = 8;        // fan status led pin
int temp;
int tempMin = 25;   // Minimum temperature to start the fan
int tempMax = 75;   // Maximum temperature to turn fan at 100% speed
int fanSpeed;
 
void setup() {
  pinMode(fan, OUTPUT);
  pinMode(led, OUTPUT);
  pinMode(tempPin, INPUT);
  Serial.begin(9600);  // Initialize serial communication at 9600 baud rate
}
 
void loop() {  
   temp = readTemp();     // read temperature
   Serial.print("Temperature: ");
   Serial.print(temp);
   Serial.println(" °C");
   
   if(temp < tempMin) {   // if temp is lower than minimum temperature
       fanSpeed = 0;      // fan is off
       digitalWrite(fan, LOW);
       Serial.println("Fan Speed: OFF");
   } 
   if((temp >= tempMin) && (temp <= tempMax)) {  // if temperature is higher than minimum temperature
       fanSpeed = map(temp, tempMin, tempMax, 32, 255); 
       analogWrite(fan, fanSpeed);  // spin the fan at the fanSpeed speed
       Serial.print("Fan Speed: ");
       Serial.println(fanSpeed);
   } 
   
   if(temp > tempMax) {        // if temp is higher than tempMax
     digitalWrite(led, HIGH);  // turn on led 
     Serial.println("Fan Status: Overheating!");
   } else {                    // else turn off led
     digitalWrite(led, LOW); 
     Serial.println("Fan Status: Normal");
   }
   delay(1000); // Delay for 1 second before reading temperature again
 }
 
int readTemp() {  // get temperature and convert it to celsius
  temp = analogRead(tempPin);
  return temp * 0.48828125;
}

自动继电器控制电路Arduino LM35编程

const int tempPin = A0;    // LM35 temperature sensor connected to analog pin A0
const int relayPin = 3;    // Relay control pin connected to digital pin 2

const int tempThresholdHigh = 30;  // Temperature threshold to turn on the relay (in Celsius)
const int tempThresholdLow = 25;   // Temperature threshold to turn off the relay (in Celsius)

void setup() {
  pinMode(tempPin, INPUT);
  pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, LOW);  // Ensure the relay is initially off
  Serial.begin(9600);
}

void loop() {
  int tempValue = analogRead(tempPin);  // Read temperature value from LM35 sensor
  float temperature = (tempValue * 0.48828125);  // Convert analog reading to Celsius
  
  Serial.print("Temperature: ");
  Serial.print(temperature);
  Serial.println(" °C");
  
  // Check temperature and control the relay
  if (temperature >= tempThresholdHigh) {
    digitalWrite(relayPin, HIGH);  // Turn on the relay
    Serial.println("Relay Status: ON");
  } else if (temperature <= tempThresholdLow) {
    digitalWrite(relayPin, LOW);  // Turn off the relay
    Serial.println("Relay Status: OFF");
  }
  
  delay(1000);  // Delay for 1 second before reading temperature again
}

在上面的两个程序中,我们使用以下方法将模拟输出电压从 LM35 转换为摄氏度

int readTemp() {

temp = analogRead(tempPin);

return temp * 0.48828125;

}

利用Arduino的自动风扇速度控制电路设计(二)

大多数时候,人们在离开房间时仍然开着风扇,因为他们忘记将其关闭。他们甚至将风扇设置为最高速度,无论外面的天气如何。所有这些习惯每天都会消耗和浪费越来越多的电力。为此,我们需要制作一个风扇可以自动打开和关闭的风扇。

这里风扇的速度可以通过改变输入电源来改变,但是如果我们需要根据温度变化来改变风扇速度。然后我们必须在系统中实现微控制器(Arduino)和温度传感器 LM 35。现在风扇可以根据房间内的温度变化来改变速度。所有这些都将节省大量电力。

电路原理图

Arduino

如图电路图所示,电路的主要部分是Arduino Uno板和LM35温度传感器。这里传感器的输出直接与Arduino板的模拟输入A0引脚连接,LED1与数字引脚D8连接。输出取自Arduino的D11引脚。现在您可以选择任何具有 PWM 功能的数字引脚作为输出引脚,为此,我们也必须在 Arduino 程序代码中进行这些更改。这里给出的代码基于 D11 引脚作为输出。每当温度传感器检测到 Arduino 外部的温度变化时,D11 引脚的 PWM 输出就会发生变化,因此风扇的速度也会发生变化。此外,在该电路中,SL100 晶体管充当开关晶体管。我们需要一个12V电源来偏置电路。

Arduino代码

#include < LiquidCrystal.h >
LiquidCrystal lcd(7,6,5,4,3,2);
int tempPin = A0;   // connect Sensor output pin
int fan = 11;       // Output drive for fan
int led = 8;        // fan status led pin
int temp;
int tempMin = 25;   // Minimum temperature to start the fan
int tempMax = 75;   // Maximum temperature to turn fan at 100% speed
int fanSpeed;
int fanLCD;
 
void setup() {
  pinMode(fan, OUTPUT);
  pinMode(led, OUTPUT);
  pinMode(tempPin, INPUT);
  lcd.begin(16,2);  
}
 
void loop() {  
   temp = readTemp();     // read temperature
   if(temp < tempMin) {   // if temp is lower than minimum temperature
       fanSpeed = 0;      // fan is off
       digitalWrite(fan, LOW);       
   } 
   if((temp >= tempMin) && (temp <= tempMax)) {  // if temperature is higher than minimum temperature
       fanSpeed = map(temp, tempMin, tempMax, 32, 255); 
       fanLCD = map(temp, tempMin, tempMax, 0, 100);  // speed of fan to display on LCD
       analogWrite(fan, fanSpeed);  // spin the fan at the fanSpeed speed
   } 
   
   if(temp > tempMax) {        // if temp is higher than tempMax
     digitalWrite(led, HIGH);  // turn on led 
   } else {                    // else turn off led
     digitalWrite(led, LOW); 
   }
   
   lcd.print("TEMP: ");
   lcd.print(temp);      // display the temperature
   lcd.print("C ");
   lcd.setCursor(0,1);   
   lcd.print("FANS: ");
   lcd.print(fanLCD);    // display the fan speed
   lcd.print("%");
   delay(200);
   lcd.clear();   
}
 
int readTemp() {  // get temperature and convert it to celsius
  temp = analogRead(tempPin);
  return temp * 0.48828125;
}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分