ESP32와 함께 DS3231 실시간 클록(RTC) 모듈을 사용하는 방법

Esp32wa Hamkke Ds3231 Silsigan Keullog Rtc Modyul Eul Sayonghaneun Bangbeob



ESP32는 Wi-Fi 및 Bluetooth 기능이 내장된 스마트 마이크로컨트롤러 보드입니다. ESP32는 내부 RTC와 함께 제공되지만 작동은 전력에 따라 달라집니다. 따라서 전원이 없어도 실행하고 싶은 프로젝트나 회로를 설계하려면 DS1307이나 DS3231과 같은 외부 RTC 모듈을 사용해야 합니다.

우리는 이미 튜토리얼을 진행했습니다. ESP32 모듈과 인터페이스하는 DS1307 . 오늘은 DS3231 RTC 센서의 기본 사항에 대해 논의하고 이를 ESP32 보드와 인터페이스할 수 있는 방법을 확인하겠습니다.

목차:







1. DS3231 RTC 모듈이란 무엇입니까?



2. ESP32와 DS3231을 인터페이스하는 방법



3. 하드웨어





4. 코드

5. 출력



6. ESP32를 사용하여 OLED 화면에 RTC DS3231 시간을 표시하는 방법

결론

1. DS3231 RTC 모듈이란 무엇입니까?

DS3231 모듈은 매우 정확한 시간 유지를 제공합니다. 여기에는 뛰어난 정밀도로 시간을 제공하기 위한 통합 온도 보상 수정 발진기(TCXO)가 포함되어 있습니다. 모듈은 마스터-슬레이브 구성을 사용하여 I2C 프로토콜에서 작동합니다. 주 입력 전원이 없는 경우에도 백업 배터리로 시간과 날짜를 유지할 수 있습니다. 이는 일반적으로 시간과 날짜에 종속되는 장치에 사용됩니다.

DS3231은 초, 분, 시간을 감시합니다. 날짜와 평일을 기록할 수도 있습니다. 윤년을 처리할 때 그에 따라 자동으로 시간을 조정합니다. 또한 AM/PM 표시와 함께 12시간 또는 24시간 형식으로 시간을 표시할 수 있습니다.

1.1. DS3231 대 DS1307

DS3231과 DS1307은 모두 배터리 백업을 지원하는 시간 유지 모듈입니다. 그러나 DS3231은 DS1307보다 더 정확합니다. 주된 이유는 DS1307이 시간 유지를 위해 외부 32kHz 크리스털에 의존하기 때문입니다.

그러나 RTC DS3231은 내부 TCXO(온도 보상 수정 발진기)를 갖추고 있습니다. 이로 인해 외부 온도의 영향을 덜 받고 결과적으로 DS1307보다 연간 몇 분의 정확도 이점이 있습니다.

1.2. DS3231 핀아웃

DS3231은 I2C 프로토콜을 사용하여 작동합니다. 이 RTC 모듈의 중심에는 Maxim이 설계한 정확한 RTC 칩이 있습니다. 이 칩은 모든 시간 기능을 처리하고 ESP32 또는 Arduino 보드와 함께 I2C를 사용하여 통신합니다.

RTC DS3231 모듈의 주요 핀은 다음과 같습니다.

  • VCC: 이 핀을 전원의 양극 단자에 연결하세요.
  • 접지: 접지 연결.
  • SDA: 직렬 데이터 핀(I2C 통신에 사용됨)
  • SCL: 직렬 클록 핀(I2C 인터페이스의 일부이기도 함)
  • 질문: 구형파 출력 핀(예: 알람 또는 기타 타이밍 목적으로 주기적 신호를 생성할 수 있음)
  • 32K: 32KHz 발진기 출력(정확한 타이밍 애플리케이션에 유용)

다음은 RTC DS3231 모듈의 주요 온보드 구성 요소입니다.

  • 배터리 홀더: 이를 통해 외부 전원이 없을 때 모듈이 계속 작동할 수 있습니다.
  • RTC 칩: 이 칩은 시간과 날짜를 유지합니다.
  • AT24C32 EEPROM: 1,000,000회의 쓰기 주기로 데이터 로깅 및 기타 목적을 위한 비휘발성 스토리지를 제공합니다.
  • TCXO: 다양한 온도 범위에 대해 정확한 시간을 제공하는 온도 보상 발진기입니다.
  • 온도 센서: 온도 판독값을 가져와 모듈 기능의 일부로 제공합니다.

