반응형

 

#include <Servo.h>
#include "DHT.h" 
#include <SoftwareSerial.h>

Servo myservo;
Servo Tapservo;
int force_sensor1 = A0;
int force_sensor2 = A1;
int water = A3;

//블루투스 모듈
#define blueTX 5  // BT_TXD를 5로 설정합니다.
#define blueRX 13  // BT_RXD를 13으로 설정합니다.

SoftwareSerial mySerial(blueRX, blueTX);
//5, 13번 data pin사용

int ledPin_bath= 2;

int dhtPin = 3;

int servoPin = 4;

int servoTap = 6;

int ledPin_room = 7;

int Relaypin = 9;

int count = 0;
int alarm = -1;
int ButtonSwitch =0;

//초음파 센서
#define echoPin 12                    // echoPin을 12로 설정합니다.
#define trigPin 11                   // trigPin을 13으로 설정합니다.
//12~13 data pin사용

long duration, distance;

DHT dht(dhtPin,DHT11);

int old_force1=0;
int val = 0;

int angle = 0;

void setup() {
  // put your setup code here, to run once:
   
  Serial.begin(9600);

  mySerial.begin(9600);

  myservo.attach(servoPin);
  Tapservo.attach(servoTap);

  pinMode(Relaypin, OUTPUT);
  
  pinMode(ledPin_bath, OUTPUT);
  pinMode(ledPin_room, OUTPUT);
  
  pinMode(force_sensor1, INPUT);
  pinMode(force_sensor2, INPUT);
  
  pinMode(trigPin, OUTPUT);   // trigPin 핀을 출력핀으로 설정합니다.
  pinMode(echoPin, INPUT);    // echoPin 핀을 입력핀으로 설정합니다.
}

void loop() {

  // put your main code here, to run repeatedly:
  int level = analogRead(water);  // 수분센서의 신호를 측정합니다.


  int force_val1 = analogRead(force_sensor1); 
  int force_val2 = analogRead(force_sensor2);

  
 int angle1 = 0;

//블루투스 모듈 (begin)
  if (mySerial.available()) {
    Serial.write(mySerial.read());  //블루투스측 내용을 시리얼모니터에 출력
    alarm = 1;
    ButtonSwitch++;
    if(ButtonSwitch>1){
      ButtonSwitch=0;
    }
    else if(ButtonSwitch==0){
      alarm=-1;
    }
    if(alarm==1){
      Serial.println("All Sensors ON");
      digitalWrite(ledPin_room, HIGH);
      digitalWrite(ledPin_bath, HIGH);
      digitalWrite(Relaypin, HIGH);
      for(angle1 = 180; angle1 > 0; angle1--) 
      { 
        Tapservo.write(angle1); 
        delay(5); 
      }
    }
    else{
    Serial.println("All Sensors OFF");
    }
  }
  if(Serial.available()){
    mySerial.write(Serial.read());
  }
//블루투스 모듈 (end)




//릴레이1채널 + 진동
/*
  if(val == 1){
    digitalWrite(Relaypin, HIGH);
  }
  else{
    digitalWrite(Relaypin, LOW)
  };*/
//
 
//물 센서
  Serial.println(String("water level :")+level);
//  delay(100);
  if(level >500 && count == 0){
    for(angle1 = 0; angle1 < 180; angle1++) 
    { 
      Tapservo.write(angle1); 
      delay(5); 
      count++;
    }
    angle1 = 0; 
  }

  if(level < 500){
    count = 0;
  }

//압력
  Serial.println("first : "+String(force_val1));
//  delay(100);
  Serial.println("second : "+String(force_val2));
//  delay(100);


//초음파 센서 (begin)
  digitalWrite(trigPin, LOW);                 // trigPin에 LOW를 출력하고
  delayMicroseconds(2);                    // 2 마이크로초가 지나면
  digitalWrite(trigPin, HIGH);                // trigPin에 HIGH를 출력합니다.
  delayMicroseconds(10);                  // trigPin을 10마이크로초 동안 기다렸다가
  digitalWrite(trigPin, LOW);                // trigPin에 LOW를 출력합니다.
  duration = pulseIn(echoPin, HIGH);   // echoPin핀에서 펄스값을 받아옵니다.

  distance = duration * 17 / 1000;          //  duration을 연산하여 센싱한 거리값을 distance에 저장합니다.

  if (distance >= 200 || distance <= 0)       // 거리가 200cm가 넘거나 0보다 작으면
  {
    Serial.println("거리를 측정할 수 없음");   // 에러를 출력합니다.
  }
  else if(distance >= 0 && distance <=7){
    digitalWrite(ledPin_bath, LOW);
    digitalWrite(ledPin_room, LOW);
    Serial.print(distance);
    Serial.println(" cm");
    Serial.println("Passed");    
  }
    else                                               // 거리가 200cm가 넘지 않거나 0보다 작지 않으면
  {
    Serial.print(distance);                        // distance를 시리얼 모니터에 출력합니다.
    Serial.println(" cm");                         // cm를 출력하고 줄을 넘깁니다.
                                                     // distance가 10이면 10 cm로 출력됩니다.
  }
//  delay(100);                                         // 0.5초동안 기다립니다.
//초음파센서 (end)



//압력 값 조건 되면 
  if(force_val1 < 50 && force_val2 != 0 && old_force1 > force_val1+100){
    digitalWrite(Relaypin, LOW);
  }

  old_force1 = force_val1;

 //온습도 측정 데이터 보여줌
  int humidity = dht.readHumidity();
  int temperature = dht.readTemperature();
  
  Serial.print("Humidity: ");  // 문자열 Humidity: 를 출력한다.
  Serial.print(humidity);  // 변수 h(습도)를 출력한다.
  Serial.print("%\t");  // %를 출력한다
  Serial.print("Temperature: ");  // 이하생략
  Serial.print(temperature);
  Serial.println(" C");


  
//습도 높으면 환기 모터 돌아감
  if(humidity  > 75){
    for(angle = 0; angle < 180; angle++) 
    { 
      myservo.write(angle); 
      delay(5); 
    } 
    // now scan back from 180 to 0 degrees
    for(angle = 180; angle > 0; angle--) 
    { 
      myservo.write(angle); 
      delay(5); 
    }
  }

  delay(450);
   
}

