前文中已經可以使用Arduino的PWM 接腳來控制4pin PC風扇,
但實務上使用會遇到一些困難,首先就如同之前討論PC風扇的文章中所說,
4pin風扇較貴,且普及率遠不如另外兩種VC(電壓控制)與傳統2pin風扇,
所以可以利用Arduino的PWM輸出接腳來控制MOSFET,進而達到
控制所有種類風扇的轉速功能。
我選用手上現有的IFR540N這顆MOSFET作為主控MOSFET。
其特點是高耐壓高電流與低導通電阻,可以推動多顆PC風扇而不需要散熱片,
主要規格如下:
輸出電路圖:
紅色Motor為負載,可為馬達或風扇,接pin9或其他PWM接腳都可以。
程式可以完全照用上一章的程式不用修改:
int fan = 9; //設定 Arduino 風扇腳位在 9 pin
void setup() {
// 初始化傳輸速率設定為9600
Serial.begin(9600);
pinMode(fan, OUTPUT); //定義 pinmode 為 pin 9 OUTPUT 輸出
}
void loop() {
// 讀取輸入 on analog pin 0:
int pot = analogRead(A0); //設定A0 值為讀取類比訊號
int fan_speed = pot * (255 / 1023.0); //這個公式將會計算風扇速度的pwm輸出介於 0-255
analogWrite(fan,fan_speed); //我們設定 9 pin 為 pwm 風扇速度輸出
Serial.println(fan_speed); //利用 Serial.println函數可以在序列監控視窗中輸出風扇速度的值
delay(1000); // 我希望每秒鐘可以延遲印出值
}
可變電阻接到A0,即可用可變電阻來改變風扇轉速,並將PWM數值輸出到com port。
稍做修改即可將輸出改為1602A LCD螢幕:
/*
使用1602A I2C LCD模組及函式庫
LCD I2C Library,從這裡可以下載:
https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
本程式使用Newliquidcrystal_1.3.5版函式庫
PWM輸出為pin 9
可變電阻輸入為A0
程式目的:將轉動VR後的角度比例輸出到PWM接腳
程式名稱:Fan_Speed_1
作者:Lu yaku
日期:2018.05.10
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// 初始化 I2C 1602A LCD,I2C預設地址為0x27
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
int fan = 9; //設定 Arduino 風扇腳位在 9 pin
void setup() {
lcd.begin(16, 2);
// 閃爍三次
for(int i = 0; i < 3; i++) {
lcd.backlight(); // 開啟背光
delay(250);
lcd.noBacklight(); // 關閉背光
delay(250);
}
lcd.backlight();
delay(250);
// 輸出初始化文字
lcd.setCursor(0, 0); // 設定游標位置在第一行行首
lcd.print("Hello, world!");
delay(1000);
lcd.setCursor(0, 1); // 設定游標位置在第二行行首
lcd.print("LCD is Working!");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DCFAN PWM Output");
pinMode(fan, OUTPUT); //定義 pinmode 為 pin 9 OUTPUT 輸出
}
void loop() {
// 讀取輸入 on analog pin 0:
int pot = analogRead(A0); //設定A0 值為讀取類比訊號
int fan_speed = pot * (255 / 1023.0); //這個公式將會計算風扇速度的pwm輸出介於 0-255
analogWrite(fan,fan_speed); //我們設定 9 pin 為 pwm 風扇速度輸出
int pwm_output = fan_speed * (100 / 254.0);//將PWM輸出轉成百分比顯示到LCD螢幕上
lcd.setCursor(0, 1);
lcd.print(pwm_output);
lcd.print(" % ");
delay(1000); // 我希望每秒鐘可以延遲印出值
}