728x90

 

토양수분센서에 따른 특성 분석 후 적용이 필요함.

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h"

#define DHT_TYPE DHT11   // DHT 11

// 핀설정
#define DHT_PIN 6     // what digital pin we're connected to
#define SOIL_SENSOR_PIN A0     // what digital pin we're connected to
#define SOIL_RELAY_PIN 8 // 토양센서에 결과에 따른 제어 relay 핀

#define DHT_USE_YN 0
#define SOIL_SENSOR_USE_YN 1
#define WATER_RELAY_USE_YN 1

#define SOIL_HUMIDITY_INDEX 40 // 물을 주기 위한 습도 임계치값. 임계치 이하면, 물을 공급한다.
#define WATER_SUPPLY_TIME 10 // 물 공급 시간 (기본:10초)
#define WATER_SUPPLY_INTERVAL_TIME (60 * 1) // 물공급 인터벌 시간. 기본: 10 분(60초 * 10분)

#define LOOP_INTERVAL_TIME 2 // 루프 인터벌 시간 (기본:2초)

DHT dht(DHT_PIN, DHT_TYPE);

// loop 에서 센서 처리 여부
int checkedSensor = 0;
// 물공급 delya time
int waterDelayTime = 0;

void setup() {
  Serial.begin(9600);
  pinMode(SOIL_RELAY_PIN, OUTPUT);
  
  if(DHT_USE_YN) {
    Serial.println("DHT beging...");
    dht.begin();    
  }
}

// DHT 센서 처리
void processDhtSensor() {  
  // DHT 센서 처리 ////////////////////////////
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }  

  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" *C");
}

void processSoilSensor() {
  // 토양 센서 처리 //////////////////////////
  int soilAnalogValue = analogRead(SOIL_SENSOR_PIN);
  int soilDigitalValue = map(soilAnalogValue, 0, 630, 0, 100); // Max(물에 잠길때) : 540 ~ 630, Min: 0
  soilDigitalValue = constrain(soilDigitalValue, 0, 100);
  
  Serial.print("Soil moisture(Digital/Analog): ");
  Serial.print(soilDigitalValue);
  Serial.print(" (%) / ");
  Serial.print(soilAnalogValue);
             
  if(WATER_RELAY_USE_YN && soilDigitalValue < SOIL_HUMIDITY_INDEX) {
    // 습도가 0보다는 크고, 인덱스값보다 작을 때 물을 공급한다. 
    if(soilDigitalValue < 1) {
      Serial.print("\t토양센스가 습도를 측정하고 있지 않습니다.");          
    } else {
      waterDelayTime -= LOOP_INTERVAL_TIME;
      if(waterDelayTime < 1) { // 물공급 인터벌 시간이 지나야, 추가로 물을 공급할 수 있다.
        waterDelayTime = WATER_SUPPLY_INTERVAL_TIME;
        digitalWrite(SOIL_RELAY_PIN, HIGH);  
        Serial.print("\trelay on(");    
        Serial.print(WATER_SUPPLY_TIME);    
        Serial.print("초)");    
        delay(WATER_SUPPLY_TIME * 1000);  
        digitalWrite(SOIL_RELAY_PIN, LOW);  
        Serial.print("\trelay off");        
      } else {
        Serial.print("\t물공급 인터벌 시간이 아직 지나지 않았습니다.(");          
        Serial.print(waterDelayTime);          
        Serial.print("초 남음.)");                  
      }      
    }
  }
}


void loop() {
  delay(LOOP_INTERVAL_TIME * 1000);
  
  checkedSensor = 0;
  
  // DHT 센서 처리
  if(DHT_USE_YN) {
    processDhtSensor();  
    checkedSensor++;
    Serial.print("\t");
  }

  // 토양 센서 처리
  if(SOIL_SENSOR_USE_YN) {
    processSoilSensor();
    checkedSensor++;
    Serial.print("\t");
  }

  if(checkedSensor > 0) {
    Serial.println("");  
  }
}

 

토양습도센서 차이 데이터 측정 자료

- 측정일자: 2017-09-21 23시

 

1. 데이터 측정

1.1 큰화분(샤오미, 토양센서...) 측정 값

a) 조건

- 토양센서 다리 5/5 뭍음

b) 데이터측정

⁃ 36%, 57%(587)

⁃ 큰방울토마토 줄기 기준 거리

⁃ 5cm(37%), 10cm(39%), 15cm(52%) => 물을 주는 방법에 따라 수치가 다를 듯.

 

1.2 작은화분1(골드 방울토마토)

a) 조건

- 토양센서 다리 4/5 뭍음.

b) 데이터 측정

   (샤오미, 토양센서)

⁃ 13%, 29%(296) : 처음 측정.

⁃ 200cc 물주고 - 23:58분, 화분 아래 물 흐름 없음

⁃ 1분후, 48%, 71%(729) - 23:59분

⁃ 5분후, 41%, 70%(721)

⁃ 15분후,41%,70%(719)

⁃ 100cc 추가 - 00:15분, 화분아래 물 흐름.

⁃ 2분후, 67%, 71%(731) <- 토양센서 측정 치 max(730-750)

⁃ 샤오미 센서를 빼고, 물을 닦아서 다시 넣었더니 38%... ㅡㅡ;

=> 아마도, 센서에 직접 물이 뭍은 경우에 수치가 많이 올라가는 듯 함. 물이 고이면 데이터 오류가 발생할 수 있음.

 

1.3 작은화분2(땡땡이 방울토마토)

- 땡땡이 방울 토마토는 물줄 때 최대 200cc 이하가 적당함. 초과시 화분에서 물이 넘칠 수 있음.

a) 조건

⁃ 토양센서 다리 4/5 뭍음.

b) 데이터측정

   (샤오미, 토양센서)

⁃ 19%, 44%(453)

⁃ 30%, 68%(697): 물준후 1분(100cc)

⁃ - 33%, 64%(662) : 15분 후

=> 해당건은 샤오미 쪽 센서가 물이 닿지 않은 듯 함

⁃ 60%,69%(716): 추가 100cc 더, 1분 11:36분

⁃ 58%,68%(703): 5분 후

 

1.4 물주는 시간과 물의 양

a) 조건

- 아파트 14층 베란다 수도꼭지 90도 회전시

b) 데이터측정

- 약 200cc/8초 (단, 호스에 공기가 없다는 가정하에)

 

2. 데이터 평가

1) 토양센서를 얼마나 깊이 뭍는지에 따라 값 차이가 심함. 측정은 거의 도금된 센서 다리모두 뭍음.

2) 토양센서 아나로그 값 max는 1023로 설정해야. 실제 max 아노로그 760으로 설정하면 값 왜곡이 더 심해짐.

3) 토양센서는 다리 짧아 상부 흙의 습도 체크 위주 임(3-4cm).샤오미는 7-8cm 깊이

4) 흙은 상부가 더 말라 있음.

- 샤오미를 작는 화분 측정시 습도가 1/2 뭍을땐 7%, 전체 깊이 뭍으면 13%.

5) 식물 줄기 주변에서 물이 빨리 마르므로(뿔리에서 수분흡수), 센서를 적당한 위치에 설치하는 게 중요함.

 

3. 결론

1) 토양센서의 아나로그 값이 정확한 수치를 알수 없으므로, 사용할 센스의 특성에 맞게 수치를 보정해서 적용해야 함.

- 토양센서 제품에 따라, 습도 0%의 아나로그 수치가 0인 경우도 잇고, 1023인 경우도 있음. 반드시 확인 할 것.

- 현재, 몇가기 제품을 측정해보면, 샤오미제품과 비교할 때 습도가 20~25% 차이가 남.

2) 토양센서를 설치할 때, 줄기에서 5cm~10cm 위치에서 설치하고,

보정된 습도가 43% 정도일 때 물을 공급하는 적당할 듯 함.

- 보정수치습도(%) = 아나로그 실수치 습도(%) - 보정값(23~25%)

. 23% ~ 25%은 몇일 화분을 관찰 했을 때, 화분 겉흙이 말랐을 때, 아나로그 수치가 60% 정도로 측정되었음.

보정수치습도(%)가 40%일때도 물이 공급되지 않아, 화분이 말라서, 43% 정도에서 수분을 공급하기 위해,

보정값을 23%~25%로 조정하는 게 적당함.

 

end.

728x90
Posted by 하루y
728x90

판매사이트 : https://www.devicemart.co.kr/

 

PDF: 센서 스펙

D7-CdS-e.pdf
0.26MB

 

 
 
analogRead()
Description


Reads the value from the specified analog pin. The Arduino board contains a 6 channel (8 channels on the Mini and Nano, 16 on the Mega), 10-bit analog to digital converter. This means that it will map input voltages between 0 and 5 volts into integer values between 0 and 1023. This yields a resolution between readings of: 5 volts / 1024 units or, .0049 volts (4.9 mV) per unit. The input range and resolution can be changed using analogReference().


It takes about 100 microseconds (0.0001 s) to read an analog input, so the maximum reading rate is about 10,000 times a second.


Syntax


analogRead(pin)


Parameters


pin: the number of the analog input pin to read from (0 to 5 on most boards, 0 to 7 on the Mini and Nano, 0 to 15 on the Mega)


Returns


int (0 to 1023)
analogWrite()


Description


Writes an analog value (PWM wave) to a pin. Can be used to light a LED at varying brightnesses or drive a motor at various speeds. After a call to analogWrite(), the pin will generate a steady square wave of the specified duty cycle until the next call to analogWrite() (or a call to digitalRead() or digitalWrite() on the same pin). The frequency of the PWM signal on most pins is approximately 490 Hz. On the Uno and similar boards, pins 5 and 6 have a frequency of approximately 980 Hz. Pins 3 and 11 on the Leonardo also run at 980 Hz.


On most Arduino boards (those with the ATmega168 or ATmega328), this function works on pins 3, 5, 6, 9, 10, and 11. On the Arduino Mega, it works on pins 2 - 13 and 44 - 46. Older Arduino boards with an ATmega8 only support analogWrite() on pins 9, 10, and 11.


The Arduino Due supports analogWrite() on pins 2 through 13, plus pins DAC0 and DAC1. Unlike the PWM pins, DAC0 and DAC1 are Digital to Analog converters, and act as true analog outputs.


You do not need to call pinMode() to set the pin as an output before calling analogWrite().


The analogWrite function has nothing to do with the analog pins or the analogRead function.


Syntax


analogWrite(pin, value)


Parameters


pin: the pin to write to.


value: the duty cycle: between 0 (always off) and 255 (always on).
analogReference() : Configures the reference voltage used for analog input. (default: 5V)
analogReadResolution() is an extension of the Analog API for the Arduino Due and Zero.
analogWriteResolution() is an extension of the Analog API for the Arduino Due and Zero.

 

 

 

728x90
Posted by 하루y