1. 사용자가 어플리케이션에서 알람 시간을 설정하면 그 시간에 알람이 울림과 동시에 온수 보일러가 가동된다.

 

2. 침대의 압력센서가 사용자가 침대에 누워있는지를 감지하고 압력이 감지되지 않을 때까지 알람이 울리도록 설계하여 회사나 수업에 지각하는 일을 방지해준다.

 

3. 이런 과정동안 욕조에는 자동으로 데워진 물이 채워지고 일정한 수위가 넘어가면 수도꼭지가 잠겨 더 이상 욕조의 물이 넘치는 일을 방지한다.

 

4. 사용자가 씻는 과정을 마친 후에는 자동으로 화장실의 습도를 측정하여 일정 수준을 넘기면 환풍기가 작동하여 화장실의 습도를 조절해준다.

 

5. 출근 준비가 끝난 사용자는 어플리케이션을 실행하여 메인 화면을 통해 회사 지역의 시간별 날씨를 확인하고 대중교통의 다음 도착시간, 그날 아침의 뉴스 헤드라인을 한번에 확인할 수 있다.

 

6. 또한 오늘 챙겨야 할 물품들을 전날에 미리 어플리케이션에 등록하는 과정을 통해 챙겨야 할 물품들을 다시한번 확인하여 준비물을 까먹고 그냥 출근하는 경우를 예방한다.

 

7. 사용자가 집을 나서기 전, 현관에 위치한 초음파 센서를 통해 사용자가 집을 나가는 것을 확인하면 집 안의 환풍기를 제외한 모든 센서와 조명등이 자동으로 꺼진다.

 

 

728x90
반응형

'공부 > 아두이노' 카테고리의 다른 글

아두이노 압력센서  (0) 2020.07.18
아두이노 온습도 센서  (0) 2020.07.18
아두이노 센서 여러개 사용시 에러  (0) 2020.07.17
블로그 이미지

아상관없어

,