Commit da8315fd authored by KangMin An's avatar KangMin An
Browse files

Update : 아두이노 RTC모듈 추가

parent 25adfe3f
#include <SoftwareSerial.h> #include <SoftwareSerial.h>
#include <DHT.h> #include <DHT.h>
#include <DHT_U.h> #include <DHT_U.h>
#include <TimeLib.h>
#include <DS1302RTC.h>
#define ESP_TX 2 // ESP8266 모듈의 TX 핀
#define ESP_RX 3 // ESP8266 모듈의 RX 핀
#define ESPPIN_TX 2 // ESP 8266 모듈의 TX 핀 #define RTC_CLK 4 // DS1302RTC 모듈의 CLK 핀
#define ESPPIN_RX 3 // ESP 8266 모듈의 RX 핀 #define RTC_DAT 5 // DS1302RTC 모듈의 DAT 핀
#define RTC_RST 6 // DS1302RTC 모듈의 CLK 핀
#define DHTPIN 7 // DHT11 핀 #define DHT_DAT 10 // DHT11 핀
#define DHTTYPE DHT11 // DHT 모듈 종류 #define DHTTYPE DHT11 // DHT 모듈 종류
#define CDS_D 4 // CDS 모듈 디지털 핀 #define CDS_D 8 // CDS 모듈 디지털 핀
#define CDS_A A0 // CDS 모듈 아날로그 핀 #define CDS_A A0 // CDS 모듈 아날로그 핀
uint32_t delayMS; // 센서를 읽는 지연시간 uint32_t delayMS; // 센서를 읽는 지연시간
SoftwareSerial esp(ESPPIN_TX,ESPPIN_RX); SoftwareSerial esp(ESP_TX,ESP_RX); // ESP 모듈 객체 생성
DHT_Unified dht(DHTPIN, DHTTYPE); DHT_Unified dht(DHT_DAT, DHTTYPE); // DHT 모듈 객체 생성
DS1302RTC rtc(RTC_RST, RTC_DAT, RTC_CLK); // RTC 모듈 객체 생성
String SSID = "Wifi_SSID"; // Wifi - SSID String SSID = "Wifi_SSID"; // Wifi - SSID
...@@ -26,9 +32,11 @@ String SSPW = "Wifi_SSPW"; // Wifi - SSPW ...@@ -26,9 +32,11 @@ String SSPW = "Wifi_SSPW"; // Wifi - SSPW
String EUEIP = "EUE_IP"; // Web Server - IP String EUEIP = "EUE_IP"; // Web Server - IP
int EUEPORT = 8081; // Web Server - Port int EUEPORT = 8081; // Web Server - Port
// 함수 선언부
void connectESP(); void connectESP();
void connectWifi(); void connectWifi();
void sendData(String vars); void sendData(String vars);
void printTime(tmElements_t tm);
void setup() { void setup() {
...@@ -41,8 +49,30 @@ void setup() { ...@@ -41,8 +49,30 @@ void setup() {
connectESP(); // ESP 모듈 탐색 connectESP(); // ESP 모듈 탐색
connectWifi(); // ESP 모듈 wifi 연결 connectWifi(); // ESP 모듈 wifi 연결
// 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();
dht.begin(); // DHT11 센서 작동 시작 dht.begin(); // DHT11 센서 작동 시작
Serial.println("DHT11 Unified Sensor Start."); Serial.println("DHT11 Unified Sensor Start.");
Serial.println();
sensor_t sensor; // dht11 구조체 생성 sensor_t sensor; // dht11 구조체 생성
...@@ -57,6 +87,7 @@ void setup() { ...@@ -57,6 +87,7 @@ void setup() {
Serial.print ("Min Value : "); Serial.print(sensor.min_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.print ("Resolution : "); Serial.print(sensor.resolution); Serial.println(" *C");
Serial.println("------------------------------------"); Serial.println("------------------------------------");
Serial.println();
// 습도센서 정보 프린트 // 습도센서 정보 프린트
dht.humidity().getSensor(&sensor); dht.humidity().getSensor(&sensor);
...@@ -69,55 +100,75 @@ void setup() { ...@@ -69,55 +100,75 @@ void setup() {
Serial.print ("Min Value : "); Serial.print(sensor.min_value); Serial.println("%"); Serial.print ("Min Value : "); Serial.print(sensor.min_value); Serial.println("%");
Serial.print ("Resolution : "); Serial.print(sensor.resolution); Serial.println("%"); Serial.print ("Resolution : "); Serial.print(sensor.resolution); Serial.println("%");
Serial.println("------------------------------------"); Serial.println("------------------------------------");
Serial.println();
delayMS =sensor.min_delay /1000; // 센서를 읽는 시간을 최소로 설정 delayMS =sensor.min_delay /1000; // 센서를 읽는 시간을 최소로 설정
} }
void loop() { void loop() {
String input = "";
// 측정기 분류(IN / OUT) tmElements_t tm; // 시간 데이터를 저장하는 변수
String type_ = "In"; if(rtc.read(tm) == 0){
// 사용자 ID printTime(tm);
String ID = "Admin";
// 지역 코드 if(tm.Minute % 10 == 0 && tm.Second == 0){
String locCode = "3743011"; // 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 = ""; // 전송할 데이터
// DHT11 모듈의 측정 event String date = ""; // 전송 시점 데이터
sensors_event_t event; 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); dht.temperature().getEvent(&event);
float temp = event.temperature; float temp = event.temperature;
String str_Temp = String(temp); String str_Temp = isnan(temp) != 0 ? "none" : String(temp);
// 습도 // 습도 데이터
dht.humidity().getEvent(&event); dht.humidity().getEvent(&event);
float humi = event.relative_humidity; float humi = event.relative_humidity;
String str_Humi = String(humi); String str_Humi = isnan(humi) != 0 ? "none" : String(humi);
// 광도 // 조도 데이터
int lights = analogRead(CDS_A); int lights = analogRead(CDS_A);
String str_Lights = String(lights); String str_Lights = isnan(lights) != 0 ? "none" : String(lights);
String type_ = "In";
String ID = "eue_tester1";
String locCode = "3124053";
input += "type=" + type_; input += "type=" + type_;
input += "&id=" + ID; input += "&id=" + ID;
input += "&locCode" + locCode; input += "&locCode=" + locCode;
input += "&date=" + date;
input += "&temp=" + str_Temp; input += "&temp=" + str_Temp;
input += "&humi=" + str_Humi; input += "&humi=" + str_Humi;
input += "&lights=" + str_Lights; input += "&lights=" + str_Lights;
Serial.println(input);
// 데이터 전송
sendData(input); sendData(input);
}
}
// 10분마다 전송 진행 delay(1000); // 1초 단위로 확인하기 위한 지연
delay(600000);
} }
// ESP모듈 연결 // 함수 정의부
// ESP 모듈 연결 함수
void connectESP(){ void connectESP(){
esp.println("AT"); esp.println("AT");
Serial.println("AT Sent"); Serial.println("AT Sent");
...@@ -126,55 +177,71 @@ void connectESP(){ ...@@ -126,55 +177,71 @@ void connectESP(){
Serial.println("ESP8266 Not Found."); Serial.println("ESP8266 Not Found.");
} }
Serial.println("OK Command Received."); Serial.println("OK Command Received.");
Serial.println();
} }
// 공유기와 연결 // Wifi 연결 함수
void connectWifi(){ void connectWifi(){
// ESP8266 모듈 Client로 설정 String cmd = "AT+CWMODE=1"; // Client로 설정
String cmd = "AT+CWMODE=1";
esp.println(cmd); esp.println(cmd);
Serial.println("Set ESP8266 to client."); Serial.println("Set ESP8266 to client.");
// 공유기와 연결
Serial.println("Connecting to Wifi..."); Serial.println("Connecting to Wifi...");
cmd = "AT+CWJAP=\"" + SSID + "\"," + SSPW + "\""; cmd = "AT+CWJAP=\"" + SSID + "\"," + SSPW + "\""; // Wifi 연결
esp.println(cmd); esp.println(cmd);
// 연결 확인
while(!esp.find("OK")); while(!esp.find("OK"));
Serial.println("Wifi Connected"); Serial.println("Wifi Connected");
// 연결된 공유기 확인 cmd = "AT+CWJAP?"; // 현재 연결된 AP 정보 확인, 연결 안되어있을 시 "No AP" 출력
cmd = "AT+CWJAP?";
esp.println(cmd); esp.println(cmd);
Serial.write(esp.read()); Serial.write(esp.read());
Serial.println();
} }
// 서버에 데이터 전송 함수
void sendData(String input){ void sendData(String input){
// ESP 모듈을 통해 Server와 연결
// ESP 모듈을 통해 Server로 데이터 전송
esp.println("AT+CIPSTART=\"TCP\",\"" + EUEIP + "\"," + EUEPORT); esp.println("AT+CIPSTART=\"TCP\",\"" + EUEIP + "\"," + EUEPORT);
if(esp.find("Error")){ if(esp.find("Error")){
Serial.println("AT+CIPSTART Error..."); Serial.println("AT+CIPSTART Error...");
} }
// 서버로 전송할 데이터 작성 // Get 방식을 이용한 전송
String vars = input;
String msg = "GET /data/input?"; String msg = "GET /data/input?";
msg += vars; msg += input;
msg += " HTTP/1.0\r\n\r\n"; msg += " HTTP/1.0\r\n\r\n";
esp.print("AT+CIPSEND="); esp.print("AT+CIPSEND=");
esp.println(msg.length()); esp.println(msg.length());
delay(2000); delay(2000);
// 데이터 전송
if(esp.find(">")){ if(esp.find(">")){
esp.print(msg); esp.print(msg);
Serial.println(msg);
Serial.println("Data sent."); Serial.println("Data sent.");
delay(1000); delay(1000);
} }
// 서버와 연결 종료
Serial.println("Connection Closed."); Serial.println("Connection Closed.");
esp.println("AT+CIPCLOSE"); esp.println("AT+CIPCLOSE");
Serial.println();
}
// 시간 출력 함수
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();
} }
\ No newline at end of file
#include <SoftwareSerial.h> #include <SoftwareSerial.h>
#include <TimeLib.h>
#include <DS1302RTC.h>
#define ESPPIN_TX 2 // ESP 8266 모듈의 TX 핀 #define ESP_TX 2 // ESP8266 모듈의 TX 핀
#define ESPPIN_RX 3 // ESP 8266 모듈의 RX 핀 #define ESP_RX 3 // ESP8266 모듈의 RX 핀
#define RTC_CLK 4 // DS1302RTC 모듈의 CLK 핀
#define RTC_DAT 5 // DS1302RTC 모듈의 DAT 핀
#define RTC_RST 6 // DS1302RTC 모듈의 CLK 핀
SoftwareSerial esp(ESPPIN_TX,ESPPIN_RX); SoftwareSerial esp(ESP_TX,ESP_RX); // ESP 모듈 객체 생성
DS1302RTC rtc(RTC_RST, RTC_DAT, RTC_CLK); // RTC 모듈 객체 생성
String SSID = "Wifi_SSID"; // Wifi - SSID String SSID = "Wifi_SSID"; // Wifi - SSID
...@@ -14,29 +20,71 @@ String SSPW = "Wifi_SSPW"; // Wifi - SSPW ...@@ -14,29 +20,71 @@ String SSPW = "Wifi_SSPW"; // Wifi - SSPW
String EUEIP = "EUE_IP"; // Web Server - IP String EUEIP = "EUE_IP"; // Web Server - IP
int EUEPORT = 8081; // Web Server - Port int EUEPORT = 8081; // Web Server - Port
// 함수 선언부
void connectESP(); void connectESP();
void connectWifi(); void connectWifi();
void sendData(String vars); void sendData(String vars);
void printTime(tmElements_t tm);
void setup() { void setup() {
Serial.begin(9600); // Serial monitor의 통신 속도 9600으로 설정 Serial.begin(9600); // Serial monitor의 통신 속도 9600으로 설정
esp.begin(9600); // esp모듈의 통신 속도 9600으로 설정 esp.begin(9600); // esp모듈의 통신 속도 9600으로 설정
connectESP(); // ESP 모듈 탐색
connectWifi(); // ESP 모듈 wifi 연결
// 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() { void loop() {
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 모듈 탐색 connectESP(); // ESP 모듈 탐색
connectWifi(); // ESP 모듈 wifi 연결 connectWifi(); // ESP 모듈 wifi 연결
}
String input = ""; String input = ""; // 전송할 데이터
// 측정기 분류(IN / OUT) String date = ""; // 전송 시점 데이터
String type_ = "Out"; 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"; String locCode = "3743011";
// 지역의 위도(Latitude), 경도(Longitude)
float lati = 37.241706; float lati = 37.241706;
String str_lati = String(lati,6); String str_lati = String(lati,6);
float lng = 131.864889; float lng = 131.864889;
...@@ -44,18 +92,20 @@ void loop() { ...@@ -44,18 +92,20 @@ void loop() {
input += "type=" + type_; input += "type=" + type_;
input += "&locCode=" + locCode; input += "&locCode=" + locCode;
input += "&date=" + date;
input += "&lat=" + str_lati; input += "&lat=" + str_lati;
input += "&lng=" + str_lng; input += "&lng=" + str_lng;
Serial.println(input);
// 데이터 전송
sendData(input); sendData(input);
}
}
// 30분마다 전송 진행 delay(1000); // 1초 단위로 확인하기 위한 지연
delay(1800000);
} }
// ESP모듈 연결 // 함수 정의부
// ESP 모듈 연결 함수
void connectESP(){ void connectESP(){
esp.println("AT"); esp.println("AT");
Serial.println("AT Sent"); Serial.println("AT Sent");
...@@ -64,55 +114,71 @@ void connectESP(){ ...@@ -64,55 +114,71 @@ void connectESP(){
Serial.println("ESP8266 Not Found."); Serial.println("ESP8266 Not Found.");
} }
Serial.println("OK Command Received."); Serial.println("OK Command Received.");
Serial.println();
} }
// 공유기와 연결 // Wifi 연결 함수
void connectWifi(){ void connectWifi(){
// ESP8266 모듈 Client로 설정 String cmd = "AT+CWMODE=1"; // Client로 설정
String cmd = "AT+CWMODE=1";
esp.println(cmd); esp.println(cmd);
Serial.println("Set ESP8266 to client."); Serial.println("Set ESP8266 to client.");
// 공유기와 연결
Serial.println("Connecting to Wifi..."); Serial.println("Connecting to Wifi...");
cmd = "AT+CWJAP=\"" + SSID + "\"," + SSPW + "\""; cmd = "AT+CWJAP=\"" + SSID + "\"," + SSPW + "\""; // Wifi 연결
esp.println(cmd); esp.println(cmd);
// 연결 확인
while(!esp.find("OK")); while(!esp.find("OK"));
Serial.println("Wifi Connected"); Serial.println("Wifi Connected");
// 연결된 공유기 확인 cmd = "AT+CWJAP?"; // 현재 연결된 AP 정보 확인, 연결 안되어있을 시 "No AP" 출력
cmd = "AT+CWJAP?";
esp.println(cmd); esp.println(cmd);
Serial.write(esp.read()); Serial.write(esp.read());
Serial.println();
} }
// 서버에 데이터 전송 함수
void sendData(String input){ void sendData(String input){
// ESP 모듈을 통해 Server로 데이터 전송 // ESP 모듈을 통해 Server로 데이터 전송
esp.println("AT+CIPSTART=\"TCP\",\"" + EUEIP + "\"," + EUEPORT); esp.println("AT+CIPSTART=\"TCP\",\"" + EUEIP + "\"," + EUEPORT);
if(esp.find("Error")){ if(esp.find("Error")){
Serial.println("AT+CIPSTART Error..."); Serial.println("AT+CIPSTART Error...");
} }
// 서버로 전송할 데이터 작성 // Get 방식을 이용한 전송
String vars = input;
String msg = "GET /data/input?"; String msg = "GET /data/input?";
msg += vars; msg += input;
msg += " HTTP/1.0\r\n\r\n"; msg += " HTTP/1.0\r\n\r\n";
esp.print("AT+CIPSEND="); esp.print("AT+CIPSEND=");
esp.println(msg.length()); esp.println(msg.length());
delay(2000); delay(2000);
// 데이터 전송
if(esp.find(">")){ if(esp.find(">")){
esp.print(msg); esp.print(msg);
Serial.println(msg);
Serial.println("Data sent."); Serial.println("Data sent.");
delay(1000); delay(1000);
} }
// 서버와 연결 종료
Serial.println("Connection Closed."); Serial.println("Connection Closed.");
esp.println("AT+CIPCLOSE"); esp.println("AT+CIPCLOSE");
Serial.println();
}
// 시간 출력 함수
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();
} }
\ No newline at end of file
...@@ -20,10 +20,14 @@ ...@@ -20,10 +20,14 @@
- [ESP8266 와이파이 모듈 전용 어댑터](https://smartstore.naver.com/mechasolution_com/products/3448897447?NaPm=ct%3Dkh5sj8sw%7Cci%3Dcheckout%7Ctr%3Dppc%7Ctrx%3D%7Chk%3D967033f4922b6288b4279fe63965a7511c1ecf4b) : ESP8266 wifi 모듈을 쉽게 사용하기 위한 어댑터 - [ESP8266 와이파이 모듈 전용 어댑터](https://smartstore.naver.com/mechasolution_com/products/3448897447?NaPm=ct%3Dkh5sj8sw%7Cci%3Dcheckout%7Ctr%3Dppc%7Ctrx%3D%7Chk%3D967033f4922b6288b4279fe63965a7511c1ecf4b) : ESP8266 wifi 모듈을 쉽게 사용하기 위한 어댑터
- [DS1302 RTC 모듈](https://smartstore.naver.com/domekit/products/599920174?NaPm=ct%3Dkqm1qi9x%7Cci%3Dcheckout%7Ctr%3Dppc%7Ctrx%3D%7Chk%3De00f325f99c7d23306f06a0380ccc65a28ff29a6) : 시간 정보를 저장할 수 있는 모듈
## 사용 라이브러리 ## 사용 라이브러리
- Adafruit Sensor Library : [https://github.com/adafruit/Adafruit_Sensor](https://github.com/adafruit/Adafruit_Sensor) - Adafruit Sensor Library : [https://github.com/adafruit/Adafruit_Sensor](https://github.com/adafruit/Adafruit_Sensor)
- DHT Sensor Library : [https://github.com/adafruit/DHT-sensor-library](https://github.com/adafruit/DHT-sensor-library) - DHT Sensor Library : [https://github.com/adafruit/DHT-sensor-library](https://github.com/adafruit/DHT-sensor-library)
- DS1302 RTC Library : [https://playground.arduino.cc/Main/DS1302RTC/](https://playground.arduino.cc/Main/DS1302RTC/)
- Time Library : 아두이노 라이브러리 관리 -> "Time by Michael Margolis" 검색 및 설치
## Arduino 참고 자료 ## Arduino 참고 자료
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment