
아두이노 DS1302 응용 예제
1부 [DS1302] DS1302로 알아보는 RTC
2부 [DS1302] 아두이노 DS1302 응용 예제
사용할 DS1302 모듈과 라이브러리

이전 글에서 DS1302의 핀맵부터 내부 레지스터 구조까지 자세히 살펴보았습니다.
하지만 사용할 모듈은 위의 사진과 같으며 이번에는 복잡한 레지스터 제어 과정을 직접 구현하는 대신, 라이브러리를 활용하여 간단하게 예제로 진행해보겠습니다.
해당 모듈의 회로도

이번에 사용할 DS1302 모듈은 간단한 회로로 구성되어 있습니다.
전원부에는 코인전지(Button Cell)를 장착할 수 있는 단자가 마련되어 있어, 외부 전원이 차단되더라도 RTC에 예비 전원을 공급할 수 있습니다.
그리고 X1과 X2 핀에는 32.768kHz 크리스탈이 연결되어 시간 기준 클럭을 생성하며, 데이터 입출력(I/O), 클럭(SCLK), 리셋(CE) 신호를 위한 3개의 핀을 통해 아두이노와 통신하도록 구성되어 있습니다.
실험 구성과 동작 흐름
이번 실험은 아두이노에 DS1302 RTC 모듈, BME280 센서, OLED 디스플레이를 연결하여 현재 날짜와 시간, 온도, 습도, 고도 정보를 OLED 화면에 실시간으로 표시하는 방식으로 진행됩니다.
동작 흐름은 다음과 같습니다.
Setup
- 먼저 Wire, OLED, BME280, DS1302에 필요한 라이브러리를 포함하고 각 객체를 생성하여 사용할 준비를 합니다.
- OLED를 초기화합니다.
정상적으로 연결되지 않은 경우 프로그램이 더 이상 진행되지 않도록 대기합니다.
- 다음으로 BME280 센서를 초기화합니다.
지정한 I2C 주소에서 센서를 찾지 못하면 OLED에 오류 메시지를 출력한 뒤 프로그램을 종료하여 이후 동작을 방지합니다.
- 이어서 DS1302 RTC를 초기화합니다.
RTC에 유효한 날짜와 시간이 저장되어 있지 않은 경우 컴파일 시점의 날짜와 시간을 RTC에 기록합니다.
또한 쓰기 보호가 설정되어 있다면 해제하고, RTC가 동작 중이 아니라면 시간을 계속 계측할 수 있도록 동작 상태로 변경합니다.
Loop
- 메인 루프에서는 먼저 DS1302로부터 현재 날짜와 시간을 읽어옵니다. 이후 BME280에서 온도, 습도, 고도 값을 측정하여 각각 변수에 저장합니다.
- 센서 데이터를 모두 읽은 후에는 OLED 화면을 초기화하고, 글자 크기와 색상을 설정한 뒤 날짜, 시간, 온도, 습도, 고도를 지정된 위치에 순서대로 출력합니다.
- 시간은 한 자리 숫자인 경우 앞에 0을 붙여 항상 두 자리 형식으로 표시되도록 구성하였습니다.
- 모든 정보를 화면에 출력한 뒤 버퍼에 저장된 내용을 OLED에 표시하며, 1초 동안 대기 후 반복합니다.
- 이 과정을 통해 DS1302의 현재 시간과 BME280의 환경 정보를 1초마다 갱신하여 OLED 화면에서 실시간으로 확인할 수 있습니다.
주의사항 및 실험 환경에 대해

