157_MicroSD_센서데이터로거 💾📁

도로시와 지니가 함께하는 SPI 통신 기반 MicroSD 모듈 제어, FAT 파일 시스템, CSV 데이터 기록 및 엑셀(Excel) 그래프 시각화
- 👧 도로시: “지니야! 식물 화분의 온도와 습도가 하루 종일, 일주일 내내 어떻게 변하는지 컴퓨터 연결 없이도 차곡차곡 기록해 둘 수 있어?”
- 🐱 지니: “그럼! 스마트폰이나 블랙박스에 들어가는 마이크로 SD 카드(MicroSD Card) 를 아두이노에 연결하면 기가바이트(GB) 단위의 대용량 텍스트 파일(
datalog.csv)로 센서 측정값을 끝없이 기록할 수 있단다!” -
🐶 토토: “바우! 기록된 SD 카드를 컴퓨터에 꽂아 엑셀로 멋진 꺾은선 그래프를 그려보자 멍!”
- 🖥️ 강의 슬라이드: slides.md
1. MicroSD 모듈과 파일 시스템의 이해
📁 FAT16/FAT32 파일 시스템과 CSV(Comma-Separated Values) 형식
- FAT(File Allocation Table) 파일 시스템:
- 아두이노 표준
SD.h라이브러리는 FAT16 및 FAT32 형식으로 포맷된 32GB 이하의 마이크로 SD 카드를 완벽하게 지원합니다. (exFAT는 지원하지 않으므로 PC에서 포맷할 때 FAT32로 지정해야 합니다.)
- 아두이노 표준
- 8.3 파일 이름 규칙:
- 아두이노의 메모리 절약을 위해 파일 이름은 영문 최대 8자 + 확장자 3자 (예:
DATALOG.CSV,TEMP_LOG.TXT)를 사용합니다.
- 아두이노의 메모리 절약을 위해 파일 이름은 영문 최대 8자 + 확장자 3자 (예:
- CSV(쉼표로 구분된 값)의 마법:
- 각 측정값을 쉼표(
,)로 구분하여 한 줄씩 기록하면(시간,온도,습도), 마이크로소프트 엑셀(Excel)이나 구글 스프레드시트에서 더블 클릭만으로 바로 열어 표와 꺾은선 그래프로 시각화할 수 있습니다!
- 각 측정값을 쉼표(
2. MicroSD 모듈 핀 구조와 SPI 배선표
[!NOTE] MicroSD 모듈에는 내부에 5V ➔ 3.3V LDO 레귤레이터와 74LVC125 레벨 시프터 IC가 내장되어 있어 아두이노의 5V 신호와 안전하게 직결할 수 있습니다.
| MicroSD 모듈 핀 | 기능 설명 | 아두이노 우노(Uno) 연결 핀 |
|---|---|---|
| VCC | 모듈 전원 공급선 (5V) | 5V |
| GND | 공통 접지선 | GND |
| MISO | SPI 마스터 수신 데이터선 | D12 (MISO) |
| MOSI | SPI 마스터 송신 데이터선 | D11 (MOSI) |
| SCK | SPI 공통 클록 동기화선 | D13 (SCK) |
| CS | 슬레이브 선택선 (Chip Select) | D4 (또는 D10) |
- 환경 센서 (DHT11 온습도 센서):
- 신호(DATA)선 ➔ D2
- VCC ➔ 5V, GND ➔ GND
3. 실습 예제: 온습도 데이터를 CSV 파일로 기록하는 독립형 데이터 로거
내장된 SPI.h, SD.h 및 DHT sensor library를 활용한 데이터 로깅 스케치입니다.
#include <SPI.h>
#include <SD.h>
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT11
#define CS_PIN 4 // SD 모듈 Chip Select 핀
#define LED_WRITE 8 // 데이터 쓰기 알림 LED
DHT dht(DHTPIN, DHTTYPE);
unsigned long recordCount = 0;
void setup() {
Serial.begin(9600);
pinMode(LED_WRITE, OUTPUT);
dht.begin();
Serial.println("==========================================");
Serial.println("💾 도로시의 스마트 환경 데이터 로거 가동!");
Serial.println("MicroSD 카드를 초기화합니다...");
// SD 카드 마운트 초기화
if (!SD.begin(CS_PIN)) {
Serial.println("❌ SD 카드 초기화 실패! 카드가 제대로 꽂혀 있는지, FAT32 포맷인지 확인하세요.");
while (1) {
// 에러 알림: LED 무한 깜빡임
digitalWrite(LED_WRITE, HIGH); delay(200);
digitalWrite(LED_WRITE, LOW); delay(200);
}
}
Serial.println("✅ SD 카드 인식 성공!");
// CSV 파일 헤더(열 제목) 최초 작성
File dataFile = SD.open("DATALOG.CSV", FILE_WRITE);
if (dataFile) {
// 파일이 처음 생성되는 경우 헤더 작성
if (dataFile.size() == 0) {
dataFile.println("Index,Time_sec,Temperature_C,Humidity_pct");
Serial.println("📄 신규 DATALOG.CSV 파일 헤더 작성 완료.");
}
dataFile.close();
}
}
void loop() {
// 1. 센서 값 측정
float h = dht.readHumidity();
float t = dht.readTemperature();
// 측정 오류 검사
if (isnan(h) || isnan(t)) {
Serial.println("⚠️ DHT 센서 측정 실패!");
delay(2000);
return;
}
recordCount++;
unsigned long timeSec = millis() / 1000;
// 2. CSV 형식 문자열 조립: "1,2,24.5,58.0"
String dataString = String(recordCount) + "," +
String(timeSec) + "," +
String(t, 1) + "," +
String(h, 1);
// 3. 파일 쓰기 동작 (LED 점등)
digitalWrite(LED_WRITE, HIGH);
File dataFile = SD.open("DATALOG.CSV", FILE_WRITE);
if (dataFile) {
dataFile.println(dataString);
dataFile.close(); // 반드시 close() 해야 실제 플래시 메모리에 버퍼가 저장됨!
Serial.print("📥 [기록 완료] ");
Serial.println(dataString);
} else {
Serial.println("❌ DATALOG.CSV 파일 열기 실패!");
}
digitalWrite(LED_WRITE, LOW);
// 5초 간격으로 주기적 로깅 (원하는 주기로 변경 가능)
delay(5000);
}
4. 실습 결과 및 SD 카드 파일 확인
SD 카드를 분리하여 PC에 꽂고 DATALOG.CSV 파일을 메모장이나 엑셀로 열면 다음과 같이 정갈하게 저장되어 있습니다:
Index,Time_sec,Temperature_C,Humidity_pct
1,5,24.5,58.0
2,10,24.6,58.2
3,15,24.8,57.9
4,20,25.0,57.5
5,25,25.1,57.1
- 엑셀 꿀팁:
- 엑셀에서 열고 [삽입] ➔ [추천 차트] ➔ [꺾은선형] 을 클릭하면 시간에 따른 온도 및 습도의 일일 변화 추이를 한눈에 볼 수 있습니다!
5. 핵심 요약 정리 💡
- 독립형 임베디드 로거: 컴퓨터와 USB로 연결되어 있지 않은 야외나 온실에서도 배터리만으로 수 주일 동안 센서 데이터를 자동 저장합니다.
close()함수의 중요성:dataFile.print()는 내부 RAM 버퍼에 먼저 기록되므로,dataFile.close()를 호출해야 플래시 메모리에 물리적으로 기록이 완료됩니다.- 8.3 파일명 제약: 파일명은 반드시 영문 대소문자 8글자 이내와 확장자 3글자(예:
SENSOR01.CSV)로 지어야 합니다. - CSV 호환성: 쉼표로 구분된 데이터는 엑셀, 파이썬(Pandas), 매트랩 등 모든 데이터 과학 도구에서 즉시 분석할 수 있는 산업 표준 포맷입니다.
서브목차