2. ESP32와 DS3231을 인터페이스하는 방법

DS3231을 ESP32와 인터페이스하려면 다음을 설치해야 합니다. RTClib 라이브러리 첫 번째. 이 Adafruit RTC 라이브러리를 설치한 후 I2C 프로토콜을 사용하여 ESP32 보드를 DS3231과 연결할 수 있습니다. ESP32 I2C를 RTC DS3231 모듈과 연결하려면 ESP32 D21 및 D22 핀을 사용할 수 있습니다.

2.1. RTC DS3231과 ESP32의 배선 다이어그램

먼저 ESP32를 I2C RTC DS3231 모듈과 연결해야 합니다. 배선을 위해 아래 제공된 핀 구성을 따르십시오.

ESP32를 RTC DS3231과 연결한 후 배선 다이어그램은 다음과 같아야 합니다. ESP32의 VIN 핀에서 DS3231에 전원을 공급할 수도 있습니다. DS3231의 작동 전압은 3.3~5.5VDC입니다.

2.2. 필수 라이브러리 설치

회로가 준비되면 다음 단계는 다음과 같습니다. Arduino IDE로 ESP32 보드 구성 . DS3231을 인터페이스하려면 다음을 설치해야 합니다. RTClib 라이브러리 . Arduino IDE 라이브러리 관리자를 사용하여 설치할 수 있습니다.

3. 하드웨어

ESP32를 사용하여 DS3231 기반 RTC 클록을 설계하려면 다음 하드웨어가 필요합니다.

  • ESP32 개발 보드
  • RTC DS3231 모듈
  • CR2032 배터리
  • 점퍼선
  • 브레드보드

4. 코드

RTC 라이브러리를 설치한 후 다음 부분은 DS3231용 코드를 작성하여 ESP32 보드에 업로드하는 것입니다. 먼저 현재 시간을 설정하는 코드를 작성해야 합니다. DS3231에서 시간을 설정하면 ESP32 보드가 꺼지더라도 시간을 기억하고 계속 실행됩니다.

이제 Arduino IDE를 열고 코드를 컴파일하고 ESP32 보드에 굽습니다.

#include
#include

RTC_DS3231 rtc ; // RTC_DS3231 클래스의 인스턴스를 초기화합니다.

무효의 설정 ( ) {
연속물. 시작하다 ( 115200 ) ;
철사. 시작하다 ( ) ;

만약에 ( ! rtc. 시작하다 ( ) ) {
연속물. 인쇄 ( 'RTC가 감지되지 않음' ) ;
~하는 동안 ( 1 ) ; // RTC를 찾을 수 없으면 무기한 정지됩니다.
}

//초기 날짜와 시간을 설정하려면 아래 줄의 주석 처리를 제거하세요.
//rtc.adjust(DateTime(__DATE__, __TIME__));
}

무효의 고리 ( ) {
// 센서(DS3231)에서 현재 시간을 읽어옵니다.
현재 날짜/시간 = rtc. 지금 ( ) ;

// 시, 분, 초의 두 자리 숫자로 같은 줄에 날짜와 시간을 인쇄합니다.
연속물. 인쇄 ( '현재 날짜: ' ) ;
연속물. 인쇄 ( 지금. 년도 ( ) , 12월 ) ;
연속물. 인쇄 ( '/' ) ;
printTwoDigits ( 지금. ( ) ) ;
연속물. 인쇄 ( '/' ) ;
printTwoDigits ( 지금. ( ) ) ;
연속물. 인쇄 ( ' 현재 시간: ' ) ;
printTwoDigits ( 지금. 시간 ( ) ) ;
연속물. 인쇄 ( ':' ) ;
printTwoDigits ( 지금. ( ) ) ;
연속물. 인쇄 ( ':' ) ;
printTwoDigits ( 지금. 두번째 ( ) ) ;
연속물. 인쇄 ( ) ;

지연 ( 1000 ) ; // 1초마다 업데이트
}