연결 및 실행 전에는 다음 사항을 확인합니다.
1. DS1302의 3개 신호 핀을 아두이노의 지정된 디지털 핀에 연결합니다.
DS1302는 I2C 방식이 아닌 3선 인터페이스를 사용하므로 DAT(I/O), CLK(SCLK), RST(CE) 핀을 코드에서 설정한 아두이노 핀 번호와 동일하게 연결해야 합니다.
이후 진행할 코드는 CLK: D2 / DAT: D3 / RST: D4 이며 핀 연결이 다르면 RTC와 정상적으로 통신할 수 없습니다.
2. BME280과 OLED는 I2C 버스를 공유하도록 연결합니다.
두 모듈 모두 I2C 통신을 사용하므로 SDA는 SDA끼리, SCL은 SCL끼리 연결한 뒤 아두이노 UNO의 A4(SDA), A5(SCL)에 배선합니다.
I2C는 여러 장치가 하나의 버스를 공유하여 주소기반으로 통신을 하기 때문에 두 모듈을 동시에 연결하여 사용할 수 있습니다.
3. 필요한 라이브러리를 설치합니다.
예제를 실행하기 전에 아래의 라이브러리를 설치하며 종속된 라이브러리가 있을 경우 해당 라이브러리도 설치를 진행해줍니다.
- Adafruit SSD1306
- Adafruit GFX
- Adafruit BME280
- ThreeWire
- Rtc by Makuna
필요한 라이브러리가 설치되어 있지 않으면 컴파일 오류가 발생하거나 프로그램이 정상적으로 동작하지 않습니다.
4. I2C Scanner로 각 모듈의 주소를 확인합니다.
BME280과 OLED는 I2C 주소를 사용하여 통신하므로, 예제를 실행하기 전에 I2C Scanner 코드로 실제 연결된 주소를 확인하는 것이 좋습니다.
확인한 주소가 코드의 주소값과 다를 경우 통신에 실패하여 모듈이 정상적으로 동작하지 않을 수 있습니다.
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(9600);
while (!Serial);
Serial.println("I2C Scanner");
}
void loop()
{
byte error, address;
int count = 0;
Serial.println("-----------------------");
for (address = 1; address < 127; address++)
{
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("Found : 0x");
if (address < 16)
Serial.print("0");
Serial.println(address, HEX);
count++;
}
}
if (count == 0)
Serial.println("No I2C devices");
delay(3000);
}
먼저 필요한 준비에 따라 모듈의 배치를 진행하고, 상단의 코드로 아두이노를 실행합니다.
I2C Scanner
-----------------------
Found : 0x3C
Found : 0x76
-----------------------
Found : 0x3C
Found : 0x76
-----------------------
Found : 0x3C
Found : 0x76
실행 후 BME280과 OLED의 연결이 잘 되어 있다면 시리얼 모니터에 이와 같은 값이 출력되어 BME280와 OLED의 주소를 확인할 수 있습니다.
실제로 동작을 해보자

이번에 진행할 예제의 준비물로, 아두이노 1대 / DS1302 모듈 / BME280 / 128*68 OLED 입니다.

위 사진과 같이 회로를 구성하면 준비는 완료됩니다.
이 상태에서 연결에 문제가 없다면 시간과 온습도 및 고도 정보가 OLED 에 출력이 됩니다.

해당 배선이 실제로 구현된 모습입니다.
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BME280.h>
#include <ThreeWire.h>
#include <RtcDS1302.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
Adafruit_BME280 bme;
// DS1302 핀
ThreeWire myWire(3, 2, 4); // DAT, CLK, RST
RtcDS1302<ThreeWire> Rtc(myWire);
void setup()
{
Serial.begin(9600);
// OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C))
{
while (1);
}
display.clearDisplay();
// BME280
if (!bme.begin(0x76))
{
display.println("BME280 Error");
display.display();
while (1);
}
// RTC
Rtc.Begin();
if (!Rtc.IsDateTimeValid())
{
Rtc.SetDateTime(RtcDateTime(__DATE__, __TIME__));
}
if (Rtc.GetIsWriteProtected())
Rtc.SetIsWriteProtected(false);
if (!Rtc.GetIsRunning())
Rtc.SetIsRunning(true);
}
void loop()
{
RtcDateTime now = Rtc.GetDateTime();
float temp = bme.readTemperature();
float hum = bme.readHumidity();
float alt = bme.readAltitude(1013.25);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
// OLED 날짜 표기
display.setCursor(0,0);
display.print(now.Year());
display.print("/");
display.print(now.Month());
display.print("/");
display.print(now.Day());
// OLED 시간 표기
display.setCursor(0,12);
if(now.Hour()<10) display.print("0");
display.print(now.Hour());
display.print(":");
if(now.Minute()<10) display.print("0");
display.print(now.Minute());
display.print(":");
if(now.Second()<10) display.print("0");
display.print(now.Second());
// OLED 온도 표기
display.setCursor(0,28);
display.print("Temp : ");
display.print(temp,1);
display.print(" C");
// OLED 습도 표기
display.setCursor(0,40);
display.print("Hum : ");
display.print(hum,1);
display.print(" %");
// OLED 고도 표기
display.setCursor(0,52);
display.print("Alt : ");
display.print(alt,1);
display.print(" m");
display.display();
delay(1000);
}
해당 코드를 업로드 하기 전에 아래와 같은 코드를 void setup() 에서 찾아 이전에 확인했던 모듈들의 주소와 일치하는지 확인합니다,
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C))
if (!bme.begin(0x76))
만약 주소가 다르다면 확인된 주소로 수정하여 업로드를 진행합니다.

