아두이노 코딩 : RTC를 사용하여 SD 카드에 로그 기록하기 (DS1302, SD-Card)
Lucy / Facilitate4U
2020. 10. 6. 01:24
Arduino Uno : SD-Card에 로그 기록하기
이번 포스트에서는
DS-1302 RTC 모듈로 측정된 시간과 현재 아날로그 전압을 SD-Card에 저장하는 예제
입니다. DS-1302에 시간을 기록하고 읽는 법, 아날로그 전압 측정, SD-CARD 데이터 쓰기와 관련된 기초적인 방법은 하단의 관련 포스트를 참고해주세요.Hardware
준비물
본 예제의 구성품은 아래와 같습니다.
- Arduino Uno x 1 EA
- (RTC) DS1302 Module x 1 EA
- Potentiometer x 1 EA
- Ethernet Shield2 x 1 EA (이더넷 쉴드의 SD-Card 사용)
- Bread Board
- JumperWIres
※ Ethernet Shield2는 SD-Card 테스트를 위해 사용되었습니다. Ethernet 연결은 차후 포스트에서 진행할 예정입니다.
회로도 및 연결
아두이노 우노와 DS1302, 가변저항, Ethernet Shiled2 연결 회로도는 아래와 같습니다. 가변 저항은 A0~A5 의 아날로그 입력 핀에 연결되어야 하고, DS1302는 아날로그 핀, 디지털 핀 모두 사용 가능합니다.
Arduino Uno : DS1302, SD-Card 연결 회로도 및 연결 예시
예제 : 날짜, 시간 및 아날로그 전압 로그 기록
0.5초 간격으로 DS1302에서 날짜와 시간을 입력받고, 가변 저항의 전압을 측정하여 SD-Card에 기록 및 시리얼 포트로 출력하는 예제입니다.
코드
로그를 기록하는 간단한 예제로 기본적인 코드로 생각되는 부분만 작성하였습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #include <DS1302.h> #include <SD.h> // DS1302 핀 정의 #define DS1302_SCK A5 // 보드의 CLK 핀 입력 #define DS1302_DATA A4 // 보드의 DAT 핀 입력 #define DS1302_RST A3 // RST 핀 입력 // SD-CARD CS 핀 정의 #define SD_CS 4 // SD CARD 의 CS 핀 #define LOGFILE "DATALOG.txt" // 로그 저장할 파일명 #define SENSOR A0 // 로그 저장할 아날로그 핀 // DS1302 클래스 생성 DS1302 myDS1302(DS1302_RST, DS1302_DATA, DS1302_SCK); void setup() { Serial.begin(9600); while(!Serial){ ; } delay(500); Serial.println("Serial Port Connected.."); delay(500); Serial.println("DS1302 Init Start..."); // halt(false) DS1302 동작 시작 myDS1302.halt(false); // writeProject(true) 데이터 쓰기 금지 myDS1302.writeProtect(true); Serial.println("DS1302 Init Done..."); delay(500); Serial.println("SD Card Init Start.."); if(!SD.begin(SD_CS)){ Serial.println("SD-CARD Initialization failed"); Serial.println("Exit Program.."); while(1); } Serial.println("SD-CARD Initialization done."); delay(500); Serial.println("Data Logging Strart...."); } void loop() { String strBuff = "[" + String(myDS1302.getDateStr(2,1,'-')) + ", " + String(myDS1302.getTimeStr()) + "] "; File logFile = SD.open(LOGFILE, FILE_WRITE); if(logFile){ int iTemp = analogRead(A0); float fTemp = (5 * iTemp) / 1023.00; String logData = strBuff + "Sensor Voltage : " + String(fTemp, 2) + " V"; logFile.println(logData); Serial.println(logData); logFile.close(); } else { Serial.println("error opening datalog file.."); Serial.println("Exit Program.."); while(1); } delay(500); } | cs |
코드 설명
선언부
- 5~7줄 : DS1302 연결 핀 선언부
- 10줄 : SD-Card의 CS핀 선언부 (사용하는 SD-Card 모듈 또는 쉴드에 따라 변경 될 수 있습니다.)
- 11줄 : SD-Card에 로그를 저장할 파일명
- 13줄 : 아날로그 입력 핀
- 16줄 : DS1302 클래스 생성 및 초기화
void setup()
- 20~27줄 : 시리얼 통신 초기화
- 29~31줄 : DS1302 설정
- 35~39줄 : SD 카드 초기화 및 연결 확인
void loop()
- 47줄 : 문자열 저장 버퍼 strBuff에 날짜와 시간 저장
- 48줄 : DATALOG.TXT 파일을 쓰기 모드로 열기 (없는 경우 신규 생성)
- 50줄 : DATALOG.TXT 파일을 성공적으로 여는 경우 실행되는 IF문
- 51~53줄 : 문자열 저장 버퍼에 아날로그 전압 문자열 추가 저장
- 54~55줄 : 날짜/시간/데이터가 저장된 문자열 버퍼 데이터를 SD-Card의 DATA.TXT 에 기록하고 시리얼 포트로 출력
- 56줄 ; 파일 닫기
- 58줄 : DATA.TXT 파일 열기 실패하는 경우 실행되는 else문으로, 에러 메세지 출력 후 종료
- 64줄 : 데이터 측정 및 로그 기록 시간을 0.5초 간격으로 조정
실행 결과
시리얼 포트 출력
위의 코드를 실행하면 아래와 같이 시리얼 출력으로 날짜, 시간, 아날로그 전압이 출력되는 것을 확인 할 수 있습니다.
SD-Card DATALOG.TXT 파일
위의 코드를 실행하면 Ethernet Shield2에 장착된 SD-Card의 DATALOG.TXT 파일에 데이터가 저장된 것을 확인 할 수 있습니다.
마무리
본 포스트에서는
Arduino Uno 보드를 사용하여 SD-Card에 데이터를 저장하는 방법
에 대해 알아보았습니다. 이 포스트와 관련된 기초적인 내용은 하단의 관련 포스트를 참고해주세요.끝까지 읽어 주셔서 감사합니다.😄
'Embedded > Arduino' 카테고리의 다른 글
아두이노 강좌 #44 HC-06으로 스마트폰과 아두이노 연동하기 (0) | 2020.10.15 |
---|---|
아두이노 강좌 #43 HC-06 모듈 소개, 주요 기능 및 AT Command 주고 받기 (0) | 2020.10.13 |
아두이노 강좌 #42 SD Card 카드 인식, 파일 쓰기, 파일 읽기 (1) | 2020.09.27 |
아두이노 강좌 #41 SD-Card 주의 사항 및 Cardinfo 예제 사용 방법 (0) | 2020.09.26 |
아두이노 코딩 : DHT11 온도 습도 데이터 I2C Character LCD에 출력하기 (0) | 2020.09.25 |