정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

아두이노 조건문 질문드립니다.
vim | 2018-08-27

//초음파 센서의 핀번호를 설정한다.
int echoPin = 12;
int trigPin = 13;
int rled = 2; //릴레이 전원제어 5V(작동)
int rsensor =4;
int gled = 6; //릴레이 방향제어 (정방향, 역방향)
//미세먼지
int dust_sensor = A1;   // 미세먼지 핀 번호

float dust_value = 0;  // 센서에서 입력 받은 미세먼지 값
float dustDensityug = 0; // ug/m^3 값을 계산

int sensor_led = 11;      // 미세먼지 센서 안에 있는 적외선 led 핀 번호
int sampling = 280;    // 적외선 led를 키고, 센서 값을 읽어 들여 미세먼지를 측정하는 샘플링 시간
int waiting = 40;
float stop_time = 9680;   // 센서를 구동하지 않는 시간

void setup() {
  Serial.begin(9600);
  // trig를 출력모드로 설정, echo를 입력모드로 설정
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(rled, OUTPUT);
  pinMode(rsensor, INPUT);
  pinMode(gled, OUTPUT);
  pinMode(sensor_led, OUTPUT);
}

void loop() {
  float duration, distance;
  
  // 초음파를 보낸다. 다 보내면 echo가 HIGH 상태로 대기하게 된다.
  digitalWrite(trigPin, HIGH);
  delay(10);
  digitalWrite(trigPin, LOW);
  
  // echoPin 이 HIGH를 유지한 시간을 저장 한다.
  duration = pulseIn(echoPin, HIGH); 
  // HIGH 였을 때 시간(초음파가 보냈다가 다시 들어온 시간)을 가지고 거리를 계산 한다.
  distance = ((float)(340 * duration) / 10000) / 2;  
//미세먼지
  digitalWrite(sensor_led, LOW);    // LED 켜기
  delayMicroseconds(sampling);   // 샘플링해주는 시간.

  dust_value = analogRead(dust_sensor); // 센서 값 읽어오기

  delayMicroseconds(waiting);  // 너무 많은 데이터 입력을 피해주기 위해 잠시 멈춰주는 시간.

  digitalWrite(sensor_led, HIGH); // LED 끄기
  delayMicroseconds(stop_time);   // LED 끄고 대기

  dustDensityug = (0.17 * (dust_value * (5.0 / 1024)) - 0.1) * 1000;    // 미세먼지 값 계산

  delay(500);
   //조건문
    if (distance >= 20 && digitalRead(rsensor) == HIGH ){
     if (dustDensityug <= 80.0 ){ 
    digitalWrite(rled, HIGH); 
    digitalWrite(gled, HIGH); }
     else if (dustDensityug >= 80.0 ){ 
    digitalWrite(rled, HIGH); 
    digitalWrite(gled, HIGH); }
  }
  else if (distance >=20 && digitalRead(rsensor) == LOW ) { 
    if (dustDensityug <= 80.0 ){ 
    digitalWrite(rled, HIGH);
    digitalWrite(gled, HIGH); }
     else if (dustDensityug >= 80.0 ){
    digitalWrite(rled, LOW);
    digitalWrite(gled, LOW); }
  } 
  else if (distance <=5 && digitalRead(rsensor) == HIGH ) { 
    if (dustDensityug <= 80.0 ){ 
    digitalWrite(rled, LOW);
    digitalWrite(gled, HIGH); }
     else if (dustDensityug >= 80.0 ){ 
    digitalWrite(rled, LOW); 
    digitalWrite(gled, HIGH); }
  }


  else if (distance <=3 && digitalRead(rsensor) == LOW ) {
 if (dustDensityug >= 80.0 ){ 
    digitalWrite(rled, LOW); 
    digitalWrite(gled, HIGH); }
     else if (dustDensityug <= 80.0 ){ 
    digitalWrite(rled, HIGH); 
    digitalWrite(gled, LOW); }
  }

  
  delay(100);
  Serial.print("Dust Density [ug/m3]: ");            // 시리얼 모니터에 미세먼지 값 출력
  Serial.print(dustDensityug);
  Serial.print("               ");
  Serial.print(distance);
  Serial.println("cm");
  // 수정한 값을 출력
  delay(500);
}

초음파와 미세먼지 그리고 워터센서에 의해 결정되는 창문의 열고 닫힘을 설정 한 것 입니다.

 

초음파와 미세먼지를 따로 설정 한 것은 정상적으로 작동을 하고

초음파와 워터센서로 따로 설정 한 것도 정상적으로 작동을 합니다.

 

그러나 세 가지를 합쳐서 조건을 따지게 되면 어느 하나가 제대로 인식을 하지 못하거나 두가지 조건 모두 인식을 하지 못하게 됩니다. 

   //조건문
  if (distance >= 20  && dustDensityug <= 80.0 ) { 
    digitalWrite(rled, HIGH); 
    digitalWrite(gled, HIGH);
  }
  else if (distance >=20 && dustDensityug >= 80.0 ) { 
    digitalWrite(rled, LOW);
    digitalWrite(gled, HIGH); 
  }
  else if (distance <=5 && dustDensityug <= 80.0 ) { 
    digitalWrite(rled, LOW);
    digitalWrite(gled, LOW);
  }
  else if (distance <=5 && dustDensityug >= 80.0 ) { 
    digitalWrite(rled, HIGH); 
    digitalWrite(gled, LOW);
  }

 

 

이것은 미세먼지와 초음파만 따로 적용한 조건문인데 정상적으로 잘 작동합니다.

 

 

어디서 문제가 있는건지 모르겠습니다. 고수님덜 좀 도와주십시오.

이전글   |    오렌지보드 BLE 블루투스 보드 레이트 수정 ... 2018-08-25
다음글   |    아두이노 Firebase 연동 2018-09-01