前文中已經可以使用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); // 我希望每秒鐘可以延遲印出值
}

 

 

創作者介紹
創作者 呂阿谷 的頭像
呂阿谷

呂阿谷的部落格

呂阿谷 發表在 痞客邦 留言(0) 人氣()