rain_intr.ino 3.78 KB
#include <SoftwareSerial.h>
#define BT_RX 7
#define BT_TX 8

// RX핀(7번)은 HM10의 TX에 연결 
// TX핀(8번)은 HM10의 RX에 연결  
SoftwareSerial HM10(BT_RX,BT_TX);  

// 적외선 센서
int Sensor = 9;    // 센서핀은 9번에 연결
int intruder_val;  

int Raindrops_pin = A0;     // 빗방울센서 핀을 A0으로 설정

// at 설정용
char recv_str[100];

// 지속시간 체크용
int count_i = 0; 
int count_r = 0;

// 변화체크용
bool is_raining;
bool is_intruded;

void setup() {  
    Serial.begin(9600);
    HM10.begin(9600);
    pinMode(Sensor, INPUT);    // 센서값을 입력으로 설정

    // 블루투스 작동확인
    while(1)
    {
        if(sendBlueToothCommand("AT") == 0)
        {
            if(strcmp((char *)recv_str, (char *)"OK") == 0)
            {
                Serial.println("Bluetooth exists\r\n");
                break;
            }
        }
        delay(500);

    }
    sendBlueToothCommand("AT+NAMERAININGSENSOR"); // 블루투스 장치 이름설정
    sendBlueToothCommand("AT+MODE3"); // 블루투스 모드 설정
    sendBlueToothCommand("AT+TYPE3");

    is_raining = true;
    is_intruded = true;


}
void loop() {
    // Serial.println(analogRead(A0));  // 센서 출력값을 시리얼모니터로 전송. 수동확인용
    
    intruder_val = digitalRead(Sensor);  
    // 센서값 읽어옴

    if(is_intruded)
    {
        delay(500);
        if (intruder_val == LOW) {          
        // 장애물이 감지되면  
            while(1){
                delay(1000);
                count_i += 1;
                if(count_i >= 3){
                    HM10.write("intr ");
                    HM10.write(1);
                    break;
                }
            }
            count_i = 0;
            delay(1000);
            is_intruded = false;
        }
    }
    if (intruder_val == HIGH)
    {
        is_intruded = true;
    }


        
    if(is_raining)
    {
        if(analogRead(A0) < 150){         
            // 센서 출력값이 150 미만이면
            // 빗방울 감지가 5초간 지속되면 
            delay(100);
            while(1){
                delay(1000);
                count_r += 1;
                if(count_r >= 5){
                    HM10.write("rain ");
                    HM10.println(1);
                    break;
                }
            }
            count_r = 0;
            delay(1000);
            is_raining = false;
        }

    }
    if(analogRead(A0) > 150)
    {
        is_raining = true;
    }

}

// at 설정용 함수
int sendBlueToothCommand(char command[])
{
    Serial.print("send: ");
    Serial.print(command);
    Serial.println("");
#if NLCR
    HM10.println(command);
#else
    HM10.print(command);
#endif    
    delay(300);

    if(recvMsg(200) != 0) return -1;

    Serial.print("recv: ");
    Serial.print(recv_str);
    Serial.println("");
    return 0;
}

int recvMsg(unsigned int timeout)
{
    //wait for feedback
    unsigned int time = 0;
    unsigned char num;
    unsigned char i;

    //waiting for the first character with time out
    i = 0;
    while(1)
    {
        delay(50);
        if(HM10.available())
        {
            recv_str[i] = char(HM10.read());
            i++;
            break;
        }
        time++;
        if(time > (timeout / 50)) return -1;
    }

    //read other characters from uart buffer to string
    while(HM10.available() && (i < 100))
    {                                              
        recv_str[i] = char(HM10.read());
        i++;
    }
#if NLCR    
    recv_str[i-2] = '\0';       //discard two character \n\r
#else
    recv_str[i] = '\0';
#endif
    return 0;
}