2013年11月29日 星期五

The first cake comes out of the oven.

Yellow Line - Brightness
Red Line - Temperature
Blue Line - Humidity

自家頂樓量測

將量測工具架設自家頂樓陽台, 希望這幾天別下雨 XD



[量測結果]

2013年11月28日 星期四

整合多項感測器

目前準備量測 亮度, 溫度, 濕度, 並將量測數據記錄下來,透過藍芽模組,將室外盆栽的數據傳送至室內,避免電腦被雨淋或鳥屎攻擊(住家附近的鳥還滿多的)。

主機端利用 C# 寫一套 Application 來監控

[量測結果]

DHT11 溫濕度量測

DHT11 是個傳動模組,裡頭已經整合 溫度 及 空氣濕度 感測器為一體,缺點是只有2位數,所以無法量測精密的小數點變化值。

用熱敏電阻來量測並與 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腳上讀取 (電路與之前相同)。




[量測結果]

[程式碼]
/*    將 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 電路
[量測結果]