Yellow Line - Brightness
Red Line - Temperature
Blue Line - Humidity
2013年11月29日 星期五
2013年11月28日 星期四
整合多項感測器
目前準備量測 亮度, 溫度, 濕度, 並將量測數據記錄下來,透過藍芽模組,將室外盆栽的數據傳送至室內,避免電腦被雨淋或鳥屎攻擊(住家附近的鳥還滿多的)。
主機端利用 C# 寫一套 Application 來監控
主機端利用 C# 寫一套 Application 來監控
[量測結果]
DHT11 溫濕度量測
DHT11 是個傳動模組,裡頭已經整合 溫度 及 空氣濕度 感測器為一體,缺點是只有2位數,所以無法量測精密的小數點變化值。
用熱敏電阻來量測並與 DHT11做交叉比對,成本會省很多。
[量測結果]
[程式碼]
用熱敏電阻來量測並與 DHT11做交叉比對,成本會省很多。
[量測結果]
// Temp and Humidity Module "DHT11" int DHpin = A0; byte dat[5]; byte read_data() { 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’,等待下一位的接收; } } return data; } void start_test() { digitalWrite(DHpin,LOW); //拉低總線,發開始信號; delay(30); //延時要大於18ms,以便DHT11能檢測到開始信號; digitalWrite(DHpin,HIGH); delayMicroseconds(40); //等待DHT11響應; pinMode(DHpin,INPUT); while(digitalRead(DHpin) == HIGH); delayMicroseconds(80); //DHT11發出響應,拉低總線80us; if(digitalRead(DHpin) == LOW); delayMicroseconds(80); //DHT11拉高總線80us後開始發送數據; for(int i=0;i<4;i++) //接收溫濕度數據,校驗位不考慮; dat[i] = read_data(); pinMode(DHpin,OUTPUT); digitalWrite(DHpin,HIGH); //發送完一次數據後釋放總線,等待主機的下一次開始信號; } void setup() { Serial.begin(9600); pinMode(DHpin,OUTPUT); } void loop() { start_test(); Serial.print("Current humdity = "); Serial.print(dat[0], DEC); //顯示濕度的整數位; Serial.print('.'); Serial.print(dat[1],DEC); //顯示濕度的小數位; Serial.println('%'); Serial.print("Current temperature = "); Serial.print(dat[2], DEC); //顯示溫度的整數位; Serial.print('.'); Serial.print(dat[3],DEC); //顯示溫度的小數位; Serial.println('C'); delay(700); }
2013年11月27日 星期三
土壤濕度檢測片
在網路上找 土壤濕度檢測 可以找到一些模組可用,於是自己也想來 DIY 一下。
由於量測極只能找金屬材質,但某些金屬遇水又會生鏽,所以在選材要小心,以免生鏽產生誤差值。
我選擇不鏽鋼材質,但不鏽鋼無法被焊接,所以只能夾在金屬材質,再進行讀取,另外要再與電阻分壓,再拉線到 Arduino 的 IO腳上讀取 (電路與之前相同)。
由於量測極只能找金屬材質,但某些金屬遇水又會生鏽,所以在選材要小心,以免生鏽產生誤差值。
我選擇不鏽鋼材質,但不鏽鋼無法被焊接,所以只能夾在金屬材質,再進行讀取,另外要再與電阻分壓,再拉線到 Arduino 的 IO腳上讀取 (電路與之前相同)。
[量測結果]
[程式碼]
/* 將 DHT11 測得的 溫濕度 顯示在LCD顯示器 */ #include <LiquidCrystal.h> //使用LiquidCrystal Library #include <dht11.h> //使用DHT11 Library LiquidCrystal lcd(12, 11, 7, 6, 5, 4); //初始設定LCD顯示器的介面 dht11 DHT11; //定義DHT11 物件 #define DHT11PIN A1 //定義讀取資料的 Pin腳 void setup() { lcd.begin(16, 2); // 設定LCD有2列16欄 } void loop() { lcd.setCursor(0, 0); //將游標設定在第一行第一個位置(column 0, line 1) int chk = DHT11.read(DHT11PIN); //檢查DHT感測器的回應 switch (chk) { case 0: lcd.print("Humidity:"); lcd.print((float)DHT11.humidity, 1); lcd.print("%"); lcd.setCursor(0, 1); lcd.print("Temp:"); lcd.print((float)DHT11.temperature, 0); lcd.write(0xDF); lcd.print("C "); lcd.print( (float)Thermister(analogRead(A0)), 1); // display Fahrenheit lcd.write(0xDF); lcd.print("C "); break; case -1: lcd.print("Checksum error"); break; case -2: lcd.print("Time out error"); break; default: lcd.print("Unknown error"); break; } delay(500); } float pad = 9000; // balance/pad resistor value, set this to the measured resistance of your pad resistor float Thermister(int RawADC) { float Temp; long Resistance = ( ( 1000 * pad / RawADC) - pad ); Temp = log(Resistance); Temp = 1 / ( 0.001129148 + ( 0.000234125 + ( 0.0000000876741 * Temp * Temp ) ) * Temp ); Temp -= 273.15; // Convert Kelvin to Celcius Temp = ( Temp * 9.0 ) / 5.0; // + 32.0; // Convert Celcius to Fahrenheit Temp /= 10.0; Temp += 10.0; // Offset return Temp; }
2013年11月22日 星期五
Arduino Light Sensor + Moisture Sensor + Bluetooth DEMO
[實驗]
亮度感測 Sensor
利用光敏電阻特性(阻抗會隨亮度明暗而有所變化),與10KΩ電阻分壓 所測得電壓變化,來達到亮度檢測之輸入。
濕度感測 Sensor
利用兩根迴紋針,與55KΩ電阻分壓 所測得電壓變化,來達到亮度檢測之輸入。
藍芽模組
藍芽模組 型號:HC-05 參考
安裝 參考
設定 Baud Rate 參考
Sensor 電路
[量測結果]
實驗二(test2.ino):讀取光敏電阻及土壤濕度訊號,並發送至藍芽模組。
// 在 2x16 LCD 上顯示 溫濕度 並傳送至藍芽模組 // Program : 張碩文 SteveChang, PMP (sown813@gmail.com) // 引用 LiquidCrystal Library #include <LiquidCrystal.h> // 光敏電阻 (photocell) 接在 anallog pin 0 int LightSensor = A0; // 濕度 接在 anallog pin 1 int MoistureSensor = A1; // photocell variable #define BUFFERSIZE 127 uint8_t inBuffer[BUFFERSIZE]; int inLength; // length of data in the buffer // 建立 LiquidCrystal 的變數 LCD // LCD 接腳: RS, Enable, D4, D5, D6, D7 // 對應到 Arduino 接腳: 12, 11, 5, 4, 3, 2 LiquidCrystal lcd(12, 11, 7, 6, 5, 4); void setup() { // 設定藍芽 57600 Serial.begin(57600); // 設定 LCD 的行列數目 (2 x 16) lcd.begin(16, 2); Serial.print("Setup......"); } void loop() { // 讀取光敏電阻 float value1 = LightFormat( analogRead(LightSensor) ); // 讀取濕度 float value2 = MoistureFormat( analogRead(MoistureSensor) ); // 將游標設到 column 0, line 0 // (注意: line 1 是第二行(row),因為是從 0 開始數起): lcd.setCursor(0, 0); lcd.print(" Light: "); lcd.print(value1,1); lcd.print("% "); lcd.setCursor(0, 1); lcd.print("Moisture: "); lcd.print(value2,1); lcd.print("% "); // 列印 Arduino 重開之後經過的秒數 // lcd.print(millis()/1000); Serial.print("亮度 : "); Serial.print(value1); Serial.print("% 濕度 : "); Serial.print(value2); Serial.println("%"); delay(1000); // read string if available if (Serial.available()) { inLength = 0; while (Serial.available()) { inBuffer[ inLength] = Serial.read(); inLength++; if (inLength >= BUFFERSIZE) break; } } } // 調整顯示格式 float LightFormat(int value) { if(value > 1000) return 100; return value / 10.0; } // 調整顯示格式 float MoistureFormat(int value) { return value / 10.0; }
Arduino Light Sensor + Moisture Sensor DEMO
[實驗]
亮度感測 Sensor
利用光敏電阻特性(阻抗會隨亮度明暗而有所變化),與10KΩ電阻分壓 所測得電壓變化,來達到亮度檢測之輸入。
濕度感測 Sensor
利用兩根迴紋針,與10KΩ電阻分壓 所測得電壓變化,來達到亮度檢測之輸入。Sensor 電路
[量測結果]
訂閱:
文章 (Atom)