main_outside.ino 5.07 KB
Newer Older
KangMin An's avatar
KangMin An committed
1
#include <SoftwareSerial.h>
2
3
#include <TimeLib.h>
#include <DS1302RTC.h>
KangMin An's avatar
KangMin An committed
4
5


6
7
#define ESP_TX 2         // ESP8266 모듈의 TX 핀
#define ESP_RX 3         // ESP8266 모듈의 RX 핀
KangMin An's avatar
KangMin An committed
8

9
10
11
#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
12

13
14
SoftwareSerial esp(ESP_TX,ESP_RX);          // ESP 모듈 객체 생성
DS1302RTC rtc(RTC_RST, RTC_DAT, RTC_CLK);   // RTC 모듈 객체 생성
KangMin An's avatar
KangMin An committed
15
16
17
18
19
20
21
22


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

23
// 함수 선언부
KangMin An's avatar
KangMin An committed
24
25
26
void connectESP();
void connectWifi();
void sendData(String vars);
27
void printTime(tmElements_t tm);
KangMin An's avatar
KangMin An committed
28
29
30


void setup() {
31

KangMin An's avatar
KangMin An committed
32
33
34
35
36
37
  Serial.begin(9600);     // Serial monitor의 통신 속도 9600으로 설정
  esp.begin(9600);        // esp모듈의 통신 속도 9600으로 설정

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

38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
  // 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
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
  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
104
105
}

106
107
108
// 함수 정의부

// ESP 모듈 연결 함수
KangMin An's avatar
KangMin An committed
109
110
111
112
113
114
115
116
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.");
117
  Serial.println();
KangMin An's avatar
KangMin An committed
118
119
}

120
121
// Wifi 연결 함수

KangMin An's avatar
KangMin An committed
122
void connectWifi(){
123
  String cmd = "AT+CWMODE=1";                         // Client로 설정
KangMin An's avatar
KangMin An committed
124
125
126
127
  esp.println(cmd);
  Serial.println("Set ESP8266 to client.");

  Serial.println("Connecting to Wifi...");
128
  cmd = "AT+CWJAP=\"" + SSID + "\"," + SSPW + "\"";   // Wifi 연결
KangMin An's avatar
KangMin An committed
129
  esp.println(cmd);
130
 
KangMin An's avatar
KangMin An committed
131
132
133
  while(!esp.find("OK"));
  Serial.println("Wifi Connected");
  
134
  cmd = "AT+CWJAP?";                                  // 현재 연결된 AP 정보 확인, 연결 안되어있을 시 "No AP" 출력
KangMin An's avatar
KangMin An committed
135
136
  esp.println(cmd);
  Serial.write(esp.read());
137
  Serial.println();
KangMin An's avatar
KangMin An committed
138
139
}

140
// 서버에 데이터 전송 함수
KangMin An's avatar
KangMin An committed
141
void sendData(String input){
142
  
KangMin An's avatar
KangMin An committed
143
144
145
146
147
148
  // ESP 모듈을 통해 Server로 데이터 전송
  esp.println("AT+CIPSTART=\"TCP\",\"" + EUEIP + "\"," + EUEPORT);
  if(esp.find("Error")){
    Serial.println("AT+CIPSTART Error...");
  }

149
  // Get 방식을 이용한 전송
KangMin An's avatar
KangMin An committed
150
  String msg = "GET /data/input?";
151
152
  msg += input;
  
KangMin An's avatar
KangMin An committed
153
154
155
156
157
158
159
  msg += " HTTP/1.0\r\n\r\n";
  esp.print("AT+CIPSEND=");
  esp.println(msg.length());
  delay(2000);

  if(esp.find(">")){
    esp.print(msg);
160
    Serial.println(msg);
KangMin An's avatar
KangMin An committed
161
162
163
    Serial.println("Data sent.");
    delay(1000);
  }
164
  
KangMin An's avatar
KangMin An committed
165
166
  Serial.println("Connection Closed.");
  esp.println("AT+CIPCLOSE");
167
  Serial.println();
KangMin An's avatar
KangMin An committed
168
}
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184

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