main_inside.ino 8.24 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*

  # 실내 데이터 수집기 코드

  ## 사용자 변수

  1. String SSID
  2. String SSPW
  3. String EUEIP
  4. int EUEPORT
  5. String ID
  6. String locCode
  
  ## PC에 연결하여 동작 (시리얼 모니터 사용 O)

    시리얼 모니터를 통해 상태를 확인하는 경우, 사용자 변수들의 값만 변경하여 사용합니다.

  ## 아두이노 단독 실행 (시리얼 모니터 사용 X)

    시리얼 모니터를 사용하지 않는 경우, 사용자 변수 값 변경 이외에 아래 "Serial.~~" 꼴로 된 라인은 모두 주석처리 해줍니다.

*/

24
25
26
#include <SoftwareSerial.h>
#include <DHT.h>
#include <DHT_U.h>
27
28
#include <TimeLib.h>
#include <DS1302RTC.h>
29
30


31
32
#define ESP_TX 2         // ESP8266 모듈의 TX 핀
#define ESP_RX 3         // ESP8266 모듈의 RX 핀
33

34
35
36
#define RTC_CLK 4        // DS1302RTC 모듈의 CLK 핀
#define RTC_DAT 5        // DS1302RTC 모듈의 DAT 핀
#define RTC_RST 6        // DS1302RTC 모듈의 CLK 핀
37

38
39
#define DHT_DAT 10        // DHT11 핀 
#define DHTTYPE DHT11    // DHT 모듈 종류
40

41
42
#define CDS_D 8          // CDS 모듈 디지털 핀
#define CDS_A A0         // CDS 모듈 아날로그 핀
43

44
uint32_t delayMS;        // 센서를 읽는 지연시간
45
46


47
48
49
SoftwareSerial esp(ESP_TX,ESP_RX);          // ESP 모듈 객체 생성
DHT_Unified dht(DHT_DAT, DHTTYPE);          // DHT 모듈 객체 생성
DS1302RTC rtc(RTC_RST, RTC_DAT, RTC_CLK);   // RTC 모듈 객체 생성
50
51
52
53
54
55
56
57


String SSID = "Wifi_SSID";        // Wifi - SSID
String SSPW = "Wifi_SSPW";        // Wifi - SSPW

String EUEIP = "EUE_IP";          // Web Server - IP
int EUEPORT = 8081;               // Web Server - Port

58
// 함수 선언부
59
60
61
void connectESP();
void connectWifi();
void sendData(String vars);
62
void printTime(tmElements_t tm);
63
64
65
66
67
68
69
70
71
72
73
74


void setup() {

  pinMode(CDS_D, INPUT);  // CDS모듈의 Pinmode를 Input으로 설정
  
  Serial.begin(9600);     // Serial monitor의 통신 속도 9600으로 설정
  esp.begin(9600);        // esp모듈의 통신 속도 9600으로 설정

  connectESP();           // ESP 모듈 탐색
  connectWifi();          // ESP 모듈 wifi 연결

75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
  // DS1302 RTC 모듈이 작동 중인지 확인
  if(rtc.haltRTC()){
    Serial.println("The DS1302 is stopped.");
    rtc.haltRTC(0);
    Serial.println("The DS1302 starts.");
    delay(100);
  } else{
    Serial.println("The DS1302 is working");
  }
  Serial.println();

  // DS1302 RTC 모듈이 쓰기 금지 모드 상태인지 확인
  if(rtc.writeEN() == 0){
    Serial.println("The DS1302 is write protected.");
  } else{
    Serial.println("The DS1302 can write.");
    rtc.writeEN(false);
    Serial.println("Write protected is started.");
  }
  Serial.println();

96
97
  dht.begin();            // DHT11 센서 작동 시작
  Serial.println("DHT11 Unified Sensor Start.");
98
  Serial.println();
99
100
101
102
103
104
105
106
107
108
109
110
111
112

  sensor_t sensor;        // dht11 구조체 생성

  // 온도센서 정보 출력
  dht.temperature().getSensor(&sensor);
  Serial.println("------------------------------------");
  Serial.println("Temperature(온도)");
  Serial.print("Sensor : ");Serial.println(sensor.name);
  Serial.print("Drive Ver : ");Serial.println(sensor.version);
  Serial.print("Unique ID : ");Serial.println(sensor.sensor_id);
  Serial.print ("Max Value : "); Serial.print(sensor.max_value); Serial.println(" *C");
  Serial.print ("Min Value : "); Serial.print(sensor.min_value); Serial.println(" *C");
  Serial.print ("Resolution : "); Serial.print(sensor.resolution); Serial.println(" *C");  
  Serial.println("------------------------------------");
113
  Serial.println();
114
115
116
117
118
119
120
121
122
123
124
125

  // 습도센서 정보 프린트
  dht.humidity().getSensor(&sensor);
  Serial.println("------------------------------------");
  Serial.println("Humidity(습도)");
  Serial.print ("Sensor : "); Serial.println(sensor.name);
  Serial.print ("Driver Ver : "); Serial.println(sensor.version);
  Serial.print ("Unique ID : "); Serial.println(sensor.sensor_id);
  Serial.print ("Max Value : "); Serial.print(sensor.max_value); Serial.println("%");
  Serial.print ("Min Value : "); Serial.print(sensor.min_value); Serial.println("%");
  Serial.print ("Resolution : "); Serial.print(sensor.resolution); Serial.println("%");  
  Serial.println("------------------------------------");
126
  Serial.println();
127
128
129
130
131

  delayMS =sensor.min_delay /1000;                    // 센서를 읽는 시간을 최소로 설정
}

