main_inside.ino 7.66 KB
Newer Older
1
2
3
#include <SoftwareSerial.h>
#include <DHT.h>
#include <DHT_U.h>
4
5
#include <TimeLib.h>
#include <DS1302RTC.h>
6
7


8
9
#define ESP_TX 2         // ESP8266 모듈의 TX 핀
#define ESP_RX 3         // ESP8266 모듈의 RX 핀
10

11
12
13
#define RTC_CLK 4        // DS1302RTC 모듈의 CLK 핀
#define RTC_DAT 5        // DS1302RTC 모듈의 DAT 핀
#define RTC_RST 6        // DS1302RTC 모듈의 CLK 핀
14

15
16
#define DHT_DAT 10        // DHT11 핀 
#define DHTTYPE DHT11    // DHT 모듈 종류
17

18
19
#define CDS_D 8          // CDS 모듈 디지털 핀
#define CDS_A A0         // CDS 모듈 아날로그 핀
20

21
uint32_t delayMS;        // 센서를 읽는 지연시간
22
23


24
25
26
SoftwareSerial esp(ESP_TX,ESP_RX);          // ESP 모듈 객체 생성
DHT_Unified dht(DHT_DAT, DHTTYPE);          // DHT 모듈 객체 생성
DS1302RTC rtc(RTC_RST, RTC_DAT, RTC_CLK);   // RTC 모듈 객체 생성
27
28
29
30
31
32
33
34


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

35
// 함수 선언부
36
37
38
void connectESP();
void connectWifi();
void sendData(String vars);
39
void printTime(tmElements_t tm);
40
41
42
43
44
45
46
47
48
49
50
51


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 연결

52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
  // 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();

73
74
  dht.begin();            // DHT11 센서 작동 시작
  Serial.println("DHT11 Unified Sensor Start.");
75
  Serial.println();
76
77
78
79
80
81
82
83
84
85
86
87
88
89

  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("------------------------------------");
90
  Serial.println();
91
92
93
94
95
96
97
98
99
100
101
102

  // 습도센서 정보 프린트
  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("------------------------------------");
103
  Serial.println();
104
105
106
107
108

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

void loop() {
KangMin An's avatar
KangMin An committed
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
  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
165

166
  delay(1000);    // 1초 단위로 확인하기 위한 지연
167
168
}

169
170
171
// 함수 정의부

// ESP 모듈 연결 함수
172
173
174
175
176
177
178
179
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.");
180
  Serial.println();
181
182
}

183
184
// Wifi 연결 함수

185
void connectWifi(){
186
  String cmd = "AT+CWMODE=1";                         // Client로 설정
187
188
189
190
  esp.println(cmd);
  Serial.println("Set ESP8266 to client.");

  Serial.println("Connecting to Wifi...");
191
  cmd = "AT+CWJAP=\"" + SSID + "\"," + SSPW + "\"";   // Wifi 연결
192
  esp.println(cmd);
193
 
194
195
196
  while(!esp.find("OK"));
  Serial.println("Wifi Connected");
  
197
  cmd = "AT+CWJAP?";                                  // 현재 연결된 AP 정보 확인, 연결 안되어있을 시 "No AP" 출력
198
199
  esp.println(cmd);
  Serial.write(esp.read());
200
  Serial.println();
201
202
}

203
// 서버에 데이터 전송 함수
204
void sendData(String input){
205
206
  
  // ESP 모듈을 통해 Server로 데이터 전송
207
208
209
210
211
  esp.println("AT+CIPSTART=\"TCP\",\"" + EUEIP + "\"," + EUEPORT);
  if(esp.find("Error")){
    Serial.println("AT+CIPSTART Error...");
  }

212
  // Get 방식을 이용한 전송
213
  String msg = "GET /data/input?";
214
215
  msg += input;
  
216
217
218
219
220
221
222
  msg += " HTTP/1.0\r\n\r\n";
  esp.print("AT+CIPSEND=");
  esp.println(msg.length());
  delay(2000);

  if(esp.find(">")){
    esp.print(msg);
223
    Serial.println(msg);
224
225
226
    Serial.println("Data sent.");
    delay(1000);
  }
227
  
228
229
  Serial.println("Connection Closed.");
  esp.println("AT+CIPCLOSE");
230
  Serial.println();
231
}
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247

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