Python可以這樣玩(21):LM35 與 DHT11


我決定把這兩個感應器一起討論,因為這兩種感應器都不屬於 I2C,為了節省時間,我就把這兩個感應器一起接在麵包板上面,一起讀取數據。

不過,這兩種感應器的程式寫法非常不同,而且連接的PIN也非常不同,LM35必須使用 Analog PIN 來讀取資料,DHT11 則必須用 Digital PIN 來讀取資料。

線路如何接?請參考下圖,接法很簡單,兩個模組都有三個腳位,分別是VCCGNDOUT,請將VCC(+)接在5VGND(-)接地,接下來就是OUTLM35請接到 A0DHT11 請接到 D7




首先談LM35,利用Arduino開發板上的類比輸入,讀取溫度感測IC上的值,轉成實際溫度然後透過Serial port傳輸至電腦,而電腦這端則是利用序列監視器]來接收。

Arduino這邊的程式很簡單,先初始化serial port,然後再經由A0讀入LM35的感測值,要注意這個感測值是10位元(bits),根據LM35datasheet得之,正確溫度的計算方式是每10mV(0.01V)增加一度C,也就是說0V代表0C0.1 V(10*0.01V)代表10C,以此類推。因為每次讀回10bit的資料 n,我們要將n換成電壓值: (5V/1024)*n ,又每10mv 增加一度,所以實際溫度=(5V/1024)*n/10mV = (500/1024)*n

算出實際溫度之後,利用Serial.print()函數將資料輸出至Serial port傳輸至電腦(我的系統是COM4),此時的資料是字串型式(每筆資料都是整數兩位數,小數兩位數,加上小數點共五個字元, EX:  28.93)

void setup() 
{
  Serial.begin(9600); 
}

void loop()
{
  float x;
  int n;
  n = analogRead(0);
  x = 500.0 * n /1024.0;
  Serial.print(x, 2); 
  delay(500);
}

接下來我們使用 DHT11 來監控溫度濕度,首先,我們需要安裝 Library,請先下載 zip 檔,請從下面的網址下載:


然後,請打開 Arduino IDE,選取 [草稿碼] [匯入程式庫] [加入 .ZIP程式庫],選取剛才下載的 zip 檔案,DHT的程式褲就成功匯入了:





安裝好了程式庫,你才可以在程式中 include DHT,如果你想看看自己裝了那些程式庫,可以進去管理程式庫查看:





DHT的程式碼如下:

#include <dht.h>
dht DHT;
#define DHT11_PIN 7

void setup(){
  Serial.begin(9600);
}

void loop()
{
  int chk = DHT.read11(DHT11_PIN);
  Serial.print("Temperature = ");
  Serial.println(DHT.temperature);
  Serial.print("Humidity = ");
  Serial.println(DHT.humidity);
  delay(1000);
}

在這段程式碼中,首先要注意的就是 #include <dht.h> ,如果沒有安裝程式庫,編譯就會失敗,因為找不到對應的檔案,透過剛才的匯入程式庫之後,我們的程式庫究竟安裝在哪裡呢?其實並不會安裝在系統目錄,而是使用者的文件目錄,如下圖:





很好,接下來我們把兩個程式合併:

#include <dht.h>
dht DHT;
#define DHT11_PIN 7
void setup(){
  Serial.begin(9600);
}
void loop()
{
  float x;
  int n;
  n = analogRead(0);
  x = 500.0 * n /1024.0;
  Serial.print("Temperature from LM35 = ");
  Serial.println(x, 2);
 
  int chk = DHT.read11(DHT11_PIN);
  Serial.print("Temperature from DHT11 = ");
  Serial.println(DHT.temperature);
  Serial.print("Humidity from DHT11 = ");
  Serial.println(DHT.humidity);
  delay(10000);
}

執行的結果如下圖,可以發現,DHT11雖然可以同時偵測溫度和濕度,但只有整數,精確度比較低(其實也可以有小數點,成是要改寫,先不談):





這裡我並不想往下討論 Python 的程式設計方式,因為這並非我們最後的作品,尤其是我們在讀取 DHT 的時候還匯入了C語言的程式庫,如果要用 Python 做到同樣的事情,必須在 Python 中也匯入相對應的擴展庫,我就先不深入研究這個點了。

等到我們談論到 I2C 的時候,Arduino IDE 必須匯入 Wire.h,而在 Python 中則會對應使用 pyMata 擴展庫,到時候才會深入 Python 程式設計的部分。

上圖中我們看到的是輸入的文字,當然,您也可以選擇使用序列埠繪圖家來查看圖形,如下圖:




唯一要注意的事情是,監視器與繪圖家不可以同時開啟。

留言

這個網誌中的熱門文章

Python可以這樣玩(16):共陰/共陽七段顯示器

Python可以這樣玩(15):蜂鳴器與音樂

Python可以這樣玩(13):外部LED控制