아두이노 코딩 : RTC를 사용하여 SD 카드에 로그 기록하기 (DS1302, SD-Card)
Lucy Archive
Lucy 2023
2020. 10. 6. 01:24

Arduino Uno SD-Card 로그 기록Arduino Uno SD-Card 로그 기록

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 연결 회로도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에 데이터를 저장하는 방법

에 대해 알아보았습니다. 이 포스트와 관련된 기초적인 내용은 하단의 관련 포스트를 참고해주세요.

끝까지 읽어 주셔서 감사합니다.😄

관련포스트

👉 아두이노 SD-Card 관련글 목록 보기

👉 아두이노 RTC 관련글 목록 보기

👉 아두이노 관련글 전체 목록 보기