무효의 printTwoDigits ( 정수 숫자 ) {
만약에 ( 숫자 < 10 ) {
연속물. 인쇄 ( '0' ) ; // 한 자리 숫자에는 앞에 0을 추가합니다.
}
연속물. 인쇄 ( 숫자 ) ;
}

4.1. 코드 설명

코드는 와이어 라이브러리의 도움으로 직렬 I2C 통신을 초기화하는 것으로 시작됩니다. 그 후 DS3231 모듈과의 인터페이스를 위해 Adafruit의 RTC 라이브러리를 포함했습니다. 이 라이브러리는 RTC DS3231 모듈과 상호 작용하는 기능을 제공합니다.

에서 설정 부분적으로 I2C 버스가 시작되고 사용 가능한 I2C 장치가 확인됩니다. 찾을 수 없으면 프로그램이 무기한 중단됩니다. Arduino IDE 직렬 모니터에서 출력을 확인할 수 있도록 전송 속도도 정의됩니다.

처음으로 시계 설정하기

DS3231을 프로그래밍할 때 다음을 수행해야 합니다. 이 줄의 주석 처리를 해제하세요 . 이렇게 하면 시스템 시간을 가져와 RTC 메모리에 저장합니다. 이렇게 하면 RTC 모듈 시계가 시스템 시계와 동기화됩니다.

//rtc.adjust(DateTime(__DATE__, __TIME__));

시간을 설정한 후에는 위의 코드를 다시 업로드해야 하는데 이번에는 rtc.adjust() 함수 라인에 주석을 추가하세요. . 그렇지 않으면 이전 설정 시간을 덮어쓰게 되며 ESP32의 전원이 꺼지면 코드를 업로드한 시점부터 RTC가 다시 시작됩니다.

이렇게 하면 RTC 모듈이 CR2032 셀에 전원이 공급되는 한 시간이 RTC 모듈 배경에 유지됩니다.

에서 고리 부분적으로는 rtc.now() 함수를 사용하여 DS3231 모듈에서 현재 날짜와 시간을 읽습니다. 날짜 및 시간 구성 요소가 추출되고 형식화된 날짜가 1초마다 Arduino IDE 직렬 모니터에 인쇄됩니다.

5. 출력

ESP32 보드에 코드를 업로드하면 Arduino IDE 직렬 모니터에 시간이 인쇄되기 시작하는 것을 볼 수 있습니다.

6. ESP32를 사용하여 OLED 화면에 RTC DS3231 시간을 표시하는 방법

또한 한 단계 더 나아가 DS3231에서 읽은 후 OLED 화면에 시간을 표시할 수도 있습니다. 이를 위해서는 다음을 설치해야 합니다. Adafruit GFX SSD1306 라이브러리 Arduino IDE에서.

설치가 완료되면 다음 구성으로 ESP32를 OLED 및 RTC 모듈과 연결합니다.

센서를 연결하면 아래 회로도와 같은 회로를 볼 수 있습니다.

이제 다음 DS3231 코드를 ESP32 보드에 업로드하세요.

#include
#include
#include
#include 'RTClib.h'

RTC_DS3231 rtc ;

[ 7 ] [ 12 ] = { '일요일' , '월요일' , '화요일' , '수요일' , '목요일' , '금요일' , '토요일' } ;

Adafruit_SSD1306 디스플레이 = Adafruit_SSD1306 ( 128 , 64 , & 철사 , - 1 ) ;

무효의 설정 ( ) {
연속물. 시작하다 ( 115200 ) ;

표시하다. 시작하다 ( SSD1306_SWITCHCAPVCC , 0x3C ) ;

만약에 ( ! rtc. 시작하다 ( ) ) {
연속물. 인쇄 ( 'RTC를 찾을 수 없습니다! 회로를 확인하세요.' ) ;
~하는 동안 ( 1 ) ;
}
//처음으로 시간을 설정하는 동안 아래 줄의 주석 처리를 제거합니다.
//rtc.adjust(DateTime(__DATE__, __TIME__));
표시하다. 클리어디스플레이 ( ) ;
표시하다. setTextColor ( 하얀색 ) ;
표시하다. setTextSize ( 2 ) ;
표시하다. setCursor ( 0 , 이십 ) ;
표시하다. 인쇄 ( 'RTC 시계' ) ;
표시하다. 표시하다 ( ) ;
지연 ( 5000 ) ;
}

