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 電路
.png)
[量測結果]
實驗二(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 電路
.png)
[量測結果]
訂閱:
意見 (Atom)

.jpg)




