2014年7月28日 星期一

[ { 3V3 } 整合型 1602 LCD ] 使用樹莓派 ( Raspberry Pi ) 偵測環境溫溼度 ( DHT-11 ) 與環境光源強度 ( BH1750 )

本篇網頁中所使用到的零件可到下面商品網址訂購:

使用樹莓派偵測環境溫溼度與環境光源強度

環境溫溼度與光的強度偵測時常用在氣候偵測或是 DIY 製作上,配合使用整合型 1602 LCD 可以非常方便的將所取得的數值或是文字直接顯示在這一片液晶螢幕上,若是使用 { 3V3 } 版本的整合型 LCD,整體接線可以更加的簡化 ( 不需要接調字亮度的可變電阻);。

在這篇網頁中,您將看到:
  • 如何同時控制兩個 I2C 裝置 ( BH1750 環境光源強度偵測模組和整合型 LCD [ IIC 模式 ] )
  • 如何取得單線式通訊的 DHT-11 感測器的溫、濕度值
網頁中所提供的三個樹莓派的 .C 檔案,放置在雲端硬碟中 ( DHT-Light-LCDI2C )。這幾個原始碼使用 wiringPi 函式庫 ( 請自行安裝 )並以編譯成執行檔可直接使用,有購買的請使用所提供的資料下載連結自行下載。

目錄中包含三個 .C 檔,描述如下 :
  1. 讀取 DHT-11 溫溼度值並顯示在整合型 LCD 螢幕上
    displayDHT.c
  2. 讀取 BH1750 光源強度值 ( Lux ) 並顯示在整合型 LCD 螢幕上
    displayLUX.c
  3. 讀取 DHT-11 溫溼度值和 BH1750 光源強度值 ( Lux ) 並顯示在整合型 LCD 螢幕上
    LTRDisplay.c
資料夾目錄

程式編譯與執行:

PS. 編譯下面這些程式需要 wiringPi 函式庫,安裝方式請參考 Download and Install

這些程式可以直接在樹莓派使用瀏覽器下載 ( 或使用部落格介紹的編輯環境設置說明網頁 ) 並存放在家目錄下 ( 假設目錄名稱為 ~/codes/ ),三組程式編譯的方式如下:

DHT11 + I2CLCD
pi@raspberrypi ~/codes $ sudo gcc display.c -lwiringPi -o displaydht


BH1750 + I2CLCD
pi@raspberrypi ~/codes $ sudo gcc displayLUX.c -lwiringPi -o displaylux


DHT11+BH1750+I2CLCD
pi@raspberrypi ~/codes $ sudo gcc LTRdisplay.c -lwiringPi -o ltrdisplay


要執行,直接輸入編譯後名稱即可,例如要執行 ltrdisplay 就輸入

pi@raspberrypi ~/codes $ ./ltrdisplay


實體電路接法示範:

LTRDisplay.c 結合了 displayDHT.cdisplayLUX.c 兩個程式,有哪些裝置就用哪一個。但不管是使用哪一個,去除掉沒有用的裝置,電路圖接線都一樣,請依照下面所提供的電路圖接線,有什麼就接什麼。

網頁中程式所使用的電路接線圖

因為 LCD 為了展示的關係已被我焊上 90 度的排針,所以插在麵包板上的螢幕,字是上下顛倒的,但這不影響效果!如果排針焊的方向跟我不一樣,LCD 螢幕的接線部分就要看電路圖去接。下面是麵包板接線的照片,每張照片下面有說明,給大家做個接線的參考。

DHT-11、BH1750 和整合型 LCD 麵包板電源與通訊接線

插上 BH1750

插上 DH-11 和 BH1750

插上DHT-11、BH1750 和 整合型 LCD

插上 3V3 電源線

插上 SDA 與 SCL 通訊縣

插上 DHT-11 DATA ( 數據線 )

將所有接線接到樹莓派上

樹莓派 GPIO 接線近照圖

完成接線與程式執行時的情形

如果要對檔案做修改,在每個 .C 檔案的最上面有編譯的指令。下面我們將說明如何使用樹莓派讀取溫溼度值與光強度值。


讀取 DHT-11 溫溼度值和 BH1750 光源強度值 ( Lux ) 並顯示在整合型 LCD 螢幕上

