第 ??  週  練習使用溫度濕度感測器 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.hdht11.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 怎麼念 ?

      Top
You are the -th visitors to this page.
microsecond
 
   microsecond