rain_intr.ino
3.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#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;
}