使用整合型 LCD 作為電子實驗的好處是接線簡潔,並且可以與 I2C 裝置共用一組通訊線。於此之外,解開束縛的整合型 LCD 更可以擴展成適用 SPI 通以及一般傳統式的 4-BIT 與 8-BIT 通訊模式 ( 如何解開束縛,請參考 雲端硬碟 datasheet 目錄下的 "整合型 JLX1602A 液晶螢幕資料手冊_watermark_proteuslcd.pdf",文件中有這部分的說明。當然,使用上有問題可直接通過電子郵件做討論 )。

一旦解開束縛,在 I2C 模式下:可以調整四個 I2C 通訊位址;在 SPI 模式下,可以使用 CS ( 預設是開啟,無法手動關閉 ) 的功能;4-BIT 和 8-BIT 通訊。共四種可供選擇的通訊控制模式。

綜合 displayDHT.c 和 displayLUX.c 兩個程式,所有感測器的初始化以及讀取數據的程式碼都宣告在檔案的最上方,而主程式就如下方所示:
 1 int main()
 2 {
 3     float lux;
 4     DHT dht11;
 5     unsigned char buf[17];
 6     char percentage = 0x25; // %
 7     
 8     // 初始化 wiringPi,並使用 BCM_GPIO 的接腳號碼
 9     if (wiringPiSetupGpio() == -1)
10     {
11         fprintf (stderr, "Unable to setup wiringPi GPIO, errno: %s\n", 
12             strerror (errno)) ;
13         exit(1);
14     }
15     
16     // 取得存取 BH1750 IIC 的 FD
17     if((pIIC_BH1750 = wiringPiI2CSetup(BH1750_I2C_ADDR)) == -1)
18     {
19         fprintf (stderr, "Unable to get file handle of IIC (BH1750), 
20             errno: %s\n", strerror (errno)) ;
21         exit(1) ;
22     }
23     
24     // 取得存取 LCD IIC 的 FD
25     if((pIIC_LCD = wiringPiI2CSetup(LCD_I2C_ADDR)) == -1)
26     {
27         fprintf (stderr, "Unable to get file handle of IIC (LCD), 
28             errno: %s\n", strerror (errno)) ;
29         exit(1) ;
30     }
31         
32  lcd_init();
33     bh1750_init();
34     sleep(1);
35     lcd_Clear();
36     
37     for(;;)
38     {
39         dht11 = dht_read( DHT11, 25 );
40         if( dht11.temperature == 0 || dht11.humidity == 0 ) continue;
41         lux   = bh1750_read();
42         
43         #ifdef DEBUG
44             printf(" Temperature: %2.2fC, Humidity: %2.2f%c\n", 
45                 dht11.temperature, dht11.humidity, percentage);
46             printf(" Ambient Light: %5.2f lux\n", lux);
47         #endif
48         
49         //lcd_Clear();
50         delayMicroseconds(50000);
51         sprintf( buf, "**T=%2dC,RH=%2d%c**", 
52             (int)dht11.temperature ,(int)dht11.humidity, percentage );       
53         lcd_DisplayCharAt(1, 1, buf );
54         sprintf( buf, "***Light:%5dLx", (int)lux );
55         lcd_DisplayCharAt( 2, 1, buf );
56         sleep(1);
57     }
58     
59     return 0;
60 }

程式碼很直覺,但請注意每個裝置在初始化或是讀取數據時都需要時間,因此給予適當的延遲時間是非常重要的,不然即使程式都是對的,也不會動!

*****
這網頁是專門為了 3V3 整合型 LCD 寫的,且預設發送的程式也是寫給樹莓派用的。若是您的用途不一樣,可在購買之後指定發送的程式碼是單晶片或是 Raspberry Pi。

ps: 程式碼裡面所使用的指令格式請參考所附資料手冊上第 16 頁的表格。

3 則留言:

  1. 問個題外話,你的杜邦線是怎麼讓他接到麵包版上的?

    回覆刪除
    回覆
    1. 可以使用雙頭等長杜邦針來接,或是買杜邦公針來夾。因為我手邊有工具,所以我是使用杜邦公針自己裁線自己夾。

      刪除

留言屬名為"Unknown"或"不明"的用戶,大多這樣的留言都會直接被刪除掉,不會得到任何回覆!

發問問題,請描述清楚你(妳)的問題,別人回答前不會想去 "猜" 問題是什麼?

不知道怎麼發問,請看 [公告] 部落格提問須知 - 如何問問題 !