main_outside.ino 5.67 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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
  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);
    
      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
128
129
}

130
131
132
// 함수 정의부

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

144
145
// Wifi 연결 함수

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

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

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

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

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

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