main_outside.ino 5.75 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
24
/*

  # 실외 데이터 수집기 코드

  ## 사용자 변수

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

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

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

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

*/

KangMin An's avatar
KangMin An committed
25
#include <SoftwareSerial.h>
26
27
#include <TimeLib.h>
#include <DS1302RTC.h>
KangMin An's avatar
KangMin An committed
28
29


30
31
#define ESP_TX 2         // ESP8266 모듈의 TX 핀
#define ESP_RX 3         // ESP8266 모듈의 RX 핀
KangMin An's avatar
KangMin An committed
32

33
34
35
#define RTC_CLK 4        // DS1302RTC 모듈의 CLK 핀
#define RTC_DAT 5        // DS1302RTC 모듈의 DAT 핀
#define RTC_RST 6        // DS1302RTC 모듈의 CLK 핀
KangMin An's avatar
KangMin An committed
36

37
38
SoftwareSerial esp(ESP_TX,ESP_RX);          // ESP 모듈 객체 생성
DS1302RTC rtc(RTC_RST, RTC_DAT, RTC_CLK);   // RTC 모듈 객체 생성
KangMin An's avatar
KangMin An committed
39
40
41
42
43
44
45
46


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

47
// 함수 선언부
KangMin An's avatar
KangMin An committed
48
49
50
void connectESP();
void connectWifi();
void sendData(String vars);
51
void printTime(tmElements_t tm);
KangMin An's avatar
KangMin An committed
52
53
54


void setup() {
55

KangMin An's avatar
KangMin An committed
56
57
58
59
60
61
  Serial.begin(9600);     // Serial monitor의 통신 속도 9600으로 설정
  esp.begin(9600);        // esp모듈의 통신 속도 9600으로 설정

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

62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
  // 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();
}

void loop() {
KangMin An's avatar
KangMin An committed
85

86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
  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));
KangMin An's avatar
KangMin An committed
105
      date += "-";
106
      date += tm.Month < 10 ? '0' + String(tm.Month) : String(tm.Month);
KangMin An's avatar
KangMin An committed
107
      date += "-";
108
      date += tm.Day < 10 ? '0' + String(tm.Day) : String(tm.Day);
KangMin An's avatar
KangMin An committed
109
      date += " ";
110
      date += tm.Hour < 10 ? '0' + String(tm.Hour): String(tm.Hour);
KangMin An's avatar
KangMin An committed
111
      date += ":"
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
      date += tm.Minute < 10 ? '0' + String(tm.Minute) : String(tm.Minute);
    
      String type_ = "Out";
      String locCode = "3743011";
      float lati = 37.241706;
      String str_lati = String(lati,6);
      float lng = 131.864889;
      String str_lng = String(lng,6);
    
      input += "type=" + type_;
      input += "&locCode=" + locCode;
      input += "&date=" + date;
      input += "&lat=" + str_lati;
      input += "&lng=" + str_lng;

      sendData(input);
    }
  }

  delay(1000);    // 1초 단위로 확인하기 위한 지연
KangMin An's avatar
KangMin An committed
132
133
}

134
135
136
// 함수 정의부

// ESP 모듈 연결 함수
KangMin An's avatar
KangMin An committed
137
138
139
140
141
142
143
144
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.");
145
  Serial.println();
KangMin An's avatar
KangMin An committed
146
147
}

148
149
// Wifi 연결 함수

KangMin An's avatar
KangMin An committed
150
void connectWifi(){
151
  String cmd = "AT+CWMODE=1";                         // Client로 설정
KangMin An's avatar
KangMin An committed
152
153
154
155
  esp.println(cmd);
  Serial.println("Set ESP8266 to client.");

  Serial.println("Connecting to Wifi...");
156
  cmd = "AT+CWJAP=\"" + SSID + "\"," + SSPW + "\"";   // Wifi 연결
KangMin An's avatar
KangMin An committed
157
  esp.println(cmd);
158
 
KangMin An's avatar
KangMin An committed
159
160
161
  while(!esp.find("OK"));
  Serial.println("Wifi Connected");
  
162
  cmd = "AT+CWJAP?";                                  // 현재 연결된 AP 정보 확인, 연결 안되어있을 시 "No AP" 출력
KangMin An's avatar
KangMin An committed
163
164
  esp.println(cmd);
  Serial.write(esp.read());
165
  Serial.println();
KangMin An's avatar
KangMin An committed
166
167
}

168
// 서버에 데이터 전송 함수
KangMin An's avatar
KangMin An committed
169
void sendData(String input){
170
  
KangMin An's avatar
KangMin An committed
171
172
173
174
175
176
  // ESP 모듈을 통해 Server로 데이터 전송
  esp.println("AT+CIPSTART=\"TCP\",\"" + EUEIP + "\"," + EUEPORT);
  if(esp.find("Error")){
    Serial.println("AT+CIPSTART Error...");
  }

177
  // Get 방식을 이용한 전송
KangMin An's avatar
KangMin An committed
178
  String msg = "GET /api/data/input?";
179
180
  msg += input;
  
KangMin An's avatar
KangMin An committed
181
182
183
184
185
186
187
  msg += " HTTP/1.0\r\n\r\n";
  esp.print("AT+CIPSEND=");
  esp.println(msg.length());
  delay(2000);

  if(esp.find(">")){
    esp.print(msg);
188
    Serial.println(msg);
KangMin An's avatar
KangMin An committed
189
190
191
    Serial.println("Data sent.");
    delay(1000);
  }
192
  
KangMin An's avatar
KangMin An committed
193
194
  Serial.println("Connection Closed.");
  esp.println("AT+CIPCLOSE");
195
  Serial.println();
KangMin An's avatar
KangMin An committed
196
}
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212

// 시간 출력 함수
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();
}