第 ?? 週 練習使用溫度濕度感測器 DHT11
DHT11 是最便宜的溫度與濕度感測器(Sensor;傳感器),
每次下命令要DHT11吐出資料後, DHT11 會吐出 40 bit (位元)的資料,
等於 5 Bytes(位元組), 其中最開始的 Byte 是濕度整數部分, 接著是濕度小數部分(DHT11永遠是0);
再來的 Byte 是溫度整數部分, 接著是溫度小數部分(DHT11永遠是0, 較貴的 DHT22 則有小數);
最後一個 Byte 為檢查碼(Checksum), 依規定這Byte必須等於前面四個Bytes加總(但只考慮 8 bits),
否則表示前面回傳的四個 Bytes 是錯誤的濕度與溫度資料(data, 數據)。
注意, 依據規格書, 每次要求DHT11回傳溫濕度至少要間隔兩秒以上!
點這可以看 DHT11 Datasheet http://www.micro4you.com/files/sensor/DHT11.pdf
先來看看別人怎麼玩 ..
Arduino 說出中文溫度 濕度
Arduino 把 dht11 濕度溫度傳到 PC 用 C# 處理
重點提示:
DHT11 -- 測量 temperature(溫度) and humidity(濕度),
注意測量時會占用 CPU 的時間, 此時 CPU 的中斷請求通常被禁止(不然測不準!);
所以, 在 DHT11 測量完成之前 CPU 無法做任何事!
DHT22 -- 用法與 DHT11 完全一樣, 都是會吐出 40 bit (位元)的資料;
不過稍微貴一點點的 DHT22 溫度和濕度都可以量測到小數,
但 DHT11 量測到的溫度濕度其小數都是0(也就是DHT11只有整數)。 順便來學幾個英文單字:
Temperature 溫度 temperature 怎麼念 ?
Temperature 在 cdict.net 的發音
Humidity 濕度 humidity 怎麼念 ?
Humidity 濕度 在 cdict.net 的發音
Library 庫, 圖書館 library 怎麼念 ?
Library 庫,圖書館 在 cdict.net 的發音
Sensor 感測器, 傳感器 sensor 怎麼念 ?
Sensor 感測器, 傳感器 在 cdict.net 的發音
|
|
發揮你的創意, 即使不把量測到的資料送去 PC 電腦, 仍可做出量測效果 !
以下我先幫大家想一些..
你可以在溫度較高時開啟 LED 燈, 例如以下(3)裡面我已經幫大家寫好了會依據濕度與溫度變化LED燈光!
甚至你也可在溫度太高時使用蜂鳴器發出叫聲警告(這部分我沒寫 :-),
至少要用到一種, 如果你兩種都用, 或做出更多效果, 則當作加分題 :-)
有做加分題時請多繳交一張圖片(第六張),
當然也要貼入程式碼(第七張, 不是圖, 是可複製貼上的程式碼)!
** 請注意, 不論是圖, 還是貼入程式碼,
都請先編號並寫一兩句簡單標題或說明! 例如:
(1)以下圖片可以看到對著 dht11 模組哈氣時濕度會變濕, 溫度會升高 !
|
依據 DHT11 規格書(datasheet;數據表), 電腦只要用一條信號線與DHT11 通信;
要對 DHT11 下命令必須透過該信號線, 要接收 DHT11 的濕度與溫度資料也要透過該條線,
雖然只有一條線, 一般還是稱之為匯流排(Bus, 大陸稱"總線"), 那要如何透過這條線通訊呢?
依據 DHT11 規格書, 要從 DHT11 拿取濕度與溫度資料的方法可以整理如下:
(A)要把該線(匯流排)拉低為 0 伏特持續至少 18ms(毫秒),以便 DHT11 能檢測到開始信號;
(B)拉高該線(匯流排)為 5 伏特持續至少40us(微秒)等待 DHT11 響應;
以上的動作就是對 DHT11 感測器喊話: 喂喂喂.. 拜託把濕度與溫度丟過來吧 !
(C)DHT11 發出響應,會先拉低匯流排至少 80us, 然後拉高匯流排持續 80us, 之後就開始吐出資料!
所以我們要先等該線變 LOW 後, 用 delayMicroseconds(80); 等80us(微秒),
再用 while Loop等其變HIGH, 確認其變為 HIGH 後又再次等80us, 然後就要準備接收資料囉!
(D)等到 DHT11 拉高匯流排 80us 後, 便會開始發送資料, 接下來 DHT11 總共會吐出40 bit (位元),
每 8 bit(位元)為一個 Byte(位元組), 共 5 個位元組:
(a)第一 Byte 為濕度(humidity)的整數位元組
(b)第二 Byte 為濕度的小數位元組, DHT11 永遠是 0
(c)第三 Byte 為溫度(temperature)的整數位元組
(d)第四 Byte 為溫度的小數位元組, DHT11 永遠是 0
(e)第五 Byte 為檢核位元組(Checksum),必須等於前四個 Byte 的加總(但只保留右邊 8 bit)!
(E)關於 DHT11 連續吐出的 40 bit 到底是 1 還是 0 呢?
(a)根據規格書, DHT11 每個 bit 開始都是先拉低匯流排 50 us, 然後會拉高
(b)如果要送的是 0, 則拉高只持續約 28us, 如果是 1, 則拉高會持續 70us;
因此, 通常的做法是看到拉高之後, 等 30us, 然後立即再檢查匯流排看是 HIGH 還是 LOW ?
如果還是 HIGH 那就是 1, 如果已經變成 LOW 則該 bit 為 0
(c)所以如果該 bit 是 1, 則此時匯流排仍是 HIGH, 要等到變成 LOW 才表示下一個 bit 要開始了!
(如果該 bit 是 0, 則此時已經是 LOW)
不論該 bit 是 0 還是 1, 都要回到(a)步驟繼續收取下一個 bit
*** 因為收取這 40bit 的時候時間非常的關鍵,
所以最好不要被中斷, 否則可能誤判某些位元 !
|
(1)先測試 DHT11 之濕度與溫度的值如何取得 ?
** 把 DHT11 連接到 Arduino 版子:
DHT11 溫溼度模組有三支腳(Pin), 中間那支請連接到 Arduino 的 5V,
標示減號 - 或 GND 的連接到 Arduino 的 GND (有三個GND任選一個),
然後, 請把信號腳 S 或 DAT 連接到 Arduino 的數位(數字) 2 腳 (Digital Pin 0) !!
(因為我們的範例是使用 pin 2 接收 DHT11 的溫溼度資料)
** 準備開始囉!
先確定你的電腦認識 Arduino 板子, 開啟 Arduino 的 IDE 開發工具,
當然還要確認 Board 板子選 Uno, 確認 COM 串口編號選擇正確!!
(a)開啟一個新檔:
File 檔案 > New 新建
(b)複製以下程式碼貼入, 記得裡面要有你的學號與英文姓名;
然後, 編譯並上傳 Arduino 板子以便測試, 要記得打開串口監視器:
Tools 工具 > Serial Monitor 序列埠監視器 (串口監視器)
故意用嘴巴對著 DHT11 對濕度感測器哈氣看看 !
以下 請注意程式碼中有兩處要填寫你的學號與英文姓名!: |
//簡易讀取 DHT11 並印出在串口監視器, by tsaiwn@ydu.edu.tw
int dhPin = 2; // 溫溼度訊號接腳連入 Arduino 的 digital Pin 2
byte dat[5]; // 這 array(陣列) 有 5 個 byte (位元組), 所以共有 40 bit (位元)
void setup( ) { Serial.begin(9600);
pinMode(dhPin, OUTPUT); // 很奇怪對不對?! 但是別懷疑, 沒寫錯 (上課說明!)
Serial.println("Temperature + Humidity 你學號 你英文姓名");
} // setup(
byte readData( ) { // 這函數(function)會從 dht11 要 8 bit 的 data
byte data; // byte (位元組) 是一個可存放 8 bit(位元) 的位置
for(int i=0; i < 8; i++) { // 連續從 DHT11 要求吐出 8 bits 位元
if(digitalRead(dhPin) == LOW) {
while(digitalRead(dhPin) == LOW); //等待 50us; 直到變為 HIGH
delayMicroseconds(30); //判斷高電平持續時間,以判定資料是‘0’還是‘1’;
// 如果 30 us 後已經變為 LOW, 那就是 0, 如仍是 HIGH, 則為 1 要參入 data:
if(digitalRead(dhPin) == HIGH)
data |= (1 << (7-i)); //高位在前,低位元在後;
while(digitalRead(dhPin) == HIGH); //資料‘1’,等待下一位的接收;
}// if(dig...
}// for(int i
return data; // 回傳從 dht11 要到的 8-bit data
} // readData(
void read_dht( ) { // 進入這之時 dhPin 必須在 OUTPUT mode
digitalWrite(dhPin,LOW); //拉低匯流排,發開始信號;
delay(30); //延時要大於 18ms,以便 DHT11 能檢測到開始信號;
digitalWrite(dhPin,HIGH); // 拉高匯流排
delayMicroseconds(40); // 給40us等待 DHT11 響應;
pinMode(dhPin,INPUT); // dhPin 改為輸入(Input )用
/// 以上動作就是對 DHT11 感測器喊話: 喂喂喂.. 拜託把濕度與溫度丟過來吧 !
while(digitalRead(dhPin) == HIGH); // 必須等到 dht11 拉低 匯流排(更好寫法是要有 Timeout 機制!)
delayMicroseconds(80); //DHT11 發出響應,會拉低匯流排 80us; 所以我們等 80 us 後再檢查
while(digitalRead(dhPin) == LOW); // 再來必須等到 匯流排變 HIGH
delayMicroseconds(80); //DHT11 拉高匯流排 80us 後, 便會開始發送資料;
/// 以下用 for Loop 做連續調用 readDate( ) 五次以便接收取得 5 bytes
for(int i=0;i < 4;i++) dat[i] = readData( ); //接收溫濕度資料,校驗位元組在 dat[4]不檢查對錯;
// 依規定 dat[0]+dat[1]+dat[2]+dat[3] == dat[4] 才表示沒有錯誤 !
pinMode(dhPin,OUTPUT); // dhPin 改為輸出用
digitalWrite(dhPin,HIGH); //發送完一次資料後釋放匯流排,等待下一次開始信號;
} // read_dht(
///點這可以看 DHT11 Datasheet http://www.micro4you.com/files/sensor/DHT11.pdf
void loop( ) { // 這會 Loop forever
Serial.println("=== 009008你學號 你英文姓名"); // 注意要寫你學號姓名!
read_dht( ); // 調用函數 read_dht( ) 從 dht11 讀取 40 bits 放入 dat[ ] 陣列內五個位元組(Byte)
Serial.print("Current humidity = ");
Serial.print(dat[0], DEC); //顯示濕度的整數位元組;是十進位
Serial.print('.');
Serial.print(dat[1],DEC); //顯示濕度的小數位; DHT11 永遠是 0
Serial.println('%');
Serial.print(" temperature = ");
Serial.print(dat[2], DEC); //顯示溫度的整數位元組;也是十進位!
Serial.print('.');
Serial.print(dat[3],DEC); //顯示溫度的小數位; DHT11 永遠是 0
Serial.println("°C");
delay(3988); // 拖延大約四秒 (依規定至少要等 2 秒才可叫 DHT11 測量)
} /// Reference: http://keyes-arduino.taobao.com
// Also see http://playground.arduino.cc/main/DHT11Lib
|
(c)注意紅色的那幾列, 務必要加入你的學號與英文姓名; 重新編譯上傳測試;
記得開啟 序列埠監控視窗(以後我們跟著老共稱"串口監視器"):
Tool 工具 > Serial Monitor 序列埠監控視窗(串口監視器)
(此時會彈出一個小視窗, 用來監控從 Arduino 傳入電腦的資料,
其實, 必要時也可用鍵盤打字到在該小窗並傳送給連接在 USB 線的 Arduino 喔 !)
把Serial Monitor窗拉長拉大放 IDE 右邊, 適當擺放螢幕中間兩側, 準備拍照繳交囉 !
(d)找同學幫忙對著你的 DHT11 哈氣,
你自己用 CTRL_PrintScr 抓下今天要繳交的第一張圖片 !
注意這張圖片上方要寫(1)我是..你學號你姓名, 圖片中可看出對 dht11 哈氣時溫度濕度..(自己寫出狀況!)
(2)改用官網別人提供的一個程式庫(Library)讀取 DHT11 感測器 !
用 google.com 搜尋 dht11 + arduino 就可以找到很多 DHT11 的範例,
官網 arduino.cc 就有人寫了簡單的 DHT11 Library (程式庫):
http://playground.arduino.cc/main/DHT11Lib
該範例故意把 DHT11 程式庫以 C/C++ 語言標準寫法寫成兩個檔案:
dht11.h 和 dht11.cpp
其中 dht11.h 稱為標頭檔(Header file), dht11.cpp 則是程式庫真正本體;
要使用這程式庫, 必須:
(a)在你 Arduino IDE 的 libaries 目錄下,
建立一個子目錄 DHT11 (其實目錄名稱不重要!);
這上課時會 Demo 給大家看, 要注意跟著做喔 !
(b)然後, 把 dht11.h 與 dht11.cpp 兩個檔案都放入該子目錄內。
(c)重新啟動你的 Arduino IDE, 這樣你就有 dht11.h 這程式庫可以用了!
(d)建立一個新的 Arduino 檔案, 立即另存新檔(Save as...),
它會要你命名, 請命名 test3388
(注意 Arduino IDE 規定, 檔案名稱 必須與 檔案夾名稱 相同 !!
| // test3388.cpp -- 測試使用 dht11.h 庫, by tsaiwn@ydu.edu.tw
// Sample code to use dht11 Library to read temperature(溫度) and humidity(濕度)
// 參考 http://playground.arduino.cc/main/DHT11Lib
#include "dht11.h"
int dhtPin = 2;
dht11 myDHT; // 定義 myDHT 為 一個 dht11 溫溼度計 物件(Object)
int temp, humi; // 兩個變數, 分別存放 溫度 temperature, 濕度 humidity
void setup( ) {
Serial.begin(9600);
temp = humi = 0; // 設為 0 這樣才知道是否讀取成功 :-)
Serial.println("Hello DHT11 testing-- 008007005 張大頭"); // only One time
} // setup(
void loop( ) {
Serial.println("I am 009008007 Chang, Da-Tou 張大頭"); // 印出 你學號與英文姓名
int chk = myDHT.read(dhtPin); // 要求 myDHT 向 DHT11 要資料(CPU會被佔住!!)
if(chk == 0) { // 0 == DHTLIB_OK 表示有讀取到
temp = myDHT.temperature; // 取出 myDHT 內的溫度, 這是 C++ 物件的使用方法!
humi = myDHT.humidity; // 取出 myDHT 內的濕度
} // if
Serial.print("Temp: ");
Serial.print(temp); // 把 temp 內容印出去
Serial.print(" °C;");
Serial.print(String("")+" Humi = " + humi);
Serial.print(String(" :: Now ") + millis() ); // 開機到現在是多久 millisecond
Serial.println( ); // 換到下一列(New Line)
delay(5000); // 故意等五秒, 因為根據 DHT11 規格書至少要等兩秒!
} // loop(
/// End of test3388 -- the DHT11 testing program
|
現在看這程式碼變得簡單又簡短, 這就是使用程式庫(Library)的好處:-)
因為只要知道程式庫如何使用, 不必知道程式庫內的細節,
有興趣知道的才去研究該程式庫內是如何與 DHT11 溝通 !
通常, 每個程式庫會宣告在一個標題檔(Header file), 例如 dht11.h,
使用時你只要 #include "dht11.h"
注意, 千萬不要假會又寫了 #include "dht11.cpp"
因為, 編譯器(Compiler)看到 #include "dht11.h" 之時,
只是去把 dht11.h 的內容複製進來(通常被偷改過的原始碼會放臨時檔案區如 /temp),
使得編譯器在編譯我們寫的程式碼時,
看到程式碼內與 dht11.h 內宣告有關的, 會知道如何編譯,
(當然, 它也會順便找到 dht11.h 內宣告的程式庫做編譯!)
然後, 負責連結全部程式碼的鏈結器(Linker)會找出所有需要的機器碼,
並把它們綁在一起變成一個可以被 Arduino 執行的機器碼檔案,
以便上傳到 Arduino 板子內!
換柱之後.. 阿不是..,
我是說換掉該段程式碼並確定有把 dht11.h 程式庫加入你電腦之後, 就可編譯上傳並測試了,
(e)注意這次也是要打開串口監視器拉長拉大,
這次把 IDE 放右邊(故意), 準備用 Ctrl_PrintScr 抓下畫面繳交!
也是要請同學幫忙對著你的 dht11 哈氣, 看到串口監視器前後有變化,
才敲 Ctrl_PrintScr 拍下今天要繳交的第 2 張畫面 !
*** 請注意, 這張要編號 (2)並寫簡單句子說明狀況!
(3)根據濕度與溫度控制三色 LED 並且亮不同顏色與不同亮度
(第三張和第四章圖片是照片: 這項目做好要把 Arduino 板子拿在你螢幕前,
連同 IDE 與 串口監視器一起拍下兩張照片繳交, 兩張必須亮不同顏色的LED燈!)
原則上, 在讓人感覺舒服的濕度與溫度之時, 亮綠燈;
如果太冷或太濕, 亮藍燈, 深藍表示太冷, 淡藍色表示太濕但不是太冷;
太熱或太乾則亮紅色LED, 深紅表示太熱, 淡紅表示太乾, 太熱且太乾請亮白色 !!
這也不太難 :-)
只要修改 lightOn( int 濕度, int 溫度 ) 開燈程式碼,
根據不同的 狀況 把不同的 R G B 值用 analogWrite( ) 寫到 RGB 三支腳即可 !
注意, 三色 LED 的 R B G 三支 Pin 要連接到 Arduino 的 Pin 9, 10, 11 喔 !
還有還有, 寫著 V 那支腳是寫錯了, 應該寫減號 - 或 GND, 要連接到 Arduino 的 GND 地喔!
那要如何利用濕度與溫度控制 LED 燈光呢 ?
請參考以下的開燈關燈程式碼, 記得要複製貼到你 IDE 內相對比較前面之處 !
|
//注意: 把以下程式碼 複製貼到 IDE 內剛剛程式的最前面,
// 還有, 請注意你的三色 LED 模組 紅藍綠 接腳要分別連接到 Arduino 的 pin 9, 10, 11 喔 !
int pinR = 9; // 紅
int pinB = 10; // 藍
int pinG =11; // 綠色
////////////
void lightOn(int r, int g, int b) { // 牽涉到 RGB 的開燈函數
analogWrite(pinR, r); // 紅
analogWrite(pinG, g); // 綠色
analogWrite(pinB, b); // 藍
}
void lightOff( ) { // 新關燈函數
analogWrite(pinR, 0); // 0 就是 關燈
analogWrite(pinB, 0); // 0 就是 關燈
analogWrite(pinG, 0); // 0 就是 關燈
}// lightOff(
///////////////////// 以下這開燈函數是給你在 loop( ) {... } 必要時調用(Call)的 !
void lightOn( int kk, int tt) { // kk 是濕度, tt 是溫度
lightOff( );
if(kk < 40 && tt > 29) lightOn(255, 255, 255); // R G B 全亮為白色; 太乾又太熱
else if(tt > 29) lightOn(200+5*(tt-30), 0, 0); // 紅
else if(kk < 40 && tt >= 17) lightOn(kk*2-33, 0, 0); // 淡紅; 太乾
///
else if(tt < 17) lightOn(0, 0, 255); // 藍; 太冷
else if(kk > 69) lightOn(0, 0, kk*2-33); // 有點藍
else lightOn(0, 255, 0); // Green 綠
} // lightOn(
/// 把以上這些程式碼複製並貼入 IDE 中換掉之前的開燈與關燈函數 !
/// 當然, 你也可以依照自己意思修改以上的程式碼, 觀察不同的變化 !
| |
//要如何使用上面的開燈函數呢 ?
//這更簡單 :-)
// 就在你的 void loop( ) { ... } 內, 印完資料到串口監視器之後,
//且在最後那 delay( ) 之前, 加入以下這句:
lightOn(humi, temp); // 把濕度與溫度傳給 lightOn(int, int) 函數
*** 這項目做好後, 開啟串口監視器拉長拉大, 串口監視器在左, IDE 在右邊,
要把 Arduino 板子拿在你螢幕前(連同 DHT11), 一起拍下兩張照片繳交,
兩張必須亮不同顏色的LED燈!! 這是今天要繳交的第三張和第四張圖片(照片)!
|
(4)把濕度與溫度用圖形的方式顯示在電腦螢幕上
這需要用到 processing (一種 MIT 特別為藝術家設計的電腦語言, 建立在 Java 之上),
請先點這把 processing IDE 抓回電腦解壓縮備用! Jodomade ..ちょっと待って ..
(如果開機選 Multimedia 多媒體開機區, 則 Arduino 和 Processing 應該都已經放在桌面 !)
再來請抓我寫好可把濕度溫度送到電腦用圖形顯示的程式碼壓縮檔,
請點這抓 圖形顯示溫度濕度.zip並解壓縮備用 !!
接下來老師會 Demo 如何使用 !!
使用 Processing 程式與 Arduino 溝通時, 必須把 Arduino IDE 關閉 !
注意, 必須修改我給的 processing, 確定:
(a)可以在電腦上顯示你的學號與中文姓名
(b)確定程式中的 COM port 號碼符合你 Arduino 板子所連接的 Port#
測試正確之後, 準備拍一張照片繳交, 證明你有做這實驗:
確定電腦可以取得 Arduino 傳來的溼度與溫度並用圖型方式顯示後,
確認電腦畫面上看得到你的學號與中文姓名(顯示在 processing 畫面),
然後, 把 Arduino 板子拿在你螢幕前(連同 DHT11), 把螢幕與DHT11以及Arduino板子一起拍下一張照片繳交;
這是今天要繳交的第五張圖片(照片)!
*** 在抓下的 processing 壓縮檔內有一些好玩的 processing 範例,
有空可以玩玩並稍微研究一下 !
附註: 關於 圖形顯示溫度濕度.zip
| Arduino 內負責把 dht11 濕度與溫度送往 電腦
| |
//以下使用 dht11 溫溼度感應 模組顯示濕度與溫度
// modified by tsaiwn@ydu.edu.tw 育達科大多遊系
int dhPin = 2; // 溫溼度訊號接腳連入 Arduino 的 Pin 2
byte dat[5];
byte readData( ) {
byte data;
for(int i=0; i<8; i++) {
if(digitalRead(dhPin) == LOW) {
while(digitalRead(dhPin) == LOW); //等待 50us;
delayMicroseconds(30); //判斷高電平的持續時間,以判定資料是‘0’還是‘1’;
if(digitalRead(dhPin) == HIGH)
data |= (1<<(7-i)); //高位在前,低位元在後;
while(digitalRead(dhPin) == HIGH); //資料‘1’,等待下一位的接收;
}// if
}// for(
return data;
} // readData(
void read_DHT( ) {
digitalWrite(dhPin,LOW); //拉低匯流排,發開始信號;
delay(30); //延時要大於 18ms,以便 DHT11 能檢測到開始信號;
digitalWrite(dhPin,HIGH);
delayMicroseconds(40); // 給40us等待 DHT11 響應;
pinMode(dhPin,INPUT);
while(digitalRead(dhPin) == HIGH);
delayMicroseconds(80); //DHT11 發出響應,會拉低匯流排 80us;
while(digitalRead(dhPin) == LOW); // 等到變 HIGH
delayMicroseconds(80); //DHT11 拉高匯流排 80us 後開始發送資料;
for(int i=0;i<4;i++) dat[i] = readData( ); //接收溫濕度資料,校驗位元不考慮;
pinMode(dhPin,OUTPUT);
digitalWrite(dhPin,HIGH); //發送完一次資料後釋放匯流排,等待下一次開始信號;
}
void setup( ) { Serial.begin(9600); pinMode(dhPin, OUTPUT); }
void loop( ) {
read_DHT( );
//Serial.print("Current temperature = ");
Serial.print(dat[2], DEC); //顯示溫度的整數位元;
Serial.print('.');
Serial.print(dat[3],DEC); //顯示溫度的小數位;
//Serial.println('C');
Serial.print(',');
//Serial.print("Current humdity = ");
Serial.print(dat[0], DEC); //顯示濕度的整數位元;
Serial.println( );
delay(2345);
} /// http://keyes-arduino.taobao.com
// Also see http://playground.arduino.cc/main/DHT11Lib
//=================
|
|
這是在電腦(PC)上用 processing 接收 Arduino 傳來的濕度與溫度並顯示在電腦上
目錄: 圖形顯示溫度濕度\processing\TempDisplay (包括圖片)
| |
// Based on Jeremy Blum's sketch
// modified by tsaiwn@ydu.edu.tw 育達科大 多媒體與遊戲系 蔡文能
// Arduino sketch can be downloaded from http://tinyurl.com/4pf63v8
import processing.serial.*;
String COM_PORT = "COM4"; // 要查看系統管理員
// 如果你 Arduino 不是接在 COM4,請做適當調整
String temp_c = ""; // 攝氏溫度
String hum = ""; // 濕度
String data = "";
int newLine = '\n'; // 換行符號 \n == 10
int index = 0;
Serial port;
PImage img;
PFont font;
void setup(){
size(288, 366);
smooth();
try {
port = new Serial(this, COM_PORT, 9600);
port.bufferUntil(newLine); // 緩衝資料直到遇到 換列字元後才呼叫 serialEvent
}catch(Exception e){
println("Error -- 找不到 Arduino 在 COM port: " + COM_PORT);
print("你目前有這些COM通訊埠: " );
print(Serial.list( )[0]);
for(int i=1; i < Serial.list().length; ++i)
print(", " + Serial.list( )[i]);
println( "\n 請修正程式用的 COM Port !");
}
// 載入背景圖片
//img = loadImage("Tempdisplay260x350Art1.jpg");
img = loadImage("Tempdisplay260x350Art2.jpg");
//img = loadImage("Tempdisplay260x350Art3.jpg");
// 載入字型
font = createFont("標楷體", 24, true); // or "標楷體" SimSun
textFont(font);
temp_c = "26.5";
hum = "68";
println("測試 \"abcdefg\".substring(3) =" + "abcdefg".substring(3));
}
void draw(){
image(img, 13, -6); // 畫背景圖片
fill(51, 33, 0);
textAlign(CENTER);
textSize(24); text("溫度 ", 98, 200);
textSize(32);
text(temp_c +" C", 168, 200); // 顯示攝氏溫度
/// 濕度
textSize(24); text("濕度 ", 110, 250);
textSize(32);
text(hum + " %", 168, 250);
textSize(16);
text("育達科大多媒體與遊戲系", 128, 360);
}
long gg = 0;
void serialEvent(Serial port){
data = port.readStringUntil(newLine);
data = data.substring(0, data.length() - 1);
if(++gg%2 == 0) print(" ");
println(data); // 印到 Processing 的狀態視窗方便除錯
index = data.indexOf(','); // 尋找溫度與溼度間的逗點
temp_c = data.substring(0, index); // 取出溫度 (到小數一位)
hum = data.substring(index+1); // 溼度
}
//////////// End of processing program
/// 以下圖片是 Tempdisplay260x350Art2.jpg
///
|
|
http://georgehk.blogspot.tw/2014/05/temperature-and-humidity-sensor-dht11.html
Using C#
http://georgehk.blogspot.tw/2014/05/temperature-and-humidity-sensor-dht11.html
(5)加分題
如果你有額外要結合蜂鳴器的創意, 修改程式碼測試,
(a)拍下第六張照片或影片(至少30秒, 至多三分鐘, 上傳 youTube,
關鍵字至少要有 育達科大, 育達多遊, Arduino實驗, 然後在這貼分享網址!)
(b)貼入第七張(不是圖, 是你的 Arduino 完整 完整程式碼,
貼入程式碼之前, 請先寫編號(7) 並簡單寫這程式碼目的, 不要太多字喔!)
如果想看更多關於 DHT-11 溫度溼度感應器的說明,
可以點這看蔡神老師在 Arduino 中文社區寫的這篇"【教程】 DHT11 濕度溫度傳感器 Q & A"
|
再來學一些相關的英文單字:
Load 載入(讀入到 "記憶體") Load 怎麼念 ?
Image 影像, 影像檔 image 怎麼念 ?
analog 類比(大陸翻譯為 "模擬") analog 怎麼念 ?
archive 保存檔, 保存 archive 怎麼念 ?
Board 板子, 董事會, 上車 board 怎麼念 ?
Build 建立 build 怎麼念 ?
Building 建築物 building 怎麼念 ?
Cancel 取消 cancel 怎麼念 ?
Cancer 癌症 cancer 怎麼念 ?
Pencil 鉛筆 pencil 怎麼念 ?
delay 延遲 delay 怎麼念 ?
millisecond 毫秒(千分之一秒) millisecond 怎麼念 ?
microsecond 微秒,百萬分之一秒 microsecond 怎麼念 ?
digital 數位(大陸翻譯為"數字") digital 怎麼念 ?
function 函數, 函式, 功能 function 怎麼念 ?
Humidity 濕度 humidity 怎麼念 ?
Humidity 濕度 在 cdict.net 的發音
Light 光, 燈光 light 怎麼念 ?
Monitor 監視器, 監督 monitor 怎麼念 ?
read 讀 read 怎麼念 ?
return 回傳, 返回 return 怎麼念 ?
Sensor 感測器(大陸翻譯為"傳感器") sensor 怎麼念 ?
serial 序列式, 連續的 serial 怎麼念 ?
Serial Port 序列埠, 串口 serial port 怎麼念 ?
Temperature 溫度 temperature 怎麼念 ?
Temperature 在 cdict.net 的發音
Humidity 濕度 在 cdict.net 的發音
toggle 雙向開關 toggle 怎麼念 ?
switch 開關 switch 怎麼念 ?
void 無效的, 函數以此開頭表示該函數不會回傳值(return a value) void 怎麼念 ?
Write 寫 write 怎麼念 ?
File 檔案 file 怎麼念 ?
Folder 檔案夾, 文件夾 folder 怎麼念 ?
Directory 目錄(也算檔案夾) directory 怎麼念 ?
Department 系, 科系, 部門 Department 怎麼念 ?
Multimedia 多媒體 Multimedia 怎麼念 ?
Design 設計 Design 怎麼念 ?
program 程式, 規劃, 學程 Program 怎麼念 ?
programming 寫程式 Programming 怎麼念 ?
Dream 夢, 夢想 Dream 怎麼念 ?
Reality 現實 Reality 怎麼念 ?
virtual reality = VR 虛擬實境 virtual reality 怎麼念 ?
virtual memory 虛擬記憶體 virtual memory 怎麼念 ?
virtual 虛擬的, 幾乎 virtual 怎麼念 ?
visual 視覺的 visual 怎麼念 ?
Visual BASIC 微軟的 VB 電腦語言
visible 看得見的 visible 怎麼念 ?
augmented reality = AR 擴增實境 augmented reality 怎麼念 ?
augment 擴增, 擴張, 增強 augment 怎麼念 ?
|
You are the
-th visitors to this page.
|
|
|