전자회로 실무 / 센서·데이터 기록

센서 기록에 측정 시각(timestamp)을 넣고 실시간 시계(RTC)의 상태도 확인합니다

센서값을 SD 카드에 저장해 두었는데, 나중에 보니 어느 날 몇 시의 측정값인지 알 수 없는 경우가 있습니다. 전원을 켠 뒤의 경과 시간만 기록했다면 재시작 전후의 자료를 이어 보기도 어렵습니다. 측정값과 날짜·시각을 한 줄에 함께 저장하고, 기록된 시각이 맞는지도 확인하는 방법을 설명합니다.

저장장치와 시계의 역할은 다릅니다

데이터 로깅(data logging)은 측정값과 필요한 상태를 나중에 분석할 수 있도록 기록하는 작업입니다. SD(Secure Digital) 카드는 이 기록을 보관하는 저장장치입니다. 파일이 정상적으로 생겼다고 해서 각 측정값에 정확한 시각이 붙었다고 볼 수는 없습니다.

타임스탬프(timestamp)는 어떤 사건이 일어난 날짜와 시각을 나타내는 값입니다. 센서 기록에서는 무엇을 측정했는지와 함께 언제 측정했는지를 알려 줍니다. 파일을 만든 시각 하나만으로는 매 측정 행의 시각을 나타낼 수 없습니다.

실시간 시계(RTC, Real-Time Clock)는 날짜와 시각을 유지하는 회로입니다. 예를 들어 DS3231은 보조 전원이 적합하게 연결되어 있으면 주 전원이 꺼진 동안에도 시간을 유지할 수 있습니다. 다만 시계를 처음 맞추는 과정과 보조 전원 확인은 별도로 필요합니다. RTC를 장착했다고 현재 시각을 스스로 알아내는 것은 아닙니다.

마이크로컨트롤러(MCU, Microcontroller Unit)는 센서를 읽고 RTC에서 시각을 받아 기록을 만드는 제어용 집적회로입니다. DS3231과는 I²C(Inter-Integrated Circuit)라는 직렬 통신 방식으로 정보를 주고받습니다. 데이터선인 SDA(Serial Data)와 통신 클록선인 SCL(Serial Clock)의 연결, 전압과 풀업 저항(pull-up resistor)을 실제 회로에 맞게 확인합니다. 풀업 저항은 통신선이 구동되지 않을 때 정해진 높은 전압으로 돌아가도록 연결하는 저항입니다.

실제 조립할 회로에서는 풀업 저항의 값만 보고 I²C 연결이 적합하다고 판단하지 않습니다. SDA·SCL이 어느 전원으로 끌어올려지는지 회로 연결을 따라 확인하고, MCU와 RTC의 정확한 부품 번호에 맞는 자료에서 각 입력 핀의 허용 전압 범위와 HIGH·LOW로 인식하는 전압 조건을 대조합니다. 예를 들어 DS3231 데이터시트의 RTC 핀 조건을 만족하더라도 함께 연결한 MCU의 입력 조건까지 충족하는 것은 아닙니다.

4.7 kΩ 같은 값은 모든 회로에 그대로 쓸 수 있는 정답이 아닙니다. 버스 속도와 배선·연결된 장치의 총 정전용량에 따라 신호가 LOW에서 HIGH로 올라가는 상승 시간을 확인합니다. 저항을 작게 하면 상승은 빨라지지만, 통신선을 LOW로 끌어내리는 장치가 받아 흘려야 하는 전류인 싱크 전류는 커집니다. 따라서 NXP I²C 규격의 풀업 저항 선정 조건과 각 장치의 자료를 함께 보고, 선택한 속도의 상승 시간 한계뿐 아니라 LOW를 구동하는 장치의 싱크 전류와 LOW 출력 전압 조건도 만족하는지 확인합니다.

측정값과 그 시각을 하나의 기록으로 묶습니다

먼저 시각의 의미를 정합니다. 온도 변환을 시작할 때인지, 변환을 마쳐 값을 읽을 때인지 정하지 않으면 기록을 비교할 때 오차의 원인을 알기 어렵습니다. 아래 설명에서는 측정값을 읽은 시점에 가까운 RTC 시각을 함께 보관하는 방식으로 정합니다.

  1. 센서에서 측정값을 읽고 정상적으로 읽혔는지 확인합니다.
  2. RTC에서 날짜와 시각을 읽어 방금 측정한 값과 함께 메모리에 보관합니다. 센서 읽기와 시각 읽기 사이의 지연이 허용 가능한지도 확인합니다.
  3. 측정값, 시각, 필요한 상태를 한 행으로 만들어 파일에 기록합니다.
  4. 저장 결과를 확인하고, 나중에 파일을 다시 읽어 행과 필드가 의도대로 남았는지 검사합니다.

카드 기록이 잠시 늦어지더라도 이미 확보한 측정 시각을 사용합니다. 한동안 모아 둔 데이터를 저장하면서 그때의 현재 시각을 모든 행에 붙이면, 실제로 서로 다른 시점에 얻은 값들이 같은 순간의 측정처럼 보일 수 있습니다.

