//초음파 센서의 핀번호를 설정한다.
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);
}
이것은 미세먼지와 초음파만 따로 적용한 조건문인데 정상적으로 잘 작동합니다.
어디서 문제가 있는건지 모르겠습니다. 고수님덜 좀 도와주십시오.
|