DHT-11這個溫度和濕度感應器,在PCHOME購買,只花了55 NTD。


就像上面所說的,它可以偵測到0-50度,濕度是20%-95%,應該可以說是最基本型的感應器。如果需要更特別的功能,可能就得買更好的感應器了。

透過ARDUINO取得DHT-11溫度感應器的範例已經很多了,這邊也不在說明。

這邊研究的是,如何使用樹梅派,安裝PHP之後,利用網頁顯示溫度資訊。

首先,先參考網路範例,將 DHT-11安裝完畢。

修改arduino程式, 如果樹莓派傳送’T’, 會回傳溫度。如果樹莓派傳送’M’, 就回傳濕度。


#include <DHT11.h>
int pin=2;
DHT11 dht11(pin);
void setup()
{
  Serial.begin(9600);
  while (!Serial) {
      ; // wait for serial port to connect. Needed for Leonardo only
    }
}

void loop()
{
    int err;
    float temp, humi;
    if (Serial.available() > 0) {
    // read data
    int inByte = Serial.read();
    if((err=dht11.read(humi, temp))==0){
         
      switch (inByte) {
      case ‘T’:
        Serial.print(temp);   
        break;
      case ‘M’:  
        Serial.print(humi);
        break;
      default:
        Serial.print(inByte);
      }
    }
    delay(DHT11_RETRY_DELAY); //delay for reread
  }

}

如果直接使用php來連結USB到arduino,就會馬上碰到權限的問題。因為apache是使用apache這個權限在執行,預設是無法讀取到usb,自然也無法直接對arduino下達命令。

故使用root權限,撰寫以下SHELL,並設定crontab,讓系統每分鐘執行該SHELL,把結果導入到/var/www/html/log 這個檔案中。


#!/usr/bin/bash
#設定stty
stty -F /dev/ttyACM0 cs8 9600 ignbrk -brkint -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts

#使用CAT 將ttyACMO的資訊導入到檔案
cat /dev/ttyACM0  > /var/www/html/log &

#休息一下 避免CAT還沒執行,就傳送訊息給ARDUINO。
sleep 1


#傳送T給ARDUINO
echo ‘T’ > /dev/ttyACM0

#砍掉CAT監控程式
kill -9 $(ps -ef | grep ACM0 | awk ‘{ print $2}’ )



PHP再去開啟該檔案,就可以達到PHP讀取溫度的功能。
<?php

$file = fopen(“log”, “r”);
$value = fgets($file);
print “The temperature is ” . $value . “<br>”;

// Close the file that no longer in use
fclose($file);

?>

crontab設定每分鐘去執行該SHELL

*/1 * * * * /var/www/html/shell.sh

結果如下

結論:

        樹莓派上面使用PHP來讀取ARDUINO有滿多的限制,主要就是因為APACHE是用apache這個帳號執行,而非root。當然我們可以把這些限制都移除,比方說用ROOT來執行APACHE,但是這又有很多安全上的疑慮。
        所以目前採用SHELL的方式,使用root身分執行crontab,設定每分鐘定期去撈取溫度資料,並存入到一個特定檔案中。再用PHP的開檔功能去讀取該檔案,取得溫度資料。目前測試正常。



最後修改日期: 31 8 月, 2019

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。