基于Arduino的自动调速风扇
好久沒(méi)有更新了,家里實(shí)在太亂,最近趁著618活動(dòng),買(mǎi)了一堆收納抽屜和置物架,把家里徹底收拾了一下,然后客廳就成了這個(gè)奇葩樣子,注孤生的節(jié)奏了。
話不多說(shuō),夏天到了,天氣逐漸熱起來(lái),風(fēng)扇成了必不可少的消暑利器。
本文主要介紹兩種基于Arduino的風(fēng)扇自動(dòng)調(diào)速方案,使用的是5V的USB風(fēng)扇,物美價(jià)廉還省電。
方案一是通過(guò)舵機(jī)控制旋鈕變壓器實(shí)現(xiàn)調(diào)速,方案二通過(guò)脈沖寬度調(diào)制(PWM)實(shí)現(xiàn)調(diào)速。
方案一:旋鈕變壓器
材料清單
| Arduino UNO | 1 | 15 |
| USB風(fēng)扇調(diào)速器 | 1 | 6 |
| DH11溫濕度傳感器 | 1 | 4 |
| SG90S舵機(jī) | 1 | 7.5 |
| 紅外接收模塊加遙控器 | 1 | 3.3 |
所用零件均可在淘寶買(mǎi)到,價(jià)格時(shí)有波動(dòng)。
思路是通過(guò)DH11溫濕度傳感器測(cè)量溫度,根據(jù)溫度控制舵機(jī)的角度,舵機(jī)的轉(zhuǎn)軸與USB風(fēng)扇調(diào)速器的旋鈕連接,帶動(dòng)旋鈕轉(zhuǎn)動(dòng),進(jìn)而控制風(fēng)扇的輸入電壓,實(shí)現(xiàn)轉(zhuǎn)速控制。
此外,增加了紅外控制,用于遠(yuǎn)程開(kāi)關(guān)風(fēng)扇,切換模式。
接線
代碼
需要紅外控制模塊和DH11溫濕度傳感器的庫(kù),代碼及庫(kù)的下載鏈接在文末。
3種紅外信號(hào)分別對(duì)應(yīng)全開(kāi)、全關(guān)和自動(dòng)模式。
自動(dòng)模式會(huì)根據(jù)室溫調(diào)節(jié)風(fēng)扇的轉(zhuǎn)速。
#include <dht.h> //調(diào)用dh11溫濕度傳感器的庫(kù) #include <IRremote.h> //調(diào)用紅外控制的庫(kù) #include <Servo.h> //調(diào)用舵機(jī)控制的庫(kù)dht DHT; Servo servo;#define RECV_PIN 9 //定義紅外接收器針腳 IRrecv irrecv(RECV_PIN); decode_results results;#define dataPin 10 //定義溫濕度傳感器針腳 int servoPin = 7; //定義舵機(jī)針腳 char value; //紅外接收器接收的數(shù)值 float t; //溫濕度傳感器測(cè)量的溫度數(shù)值 int a = 0; int b = 0; //a、b用于切換模式void setup() {irrecv.enableIRIn();servo.attach(servoPin);servo.write(0);delay(1000);servo.detach();//Serial.begin(9600); }void loop() {if (irrecv.decode(&results)) {if (results.value == 16753245) {a = 1;}if (results.value == 16736925) {a = 0;b = 0;}if (results.value == 16769565) {a = 0;b = 1;}irrecv.resume();}if (a == 0 && b == 0) {servo.attach(servoPin);servo.write(0);delay(1000);servo.detach(); //關(guān)閉風(fēng)扇}if (a == 0 && b == 1) {servo.attach(servoPin);servo.write(180);delay(1000);servo.detach(); //打開(kāi)風(fēng)扇}if (a == 1) {int readData = DHT.read11(dataPin);t = DHT.temperature;if (t <= 26) {servo.attach(servoPin);delay(1);servo.write(0);delay(500);servo.detach(); //自動(dòng)模式低于26度關(guān)風(fēng)扇}else if (t > 26 && t <= 28) {servo.attach(servoPin);delay(1);servo.write(60);delay(500);servo.detach(); //自動(dòng)模式26-28度一檔}else if (t > 28 && t <= 30) {servo.attach(servoPin);delay(1);servo.write(120);delay(500);servo.detach(); //自動(dòng)模式28-30度二檔}else if (t > 30 && t <= 40) {servo.attach(servoPin);delay(1);servo.write(180);delay(500);servo.detach(); //自動(dòng)模式高于30度全開(kāi)}//Serial.println(t);delay(1000);} }方案二:脈沖寬度調(diào)制(PWM)
脈沖寬度調(diào)制(pulse width modulation)通過(guò)快速打開(kāi)和關(guān)閉電源來(lái)調(diào)整發(fā)送到電子設(shè)備的平均電壓值。
平均電壓取決于占空比,占空比是指在一個(gè)脈沖循環(huán)內(nèi),通電時(shí)間相對(duì)于總時(shí)間所占的比例。
可以通過(guò)Arduino的脈寬調(diào)制輸出連接L298N電機(jī)驅(qū)動(dòng)模塊,并通過(guò)控制脈寬調(diào)制輸出來(lái)控制電機(jī)的速度。
通過(guò)下圖可以看出,輸入電壓為12V,當(dāng)占空比為0.25時(shí),平均電壓值為3V;當(dāng)占空比為0.5時(shí),平均電壓值為6V。
材料清單
| Arduino UNO | 1 | 15 |
| L298N電機(jī)控制模塊 | 1 | 6 |
| DH11溫濕度傳感器 | 1 | 4 |
所用零件均可在淘寶買(mǎi)到,價(jià)格時(shí)有波動(dòng)。
仍然是通過(guò)DH11溫濕度傳感器測(cè)量溫度,然后根據(jù)溫度計(jì)算占空比,改變L298N電機(jī)控制模塊的平均輸出電壓,實(shí)現(xiàn)轉(zhuǎn)速控制。
接線
代碼
需要L298N電機(jī)控制模塊和DH11溫濕度傳感器的庫(kù),代碼及庫(kù)的下載鏈接在文末。
通過(guò)map函數(shù)將室溫轉(zhuǎn)換為占空比。
motorSpeed = map(t, tempMin, tempMax, speedMin, speedMax);
以本文為例
motorSpeed = map(t, 28, 50, 30, 100);
上文已經(jīng)交代,占空比是指在一個(gè)脈沖循環(huán)內(nèi),通電時(shí)間相對(duì)于總時(shí)間所占的比例。
即溫度從28變化到50,占空比從0.3變化到1。
#include <Robojax_L298N_DC_motor.h> //調(diào)用L298N模塊的庫(kù) #include <dht.h> //調(diào)用dh11溫濕度傳感器的庫(kù)dht DHT; #define IN1 2 #define IN2 4 #define ENA 3 //必須是帶有~符號(hào)的PWM針腳const int CCW = 2; //反轉(zhuǎn) const int CW = 1; //正轉(zhuǎn) const int motorDirection = CW; #define motor1 1 Robojax_L298N_DC_motor motor(IN1, IN2, ENA, true);#define dataPin 10 //定義溫濕度傳感器針腳 float t; //溫濕度傳感器測(cè)量的溫度數(shù)值const float tempMin = 28.0; //溫度下限 const int speedMin = 30; //轉(zhuǎn)速下限 const float tempMax = 50.0; //溫度上限 const int speedMax = 100; //轉(zhuǎn)速上限int motorSpeed; //根據(jù)溫度計(jì)算出的轉(zhuǎn)速void setup() {motor.begin(); }void loop() {tempToSpeed();motor.rotate(motor1, motorSpeed, motorDirection);delay(500); }void tempToSpeed() {float readData = DHT.read11(dataPin);t = DHT.temperature;motorSpeed = map(t, tempMin, tempMax, speedMin, speedMax);if (t < tempMin){motorSpeed = 0;motor.brake(1); //溫度低于下限停止}if (t > tempMax){motorSpeed = 100; //溫度高于上限全開(kāi)} }代碼及庫(kù)下載的鏈接
- 方案一代碼
提取碼:vgwz - 方案二代碼
提取碼:akgf - 紅外控制模塊庫(kù)
提取碼:ldhx - DH11溫濕度傳感器庫(kù)
提取碼:9x70 - L298N電機(jī)控制模塊庫(kù)
提取碼:8vek
本人菜鳥(niǎo),發(fā)現(xiàn)錯(cuò)誤,歡迎指出,謝謝大家。
總結(jié)
以上是生活随笔為你收集整理的基于Arduino的自动调速风扇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 金蝶EAS开发笔记
- 下一篇: 为什么MOSFET栅极与源极之间要加一个