해당 과정을 통해 OLED에 날짜/시간 및 온습도와 고도 정보가 실시간으로 갱신되는 결과를 확인할 수 있습니다.
RTC 를 이용한 실제 사례
블랙박스 보드
블랙박스 보드 수주금번 발주는 발주사 제품인 수중 스쿠터에 특정한 수심에서 동작 오류가 지속적으로 발생한다는 요청으로오류의 원인을 분석하기 위해서 블랙박스 개발을 요청 해 주셨습
ipmes.tistory.com
특정 수심에서 동작 오류가 지속적으로 발생하는 수중 스쿠터의 문제를 해결하기 위한 블랙박스 개발 프로젝트입니다.
오류 원인 분석을 위해 다양한 센서 값을 수집할 수 있는 블랙박스 개발을 요청받아 기획을 진행하였습니다.
협소한 내부 공간에 맞춰 메인보드와 파워보드를 분리 설계하였으며, 소형화하여 제한된 공간에 최적화하였습니다.
그리고 데이터 기록이 가능하도록 저전력 SD카드 저장 기술을 개발하여 안정적인 환경을 설계하였습니다.
검증은 무부하 상태와 부하 상태 두 가지로 나누어 진행하였으며, 각 조건에서 센서 데이터 수집과 저장이 정상적으로 이루어지는지 확인하였습니다.
테스트 결과 무부하와 부하 상태 모두에서 센서 데이터가 정상적으로 저장되는 것을 확인하였고, 이를 통해 실제 환경에서 발생하는 오류를 분석할 수 있는 데이터를 확보했습니다.
수주부터 하드웨어 설계, 펌웨어 개발, 오류 수정, 납품까지의 전 과정을 담았으니 보다 자세한 내용은 상단 링크를 통해 확인하실 수 있습니다.

TEL (062-226-1777, 010-9891-7244), E-mail (ipmes@ipmes.co.kr)
임베디드 시스템 | PCB 설계 제작 | 펌웨어 개발 | 신호처리 | 응용프로그램
#IPMES, #아이피엠이에스, #연구노트, #임베디드, #PCB제작, #펌웨어개발,
#하드웨어개발, #소프트웨어개발, #회로설계,
#광주PCB, #광주시제품, #광주시제품개발, #광주OEM, #광주광역시PCB,
#광주임베디드, #광주음성처리, #광주신호처리, #광주광역시임베디드,
#광주회로설계, #광주아트웍, #PCB샘플링
'연구노트 > 회로 설계' 카테고리의 다른 글
| [DS1302] DS1302로 알아보는 RTC (0) | 2026.08.03 |
|---|---|
| [MOSFET] MOSFET 스위칭 회로와 실제 사례 - 아두이노 실습 - (0) | 2026.05.20 |
| [MOSFET] IRFZ44N , IF4905 스위치, H브릿지 회로도 예시 (0) | 2026.05.18 |
| [MOSFET] IRFZ44N , IRF4905 의 데이터시트를 알아보자 (0) | 2026.05.15 |
| [MOSFET] BJT와 MOSFET의 차이점 (0) | 2026.05.13 |