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的開檔功能去讀取該檔案,取得溫度資料。目前測試正常。