무효의 고리 ( ) {
현재 날짜/시간 = rtc. 지금 ( ) ;

표시하다. 클리어디스플레이 ( ) ;
표시하다. setTextSize ( 2 ) ;
표시하다. setCursor ( 75 , 0 ) ;
표시하다. 인쇄 ( 지금. 두번째 ( ) , 12월 ) ;
표시하다. setTextSize ( 2 ) ;
표시하다. setCursor ( 25 , 0 ) ;
표시하다. 인쇄 ( ':' ) ;
표시하다. setTextSize ( 2 ) ;
표시하다. setCursor ( 65 , 0 ) ;
표시하다. 인쇄 ( ':' ) ;
표시하다. setTextSize ( 2 ) ;
표시하다. setCursor ( 40 , 0 ) ;
표시하다. 인쇄 ( 지금. ( ) , 12월 ) ;
표시하다. setTextSize ( 2 ) ;
표시하다. setCursor ( 0 , 0 ) ;
표시하다. 인쇄 ( 지금. 시간 ( ) , 12월 ) ;
표시하다. setTextSize ( 2 ) ;
표시하다. setCursor ( 0 , 25 ) ;
표시하다. 인쇄 ( 지금. ( ) , 12월 ) ;
표시하다. 인쇄 ( [ 지금. 요일 ( ) ] ) ;
표시하다. setTextSize ( 2 ) ;
표시하다. setCursor ( 이십 , 25 ) ;
표시하다. 인쇄 ( '-' ) ;
표시하다. setTextSize ( 2 ) ;
표시하다. setCursor ( 35 , 25 ) ;
표시하다. 인쇄 ( 지금. ( ) , 12월 ) ;
표시하다. setTextSize ( 2 ) ;
표시하다. setCursor ( 60 , 25 ) ;
표시하다. 인쇄 ( '-' ) ;
표시하다. setTextSize ( 2 ) ;
표시하다. setCursor ( 75 , 25 ) ;
표시하다. 인쇄 ( 지금. 년도 ( ) , 12월 ) ;
표시하다. 표시하다 ( ) ;
}

코드 설명

코드는 RTC 및 OLED 화면에 필요한 몇 가지 중요한 라이브러리로 시작되었습니다. OLED 디스플레이는 Adafruit SSD1306 라이브러리를 사용하여 설정됩니다.

루프 부분에서는 rtc.now()를 사용하여 현재 날짜와 시간을 가져옵니다. 그 후 OLED 화면이 지워지고 시간 구성 요소가 디지털 시계 형식으로 표시됩니다. 코드를 수정하여 날짜 및 시간 형식을 조정할 수도 있습니다.

코드가 보드에 업로드되면 OLED 화면에 현재 시간이 표시됩니다.

메모: 위의 코드는 0x3C OLED의 I2C 주소입니다. 이는 SSD1306 OLED 디스플레이에서 사용할 수 있는 가장 일반적인 I2C 주소입니다. OLED 화면의 I2C 주소를 찾으려면 다음을 실행할 수 있습니다. I2C 스캐너 코드 .

결론

DS3231은 시간 유지에 사용할 수 있는 RTC 센서입니다. 마이크로 컨트롤러 보드가 꺼져 있어도 시간을 정확하게 유지할 수 있는 배터리 백업이 있습니다. ESP2를 DS3231과 인터페이스하려면 Arduino IDE에 RTClib 라이브러리를 설치해야 합니다. 그런 다음 ESP32의 디지털 핀을 사용하여 I2C 프로토콜을 통해 RTC 모듈을 연결해야 합니다. 연결되면 코드를 업로드하고 시간을 조정하기만 하면 됩니다. 이제 RTC 센서는 시간을 유지하며 설계 시간 기반 프로젝트의 직렬 모니터에서 이를 읽을 수 있습니다.