측정값과 측정 시각을 한 행의 서로 다른 필드에 함께 보관합니다. 예시 값이며 실제 측정 결과가 아닙니다.
측정값과 측정 시각을 한 행의 서로 다른 필드에 함께 보관합니다. 예시 값이며 실제 측정 결과가 아닙니다. · 클릭하면 확대됩니다.

CSV(Comma-Separated Values)는 필드를 쉼표로 구분하는 텍스트 형식입니다. 다음은 기록 구조를 설명하기 위해 만든 온도 예시입니다. temperature_c의 단위는 섭씨도(°C)이며, time_valid는 시각을 사용할 수 있다고 판단했으면 1, 그렇지 않으면 0으로 적는 예시 상태값입니다.

measured_at,temperature_c,time_valid
2026-01-01T09:00:00+09:00,24.6,1
2026-01-01T09:00:01+09:00,24.7,1

여기서 +09:00은 UTC(Coordinated Universal Time, 협정 세계시)보다 9시간 빠른 시각이라는 뜻입니다. 현지 시각을 쓸지 UTC를 쓸지 정하고 일관되게 기록합니다. DS3231이 이 문자열과 시간대 정보를 만들어 주는 것은 아니므로 프로그램에서 형식을 정해야 합니다. 시각이 유효하지 않다면 그럴듯한 날짜를 대신 넣지 말고, 빈 시각 필드와 time_valid=0처럼 구별할 수 있게 기록합니다.

시계가 동작해도 현재 시각이 맞는 것은 아닙니다

처음 사용하거나 보조 전원이 끊어진 뒤에는 날짜와 시각을 확인합니다. 예시 프로그램의 고정 날짜나 프로그램을 빌드한 시각을 부팅할 때마다 RTC에 쓰면, 전원을 다시 켤 때 시계가 과거로 돌아갈 수 있습니다. 시각을 처음 설정하거나 의도적으로 보정하는 동작과 평소에 읽기만 하는 동작을 구분합니다.

RTC는 주기적으로 반복되는 전기 신호를 시간의 기준으로 사용합니다. 이 신호를 만드는 동작을 발진(oscillation)이라고 합니다. DS3231에는 발진이 멈췄던 상태를 알리는 OSF(Oscillator Stop Flag)가 있습니다. 이 값이 설정되어 있다면 보관된 시각이 맞는지 다시 확인해야 합니다. 원인을 확인하고 올바른 시각을 설정한 뒤 해당 상태를 정리합니다. 표시만 지운다고 틀린 시각이 바로잡히지는 않습니다. 반대로 OSF가 없더라도 사람이 날짜를 잘못 설정한 경우까지 자동으로 검출되지는 않습니다.

날짜와 시각은 사용하는 RTC 라이브러리(library, 통신과 값 읽기를 맡는 코드)가 제공하는 일관된 읽기 동작으로 한 번에 받아 보관합니다. 연·월·일·시·분·초를 서로 다른 순간에 따로 읽어 조합하지 않습니다. 자정 근처에서 날짜는 전날 값, 시각은 다음 날 값으로 섞이는 문제를 피하려는 것입니다. 직접 통신을 구현한다면 부품의 시간 레지스터(register)와 읽기 버퍼(read buffer) 동작에 맞춥니다. 레지스터는 부품 내부의 값을 읽고 쓰는 저장 위치이고, 읽기 버퍼는 읽는 동안 값이 바뀌어 섞이지 않도록 정보를 잠시 보관하는 영역입니다.

전원을 다시 켠 뒤의 파일까지 확인합니다

시각이 붙은 몇 줄을 화면에서 보는 것으로 검사를 끝내지 않습니다. 기록을 정상적으로 마치고 파일을 닫은 뒤 주 전원을 껐다 켜서, 이전 기록과 새 기록의 날짜·시각을 비교합니다. 보조 전원이 있는 구성에서는 꺼져 있던 시간도 시계에 반영되는지 확인합니다. 날짜를 다시 설정하는 코드가 매 부팅에 실행되지 않는지도 함께 봅니다.

확인할 상황확인할 내용
정상적으로 연속 기록할 때행마다 측정값과 시각이 함께 남고, 단위와 필드 순서가 일정한지 확인합니다.
주 전원을 껐다 켰을 때RTC 시각이 유지되는지, 새 기록이 과거 시각으로 돌아가지 않는지 확인합니다.
시각을 아직 맞추지 않았을 때유효하지 않은 시각이 정상 기록으로 섞이지 않는지 확인합니다.
저장이 지연될 때파일을 쓰는 시각으로 측정 시각을 덮어쓰지 않는지 확인합니다.
분·날짜가 바뀔 때날짜와 시각이 서로 맞고 행 순서가 유지되는지 확인합니다.

RTC가 시간을 유지한다고 해서 SD 카드의 마지막 기록도 전원 차단 뒤에 보존되는 것은 아닙니다. 파일 쓰기 실패, 아직 저장하지 않은 데이터와 중간에 끊긴 마지막 행은 따로 처리해야 합니다. 실제 센서 측정 간격이 1초보다 짧다면 초 단위 RTC 표시만으로는 행의 순서를 충분히 구분하지 못할 수 있습니다. 이때에는 측정 순번이나 MCU의 경과 시간도 함께 저장하되, 재시작마다 초기화되는 값임을 구분할 수 있게 합니다.