void loop() {
KangMin An's avatar
KangMin An committed
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
  tmElements_t tm;        // 시간 데이터를 저장하는 변수
  if(rtc.read(tm) == 0){

    printTime(tm);
    
    if(tm.Minute % 10 == 0 && tm.Second == 0){
      // Wifi 연결 확인
      String cmd = "AT+CWJAP?";
      esp.println(cmd);
      if(esp.find("No AP")){
        Serial.println("Wifi disconnected, try to connect...");
        connectESP();           // ESP 모듈 탐색
        connectWifi();          // ESP 모듈 wifi 연결 
      }

      String input = "";        // 전송할 데이터

      String date = "";         // 전송 시점 데이터
      date += String(tmYearToCalendar(tm.Year));
      date += tm.Month < 10 ? '0' + String(tm.Month) : String(tm.Month);
      date += tm.Day < 10 ? '0' + String(tm.Day) : String(tm.Day);
      date += tm.Hour < 10 ? '0' + String(tm.Hour): String(tm.Hour);
      date += tm.Minute < 10 ? '0' + String(tm.Minute) : String(tm.Minute);
    
      sensors_event_t event;    // dht 모듈의 데이터 수집

      // 온도 데이터
      dht.temperature().getEvent(&event);
      float temp = event.temperature;
      String str_Temp = isnan(temp) != 0 ? "none" : String(temp);

      // 습도 데이터
      dht.humidity().getEvent(&event);
      float humi = event.relative_humidity;
      String str_Humi = isnan(humi) != 0 ? "none" : String(humi);

      // 조도 데이터
      int lights = analogRead(CDS_A);
      String str_Lights = isnan(lights) != 0 ? "none" : String(lights);
    
      String type_ = "In";
      String ID = "eue_tester1";
      String locCode = "3124053";
    
      input += "type=" + type_;
      input += "&id=" + ID;
      input += "&locCode=" + locCode;
      input += "&date=" + date;
      input += "&temp=" + str_Temp;
      input += "&humi=" + str_Humi;
      input += "&lights=" + str_Lights;

      sendData(input);
    }
  }
KangMin An's avatar
KangMin An committed
188

189
  delay(1000);    // 1초 단위로 확인하기 위한 지연
190
191
}

192
193
194
// 함수 정의부

// ESP 모듈 연결 함수
195
196
197
198
199
200
201
202
void connectESP(){
  esp.println("AT");
  Serial.println("AT Sent");
  while(!esp.find("OK")){
    esp.println("AT");
    Serial.println("ESP8266 Not Found.");
  }
  Serial.println("OK Command Received.");
203
  Serial.println();
204
205
}

206
207
// Wifi 연결 함수

208
void connectWifi(){
209
  String cmd = "AT+CWMODE=1";                         // Client로 설정
210
211
212
213
  esp.println(cmd);
  Serial.println("Set ESP8266 to client.");

  Serial.println("Connecting to Wifi...");
214
  cmd = "AT+CWJAP=\"" + SSID + "\"," + SSPW + "\"";   // Wifi 연결
215
  esp.println(cmd);
216
 
217
218
219
  while(!esp.find("OK"));
  Serial.println("Wifi Connected");
  
220
  cmd = "AT+CWJAP?";                                  // 현재 연결된 AP 정보 확인, 연결 안되어있을 시 "No AP" 출력
221
222
  esp.println(cmd);
  Serial.write(esp.read());
223
  Serial.println();
224
225
}

226
// 서버에 데이터 전송 함수
227
void sendData(String input){
228
229
  
  // ESP 모듈을 통해 Server로 데이터 전송
230
231
232
233
234
  esp.println("AT+CIPSTART=\"TCP\",\"" + EUEIP + "\"," + EUEPORT);
  if(esp.find("Error")){
    Serial.println("AT+CIPSTART Error...");
  }

235
  // Get 방식을 이용한 전송
236
  String msg = "GET /data/input?";
237
238
  msg += input;
  
239
240
241
242
243
244
245
  msg += " HTTP/1.0\r\n\r\n";
  esp.print("AT+CIPSEND=");
  esp.println(msg.length());
  delay(2000);

  if(esp.find(">")){
    esp.print(msg);
246
    Serial.println(msg);
247
248
249
    Serial.println("Data sent.");
    delay(1000);
  }
250
  
251
252
  Serial.println("Connection Closed.");
  esp.println("AT+CIPCLOSE");
253
  Serial.println();
254
}
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270

// 시간 출력 함수
void printTime(tmElements_t tm){
  Serial.print(tmYearToCalendar(tm.Year));
  Serial.print(" / ");
  Serial.print(tm.Month < 10 ? '0' + String(tm.Month) : tm.Month);
  Serial.print(" / ");
  Serial.print(tm.Day < 10 ? '0' + String(tm.Day) : tm.Day);
  Serial.print(" - ");
  Serial.print(tm.Hour < 10 ? '0' + String(tm.Hour) : tm.Hour);
  Serial.print(" : ");
  Serial.print(tm.Minute < 10 ? '0' + String(tm.Minute) : tm.Minute);
  Serial.print(" : ");
  Serial.println(tm.Second < 10 ? '0' + String(tm.Second) : tm.Second);
  Serial.println();
}