最近幫筆電換了一顆SSD來當作系統碟,也順手加了一條4G的DRAM,這些變動明顯有加快了整個系統的速度,
不論是開機速度還是執行程式的速度都明顯快了不少,很值得的投資。
不過SSD不比傳統硬碟,SSD用的快閃記憶體(FLASH MEMORY)是有寫入次數限制的,讀取則沒有限制,
所以使用SSD最好能做一些最佳化的設定,可以有效延長SSD的使用壽命。
最近幫筆電換了一顆SSD來當作系統碟,也順手加了一條4G的DRAM,這些變動明顯有加快了整個系統的速度,
不論是開機速度還是執行程式的速度都明顯快了不少,很值得的投資。
不過SSD不比傳統硬碟,SSD用的快閃記憶體(FLASH MEMORY)是有寫入次數限制的,讀取則沒有限制,
所以使用SSD最好能做一些最佳化的設定,可以有效延長SSD的使用壽命。
前文中已經可以使用Arduino的PWM 接腳來控制4pin PC風扇,
但實務上使用會遇到一些困難,首先就如同之前討論PC風扇的文章中所說,
4pin風扇較貴,且普及率遠不如另外兩種VC(電壓控制)與傳統2pin風扇,
所以可以利用Arduino的PWM輸出接腳來控制MOSFET,進而達到
控制所有種類風扇的轉速功能。
在PC散熱風扇之研究三:PWM風扇進階研究一文中介紹過用PWM控制
PC風扇轉速,而Arduino本身就提供好幾個PWM輸出腳位,可以直接
拿來控制PC上的散熱風扇。
先看Arduino UNO的介面圖:
前面兩文介紹了兩種量轉速的方法,本文介紹另一種。
用中斷(interrupt)來進行風扇轉速量測很方便,
但也有佔用中斷的問題發生,而且對UNO這類的只有
兩個中斷的低階CPU來說問題會比較大。
所以有人專門開發了量測風扇轉速用的程式庫,可以
官網後段也有改進之後的程式:
// read RPM
int half_revolutions = 0;
int rpm = 0;
unsigned long lastmillis = 0;
void setup(){
Serial.begin(9600);
attachInterrupt(0, rpm_fan, FALLING);
}
void loop(){
if (millis() - lastmillis == 1000){ //Uptade every one second, this will be equal to reading frecuency (Hz).
detachInterrupt(0);//Disable interrupt when calculating
rpm = half_revolutions * 60; // Convert frecuency to RPM, note: this works for one interruption per full rotation. For two interrups per full rotation use half_revolutions * 30.
Serial.print("RPM =\t"); //print the word "RPM" and tab.
Serial.print(rpm); // print the rpm value.
Serial.print("\t Hz=\t"); //print the word "Hz".
Serial.println(half_revolutions); //print revolutions per second or Hz. And print new line or enter.
half_revolutions = 0; // Restart the RPM counter
lastmillis = millis(); // Uptade lasmillis
attachInterrupt(0, rpm_fan, FALLING); //enable interrupt
}
}
// this code will be executed every time the interrupt 0 (pin2) gets low.
void rpm_fan(){
half_revolutions++;
}
這個程式改進了上一個程式時基不固定的缺點,改用等待1000mS也就是一秒鐘之後統計
中斷次數並乘以60,也就是一分鐘的換算RPM值輸出到com port。
不過這樣的算法會造成RPM數值為兩倍,因為每轉一次會輸出兩個pluse,所以算式要調整除以二:
rpm = (half_revolutions * 60)/2;
Arduino讀取DHT sensor資料後可以輸出到com port監視畫面,
但這樣使用上很不方便,所以底下程式將讀取資料輸出到LCD上:
/*
使用1602A I2C LCD模組及函式庫
DHT11的資料在網路上很好找,這裡不多介紹細節,
詳細規格資料在上一篇中已經有提供。
原生Arduino系統沒有支援DHT系列感測器,所以必須
先載入相關的函式庫(Library)。
早期的開發工具都必須自行找尋相關函式庫,現在
溫度與濕度量測算是環境量測中的基本,
這方面Arduino也有支援不少感測器,
其中價格合宜入手方便的就是DHT家族,
網路搜尋也有很多文章。
DHT家族共有三個成員:DHT11,DHT21,DHT22,規格表如下:
函式庫可以提供很多功能方便使用,底下先將常用的函式庫功能與寫法放上去:
首先程式一開始需依照硬體架構include相關的函式庫,
後面才能正確驅動硬體功能。
並列式用法:
#include <LiquidCrystal.h>
上一篇文章提到了I2C bus好處之一就是可以多個裝置共用匯流排,
但這會產生一個問題,究竟我的I2C bus上有多少裝置?裝置的address
又在哪裡?
所以在Arduino上有人寫了一個 I2C scanner程式,可以讓你執行後
知道匯流排上有多少個裝置,然後所使用的address又是多少。
底下提供我自己的設備與心得,我最早玩的時候I2C bus還不算流行,
所以一開始是照著書上的範例用並聯匯流排的方式來實驗,
後來就改用I2C bus模組來節省I/O腳位。
I2C模組照片:
1602A用並聯匯流排的問題在於太耗I/O腳位了,不管是8位元還是4位元,
最起碼要用上6個IO pin腳,如果還要做其他應用的話,容易顯得捉襟見肘,
所以就有人陸續改造成串連方式使用。
我手上使用的工具書--旗標的超圖解Arduino互動設計入門就有提到使用
74LS164 shift register這顆IC來將串列資料轉成並列資料給1602來使用,
上一篇PART1文章中有提供了1602A的接腳圖,
1602A使用一個8位元(D0-D7)及其他控制腳位作為匯流排(bus),如下圖:
實際上使用時通常是使用4位元模式以節省I/O腳位。
底下以arduino內建的函式庫與範例作為說明,先打開範例程式hello word