dht.ino
6.48 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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#define DHTPIN 2
#define DHTTYPE DHT22
DHT_Unified dht(DHTPIN, DHTTYPE);
uint32_t delayMS;
// 미세먼지 센서
int dust_sensor = A0; // 미세먼지 핀 번호
float dust_value = 0; // 센서에서 입력 받은 미세먼지 값
float dustDensityug=0; // ug/m^3 값을 계산
int sensor_led = 12; // 미세먼지 센서 안에 있는 적외선 led 핀 번호
int sampling = 280; // 적외선 led를 키고, 센서 값을 읽어 들여 미세먼지를 측정하는 샘플링 시간
int waiting = 40;
float stop_time = 9680; // 센서를 구동하지 않는 시간
// 블루투스 모듈
#include <SoftwareSerial.h>
#define BT_RX 7
#define BT_TX 8
SoftwareSerial HM10(BT_RX,BT_TX); // RX핀(7번)은 HM10의 TX에 연결
// TX핀(8번)은 HM10의 RX에 연결
// at 설정
char recv_str[100];
// 변화 유무
bool tempBool;
bool humidBool;
bool dustBool;
void setup(){
Serial.begin(9600);
// 온습도 센서
dht.begin();
sensor_t sensor;
dht.temperature().getSensor(&sensor);
dht.humidity().getSensor(&sensor);
delayMS = sensor.min_delay / 1000;
// 미세먼지 센서
pinMode(sensor_led,OUTPUT); // 미세먼지 적외선 led를 출력으로 설정
pinMode(4, OUTPUT);
// 블루투스 모듈
HM10.begin(9600);
// 블루투스 작동확인
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+NAMEDUSTSENSOR"); // 블루투스 장치 이름설정
sendBlueToothCommand("AT+MODE3"); // 블루투스 모드 설정
sendBlueToothCommand("AT+TYPE3");
tempBool = true;
humidBool = true;
dustBool = true;
}
void loop(){
delay(delayMS);
sensors_event_t event;
if(tempBool)
{
dht.temperature().getEvent(&event);
double temp_val = (double)event.temperature;
if (isnan(temp_val)) {
HM10.println(F("Error reading temperature!"));
}
else {
HM10.write(F("temp "));
HM10.println(temp_val);
delay(2000);
}
}
if(humidBool)
{
dht.humidity().getEvent(&event);
double humid_val = (double)event.relative_humidity;
if (isnan(humid_val)) {
HM10.println(F("Error reading humidity!"));
}
else {
HM10.write(F("humd "));
HM10.println(humid_val);
delay(2000);
}
}
if(dustBool)
{
// 미세먼지 센서
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)) - 0.1) * 1000; // 미세먼지 값 계산
double dust_val = dustDensityug;
// 센서 값 전송
HM10.write("dust ");
HM10.println(dustDensityug);
delay(2000);
}
while(1)
{
delay(1000);
digitalWrite(sensor_led, LOW); // LED 켜기
delayMicroseconds(sampling); // 샘플링해주는 시간.
dust_value = analogRead(dust_sensor); // 센서 값 읽어오기
delayMicroseconds(waiting); // 너무 많은 데이터 입력을 피해주기 위해 잠시 멈춰주는 시간.
digitalWrite(sensor_led, HIGH); // LED 끄기
delayMicroseconds(stop_time); // LED 끄고 대기
is_dust_different(dustDensityug, dust_val, dustBool);
dht.temperature().getEvent(&event);
is_temp_different((double)event.temperature, temp_val, tempBool);
dht.humidity().getEvent(&event);
is_humid_different((double)event.relative_humidity, humid_val, humidBool);
if(dustBool || tempBool || humidBool){
break;
}
}
}
// 10의 자리수에 변화가 발생시 값 전송 함수
bool is_dust_different(double now_dustVal, double& past_dustV bool& dustBool){
if((now_dustVal/10)!=(past_dustV/10)){
return true;
}
else{
return false;
}
}
// 이전 값과 4 초과의 차이가 발생시 값 전송 함수
bool is_humid_different(double now_humidVal, double& past_humidV bool& humidBool){
if((now_humidVal>past_humidV+2) || (now_humidVal<past_humidV-2)){
return true;
}
else{
return false;
}
}
// 이전 값과 1.5 초과의 차이가 발생시 값 전송 함수
bool is_temp_different(double now_tempVal, double& past_tempV bool& tempBool){
if((now_tempVal>past_tempV+0.75) || (now_tempVal<past_tempV-0.75)){
return true;
}
else{
return false;
}
}
// 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;
}