본문 바로가기
모두의 아두이노

[아두이노][쉴드] Data logger shield sd card and real time clock

by 로니킴 2021. 11. 25.


본 절은 [데이터 로깅] 아두이노 쉴드를 사용하기 위해 알아야 할 내용과 실습 방법에 대해 설명한다. 아두이노 쉴드의 특징, 동작원리, 사양, 연결 핀 배열, 출력 값, 주의사항을 알아본다. 아두이노와 를 연결하고, 간단한 코딩으로 를 쉽게 실습할 수 있다. 

 

목차

     

     

     


    [아두이노 쉴드] Data logger shield sd card and real time clock

     

     

     

     

     

     

     


    데이터 로깅 쉴드란?

    실시간 클럭(RTC)가 포함되어 있으며, 메모리에 쉽게 저장할 수 있는 아두이노 쉴드이다. 

    배터리는 CR1220을 사용한다. 

     

     

    • SD card interface works with FAT16 or FAT32 formatted cards.
    • 3.3V level shifter circuitry prevents damage to your SD card.
    • Real time clock (RTC) keeps the time going even when the Arduino is unplugged.
    • Prototyping area for soldering connectors, circuitry or sensors.
    • Onboard 3.3V regulator is both a reliable reference voltage and also reliably runs SD cards that require a lot of power to run.
    • Works with Arduino UNO, Duemilanove, Diecimila, Leonardo or ADK/Mega R3 or higher.
    • ADK/Mega R2 or lower are not supported.
    • DS1307 RTC
    • Size: 68 x 53 x 23mm (approx)
    • Regulator voltage: 3.3V
    • Battery: CR1220 3V

     

    데이터 로깅 아두이노 쉴드 특징

    데이터 로깅 의 특징은 다음과 같다. 

     

    -SD카드 인터페이스는 FAT16 또는 FAT32 포맷된 카드와 함께 작동한다.

    -3.3 v 레벨 시프터 회로는 SD 카드에 손상을 방지한다.  
    -실시간 클럭 (rtc) 는 arduino가 연결되지 않은 경우에도 시간을 유지한다.

    - 배터리 백업은 수년간 지속된다. 
    -SD 및 RTC 모두의 라이브러리 및 예 코드를 포함하고 있으며,  납땜 커넥터, 회로 또는 센서에 대한 프로토 타이핑 영역을 신속하게 진행할 수 있다. 

    -Arduino uno, duemilanove, diecimila, leonardo 또는 adk/mega r3 이상 작동한다.

    -Adk/메가 r2 또는 더 낮은 지원되지 않는다.

     

     

     

     

     

     


    데이터 로깅 쉴드 구입하기

    [데이터 로깅 쉴드]는 알리익스프레스, 네이버 쇼핑몰, 아마존 등에서 를 구입할 수 있다

     

     

    알리익스프레스에서 다음과 같이 구입할 수 있다. 

     


     

    데이터 로깅 라이브러리 다운로드

    라이브러리르 설치한다. 

     

    RTClib-master.zip
    0.05MB

     

     

    https://github.com/adafruit/RTClib

     

    GitHub - adafruit/RTClib: A fork of Jeelab's fantastic RTC library

    A fork of Jeelab's fantastic RTC library. Contribute to adafruit/RTClib development by creating an account on GitHub.

    github.com


     

     

     

     

     

    데이터 로깅 소프트웨어 코딩(RTC)

    하드웨어 연결이 완료되면, 아두이노 IDE를 이용해 아두이노 쉴드 소스코드를 코딩할 수 있다. 

    코드는 다음과 같다. 

    // Date and time functions using a DS1307 RTC connected via I2C and Wire lib
    #include "RTClib.h"
    
    RTC_DS1307 rtc;
    
    char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
    
    void setup () {
      Serial.begin(57600);
    
    #ifndef ESP8266
      while (!Serial); // wait for serial port to connect. Needed for native USB
    #endif
    
      if (! rtc.begin()) {
        Serial.println("Couldn't find RTC");
        Serial.flush();
        while (1) delay(10);
      }
    
      if (! rtc.isrunning()) {
        Serial.println("RTC is NOT running, let's set the time!");
        // When time needs to be set on a new device, or after a power loss, the
        // following line sets the RTC to the date & time this sketch was compiled
        rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
        // This line sets the RTC with an explicit date & time, for example to set
        // January 21, 2014 at 3am you would call:
        // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
      }
    
      // When time needs to be re-set on a previously configured device, the
      // following line sets the RTC to the date & time this sketch was compiled
      // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      // This line sets the RTC with an explicit date & time, for example to set
      // January 21, 2014 at 3am you would call:
      // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
    
      Serial.println("Done");
    }
    
    void loop () {
        DateTime now = rtc.now();
    
        Serial.print(now.year(), DEC);
        Serial.print('/');
        Serial.print(now.month(), DEC);
        Serial.print('/');
        Serial.print(now.day(), DEC);
        Serial.print(" (");
        Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
        Serial.print(") ");
        Serial.print(now.hour(), DEC);
        Serial.print(':');
        Serial.print(now.minute(), DEC);
        Serial.print(':');
        Serial.print(now.second(), DEC);
        Serial.println();
    
        Serial.print(" since midnight 1/1/1970 = ");
        Serial.print(now.unixtime());
        Serial.print("s = ");
        Serial.print(now.unixtime() / 86400L);
        Serial.println("d");
    
        // calculate a date which is 7 days, 12 hours, 30 minutes, and 6 seconds into the future
        DateTime future (now + TimeSpan(7,12,30,6));
    
        Serial.print(" now + 7d + 12h + 30m + 6s: ");
        Serial.print(future.year(), DEC);
        Serial.print('/');
        Serial.print(future.month(), DEC);
        Serial.print('/');
        Serial.print(future.day(), DEC);
        Serial.print(' ');
        Serial.print(future.hour(), DEC);
        Serial.print(':');
        Serial.print(future.minute(), DEC);
        Serial.print(':');
        Serial.print(future.second(), DEC);
        Serial.println();
    
        Serial.println();
        delay(3000);
    }

     

     

     

     

     


     

    #1 예제 :  데이터 로깅 동작확인 (RTC) 

    하드웨어 연결, 소프트웨어 코딩이 완료되면 다음과 같이 동작 화면을 확인할 수 있다. 

     

    ------------------------------------------------------ 
    개발환경 : WINDOWS 10 
    아두이노 IDE : 1.8.13 
    ------------------------------------------------------ 
    01 연결
     - 아두이노와 PC 연결 
     - 아두이노 IDE 실행 
     - 메뉴 → 툴 → 보드:아두이노 UNO 확인 
      - 메뉴 → 스케치 → 확인/컴파일 

    02 컴파일 확인 

    스케치>확인/컴파일(CTRL+R) 를 선택해서 컴파일을 진행한다.


    03 아두이노 우노 업로드 

    컴파일이 이상없이 완료되면 스케치>업로드(CTRL+U) 를 선택해서 컴파일 파일을 업로드 한다. 

     


    04 동작 확인

    다음과 같이 동작을 확인할 수 있다. 

     

     

     

     

     

     


     

    #2 예제 - 데이터 로깅 동작확인 (RTC+SD 카드) 

    다음과 같이  RTC 시계정보를 SD 카드에 저장할 수 있다. 

     

     

    (1) 소스를 코딩한다. 

    DataLoggingTest.ino
    0.00MB

    #include <SPI.h>
    #include <SD.h>
    #include <Wire.h>
    #include "RTClib.h"
    
    
    RTC_DS1307 rtc;
    File myFile;
    
    void setup() {
      Wire.begin();
      Serial.begin(9600);
      Serial.println("Data Logging Start");
    
      rtc.begin();
    
      if (!SD.begin(10)) {
        Serial.println("initialization failed!");
        return;//SD카드 연결에 실패 하셨습니다.
      }
    
      if (! rtc.isrunning()) {
        Serial.println("RTC is NOT running!");
        rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      }
    }
    
    
    void loop() {
      DateTime now = rtc.now();
      myFile = SD.open("LogData.txt", FILE_WRITE);
      if (myFile) {
        Serial.print(F("Writing to log File..."));
        myFile.print(now.day());
        myFile.print(",");
        myFile.print(now.hour());
        myFile.print(",");
        myFile.print(now.minute());
        myFile.print(",");
        myFile.print(now.second());
        myFile.print(",");
        myFile.println(analogRead(A0));
        myFile.close();
        Serial.println(F("done."));
      } else {
        Serial.println(F("error opening file!!"));
      }
    
      delay(1000);
    }

     

     

    (2) 컴파일후 업로드 한다. 

     

    (3) 시리얼 동작은 다음과 같다. 

     

    (4) LOGDATA 파일은 다음과 같다. 


     

     

     

     

     


     

    #3 예제 - 데이터 로깅 RTC 파일이름 (RTC+SD 카드) 

    다음과 같이  RTC 시계정보를 이용해 SD 카드 저장 파일명을 시간에 따라 자동으로 변경되도록 설정할 수 있다. 

     

     

    void getFileName()
    {  
      DateTime now = rtc.now(); 
      delay(100);  
      sprintf(filename, "%d%d%d%d.txt", now.day(), now.hour(), now.minute(), now.second());    
      Serial.println(filename);  
    }

     

     

     

    (1) 소스 코드를 작성한다. 

    #include <SPI.h>
    #include <SD.h>
    #include <Wire.h>
    #include "RTClib.h"
    
    
    char filename[50] = "log.txt";
    
    RTC_DS1307 rtc;
    File myFile;
    
    void setup() {
      Wire.begin();
      Serial.begin(9600);
      Serial.println("Data Logging Start");
    
      rtc.begin();
    
      if (!SD.begin(10)) {
        Serial.println("initialization failed!");
        return;//SD카드 연결에 실패 하셨습니다.
      }
     
      if (! rtc.isrunning()) {
        Serial.println("RTC is NOT running!");
        rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      }
    
      getFileName();
    }
    
    
    void loop() {
      char data[200] = {0};  
      myFile = SD.open(filename, FILE_WRITE);  
      if (myFile) {    
        Serial.print(" Writing to ...");    
        sprintf(data, "%s,%d", filename, 1);         
        myFile.print(data);
        myFile.close();
        Serial.println(F("done."));
      } else {
        Serial.println(F("error opening file!!"));
      }
    
      delay(2000);
    }
    
    void getFileName()
    {  
      DateTime now = rtc.now(); 
      delay(100);  
      sprintf(filename, "%d%d%d%d.txt", now.day(), now.hour(), now.minute(), now.second());    
      Serial.println(filename);  
    }

     

     

    (2) 컴파일후 업로드 한다. 

     

    (3) 시리얼로 확인한다. 

    (4) SD 카드의 로그 파일을 확인한다. 

     

     

     

     

    마무리

    아두이노와 데이터 로깅 를 연결하고, 간단한 코딩으로 를 쉽게 실습할 수 있다.  

     

     

     


     

    모두의 아두이노 환경 책

    [모두의 아두이노 환경 ] 책은 예스24, 인터넷 교보문고, 알라딘, 인터파크도서, 영풍문고, 반디앤루니스 , 도서11번가 등에서 구입할 수 있다. 이 책에서는 PMS7003, GP2Y1010AU0F, PPD42NS, SDS011 미세먼지 , DHT22 온습도 , MH-Z19B 이산화탄소 , ZE08-CH2O 포름알데히드 , CCS811 총휘발성유기화합물 TVOC, GDK101 방사선(감마선) , MQ-131 오존(O3) , MQ-7 일산화탄소, MICS-4514 이산화질소 , MICS-6814 암모니아 , DGS-SO2 아황산가스(SO2) , BME280 기압 , GUVA-S12SD 자외선(UV) , MD0550 기류 , QS-FS01 풍속 (Wind speed) 를 사용한다.  

     

    모두의 아두이노 환경

    아두이노와 로 내 건강을 지킬 수 있다!다양한 환경 를 실생활 프로젝트에 응용해보자!시중에 판매되고 있는 간이측정기도 로 값을 측정합니다. 똑같은 를 아두이노에 연결하

    book.naver.com

    반응형


    댓글