Cách sử dụng Mô-đun Đồng hồ thời gian thực (RTC) DS3231 với ESP32

Cach Su Dung Mo Dun Dong Ho Thoi Gian Thuc Rtc Ds3231 Voi Esp32



ESP32 là bo mạch vi điều khiển thông minh được tích hợp khả năng Wi-Fi và Bluetooth. ESP32 đi kèm với RTC bên trong, nhưng hoạt động của nó phụ thuộc vào nguồn điện. Vì vậy, nếu bạn muốn thiết kế các dự án hoặc mạch muốn chạy ngay cả khi không có điện, bạn phải sử dụng bất kỳ mô-đun RTC bên ngoài nào như DS1307 hoặc DS3231.

Chúng tôi đã thực hiện một hướng dẫn về DS1307 giao tiếp với mô-đun ESP32 . Hôm nay chúng ta sẽ thảo luận những điều cơ bản về cảm biến DS3231 RTC và kiểm tra cách người ta có thể giao tiếp nó với bảng ESP32.

Mục lục:







1. Mô-đun RTC DS3231 là gì



2. Cách kết nối DS3231 với ESP32



3. Phần cứng





4. Mã

5. Đầu ra



6. Cách hiển thị thời gian RTC DS3231 trên màn hình OLED bằng ESP32

Phần kết luận

1. Mô-đun RTC DS3231 là gì

Mô-đun DS3231 cung cấp khả năng chấm công có độ chính xác cao. Nó bao gồm một bộ dao động tinh thể bù nhiệt độ tích hợp (TCXO) để cung cấp cho chúng ta thời gian với độ chính xác cao. Mô-đun này hoạt động trên giao thức I2C bằng cấu hình Master-Slave. Nó có thể lưu giữ ngày giờ bằng pin dự phòng ngay cả khi không có nguồn điện đầu vào chính. Nó thường được sử dụng trong các thiết bị phụ thuộc vào thời gian và ngày tháng.

DS3231 theo dõi giây, phút và giờ. Nó cũng có thể ghi lại ngày tháng và các ngày trong tuần. Khi xử lý năm nhuận, nó sẽ tự động điều chỉnh thời gian cho phù hợp. Ngoài ra, nó có thể hiển thị thời gian ở cả định dạng 12 giờ hoặc 24 giờ, hoàn chỉnh với chỉ báo AM/PM.

1.1. DS3231 so với DS1307

Cả DS3231 và DS1307 đều là mô-đun đo thời gian có hỗ trợ pin dự phòng. Tuy nhiên, DS3231 chính xác hơn DS1307. Lý do chính là DS1307 phụ thuộc vào tinh thể 32kHz bên ngoài để chấm công.

Tuy nhiên, RTC DS3231 có Bộ dao động tinh thể bù nhiệt độ bên trong (TCXO). Điều này làm cho nó ít bị ảnh hưởng bởi nhiệt độ bên ngoài và kết quả là nó có lợi thế về độ chính xác vài phút mỗi năm so với DS1307.

1.2. Sơ đồ chân DS3231

DS3231 hoạt động bằng giao thức I2C. Trọng tâm của mô-đun RTC này là chip RTC chính xác do Maxim thiết kế. Con chip này xử lý tất cả các chức năng thời gian và giao tiếp bằng I2C với bo mạch ESP32 hoặc Arduino.

Các chân chính của mô-đun RTC DS3231 là:

  • VCC: Kết nối chân này với cực dương của nguồn điện.
  • GND: Nối đất.
  • SDA: Chân dữ liệu nối tiếp (được sử dụng cho giao tiếp I2C).
  • SCL: Chân đồng hồ nối tiếp (cũng là một phần của giao diện I2C).
  • Hỏi: Chân đầu ra Sóng vuông (có thể tạo tín hiệu định kỳ, ví dụ: để báo động hoặc cho các mục đích định thời gian khác).
  • 32K: Đầu ra dao động 32KHz (hữu ích cho các ứng dụng định thời gian chính xác).

Sau đây là các thành phần chính trên bo mạch của mô-đun RTC DS3231:

  • Giá đỡ pin: Nó cho phép mô-đun tiếp tục chạy khi không có nguồn điện bên ngoài.
  • Chip RTC: Con chip này duy trì thời gian và ngày tháng.
  • AT24C32 EEPROM: Nó cung cấp khả năng lưu trữ ổn định để ghi dữ liệu và các mục đích khác với 1.000.000 chu kỳ ghi.
  • TCXO: Bộ dao động bù nhiệt độ để cung cấp thời gian chính xác cho một phạm vi nhiệt độ khác nhau.
  • Cảm biến nhiệt độ: Nó lấy số đo nhiệt độ và cung cấp chúng như một phần tính năng của mô-đun.

2. Cách kết nối DS3231 với ESP32

Để giao tiếp DS3231 với ESP32, bạn cần cài đặt thư viện RTClib Đầu tiên. Sau khi cài đặt thư viện Adaf nhung RTC này, bạn có thể kết nối bo mạch ESP32 của mình với DS3231 bằng giao thức I2C. Để kết nối ESP32 I2C với mô-đun RTC DS3231, bạn có thể sử dụng chân ESP32 D21 và D22.

2.1. Sơ đồ nối dây của ESP32 với RTC DS3231

Trước tiên, bạn phải nối dây ESP32 với mô-đun I2C RTC DS3231 của mình. Thực hiện theo cấu hình pin dưới đây để nối dây:

Sau khi kết nối ESP32 với RTC DS3231, sơ đồ nối dây của bạn sẽ trông như thế này. Bạn cũng có thể cấp nguồn cho DS3231 từ chân VIN của ESP32. Điện áp hoạt động của DS3231 là 3,3 đến 5,5 VDC.

2.2. Cài đặt các thư viện cần thiết

Khi mạch đã sẵn sàng, bước tiếp theo là cấu hình bảng ESP32 của bạn với Arduino IDE . Để giao tiếp với DS3231, bạn sẽ cần cài đặt thư viện RTClib . Bạn có thể cài đặt nó bằng cách sử dụng trình quản lý thư viện Arduino IDE.

3. Phần cứng

Bạn sẽ cần phần cứng sau để thiết kế đồng hồ RTC dựa trên DS3231 với ESP32:

  • Ban phát triển ESP32
  • Mô-đun RTC DS3231
  • Pin CR2032
  • Dây nhảy
  • Breadboard

4. Mã

Sau khi cài đặt thư viện RTC, phần tiếp theo là viết code cho DS3231 và upload lên board ESP32. Đầu tiên, bạn phải viết mã để đặt thời gian hiện tại. Sau khi bạn đặt thời gian trong DS3231, nó sẽ ghi nhớ thời gian và tiếp tục chạy ngay cả khi bo mạch ESP32 của bạn bị tắt.

Bây giờ hãy mở Arduino IDE, biên dịch và ghi mã vào bảng ESP32.

#include
#include

RTC_DS3231 rtc ; // Khởi tạo một instance của lớp RTC_DS3231

trống rỗng cài đặt ( ) {
Nối tiếp. bắt đầu ( 115200 ) ;
Dây điện. bắt đầu ( ) ;

nếu như ( ! rtc. bắt đầu ( ) ) {
Nối tiếp. in ( 'RTC không được phát hiện' ) ;
trong khi ( 1 ) ; // Treo vô thời hạn nếu không tìm thấy RTC
}

//Bỏ ghi chú dòng bên dưới để đặt ngày và giờ ban đầu
//rtc.just(DateTime(__DATE__, __TIME__));
}

trống rỗng vòng ( ) {
// Đọc thời gian hiện tại từ cảm biến (DS3231)
Ngày Giờ bây giờ = rtc. Hiện nay ( ) ;

// In ngày và giờ trên cùng một dòng với hai chữ số giờ, phút và giây
Nối tiếp. in ( 'Ngay hiện tại: ' ) ;
Nối tiếp. in ( Hiện nay. năm ( ) , THÁNG MƯỜI HAI ) ;
Nối tiếp. in ( '/' ) ;
inHai chữ số ( Hiện nay. tháng ( ) ) ;
Nối tiếp. in ( '/' ) ;
inHai chữ số ( Hiện nay. ngày ( ) ) ;
Nối tiếp. in ( ' Thời điểm hiện tại: ' ) ;
inHai chữ số ( Hiện nay. giờ ( ) ) ;
Nối tiếp. in ( ://:> ) ;
inHai chữ số ( Hiện nay. phút ( ) ) ;
Nối tiếp. in ( ://:> ) ;
inHai chữ số ( Hiện nay. thứ hai ( ) ) ;
Nối tiếp. in ( ) ;

trì hoãn ( 1000 ) ; // Cập nhật 1 giây một lần
}

trống rỗng inHai chữ số ( int con số ) {
nếu như ( con số < 10 ) {
Nối tiếp. in ( '0' ) ; // Thêm số 0 đứng đầu cho số có một chữ số
}
Nối tiếp. in ( con số ) ;
}

4.1. Giải thích mã

Mã bắt đầu bằng cách khởi tạo giao tiếp I2C nối tiếp với sự trợ giúp của thư viện dây. Sau đó, chúng tôi đã đưa vào thư viện RTC của Adafbean để giao tiếp với mô-đun DS3231. Thư viện này cung cấp chức năng tương tác với mô-đun RTC DS3231.

bên trong cài đặt một phần, bus I2C được khởi động và kiểm tra các thiết bị I2C có sẵn. Nếu không tìm thấy, chương trình sẽ bị treo vô thời hạn. Tốc độ truyền cũng được xác định để bạn có thể kiểm tra đầu ra trên màn hình nối tiếp Arduino IDE.

Đặt đồng hồ lần đầu tiên

Khi lập trình DS3231, bạn phải bỏ ghi chú dòng này . Điều này sẽ lấy thời gian hệ thống của bạn và lưu trữ nó bên trong bộ nhớ RTC. Bằng cách này, đồng hồ mô-đun RTC sẽ được đồng bộ hóa với đồng hồ hệ thống của bạn.

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

Sau khi đặt thời gian, bạn phải tải lại mã ở trên nhưng lần này bạn phải chú thích dòng hàm rtc.just() . Nếu không, thao tác này sẽ ghi đè thời gian đã đặt trước đó của bạn và khi tắt nguồn ESP32, RTC sẽ bắt đầu lại kể từ thời điểm bạn tải mã lên.

Bằng cách này, thời gian của bạn sẽ vẫn hiện diện trong nền mô-đun RTC miễn là mô-đun RTC có nguồn điện trong ô CR2032 của nó.

bên trong vòng phần này, ngày và giờ hiện tại được đọc từ mô-đun DS3231 bằng hàm rtc.now(). Các thành phần ngày và giờ được trích xuất và ngày được định dạng được in trên màn hình nối tiếp Arduino IDE cứ sau một giây.

5. Đầu ra

Sau khi tải mã lên bảng ESP32, bạn sẽ thấy thời gian sẽ bắt đầu in trên màn hình nối tiếp Arduino IDE.

6. Cách hiển thị thời gian RTC DS3231 trên màn hình OLED bằng ESP32

Bạn cũng có thể tiến thêm một bước nữa và hiển thị thời gian trên màn hình OLED sau khi đọc nó từ DS3231. Để làm được điều này, bạn cần cài đặt Thư viện Adafbean GFX SSD1306 trong Arduino IDE.

Sau khi cài đặt, hãy kết nối ESP32 với mô-đun OLED và RTC theo cấu hình sau.

Sau khi kết nối cảm biến, bạn sẽ thấy mạch điện trông giống như sơ đồ bên dưới.

Bây giờ hãy tải mã DS3231 sau lên bảng ESP32.

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

RTC_DS3231 rtc ;

ký tự ngày [ 7 ] [ 12 ] = { 'Chủ nhật' , 'Thứ hai' , 'Thứ ba' , 'Thứ Tư' , 'Thứ năm' , 'Thứ sáu' , 'Thứ bảy' } ;

Màn hình Adafbean_SSD1306 = Adafbean_SSD1306 ( 128 , 64 , & Dây điện , - 1 ) ;

trống rỗng cài đặt ( ) {
Nối tiếp. bắt đầu ( 115200 ) ;

trưng bày. bắt đầu ( SSD1306_SWITCHCAPVCC , 0x3C ) ;

nếu như ( ! rtc. bắt đầu ( ) ) {
Nối tiếp. in ( 'Không thể tìm thấy RTC! Kiểm tra mạch.' ) ;
trong khi ( 1 ) ;
}
//bỏ ghi chú dòng bên dưới khi cài đặt thời gian lần đầu tiên
//rtc.just(DateTime(__DATE__, __TIME__));
trưng bày. rõ ràngHiển thị ( ) ;
trưng bày. setTextColor ( TRẮNG ) ;
trưng bày. setTextSize ( 2 ) ;
trưng bày. bộ con trỏ ( 0 , hai mươi ) ;
trưng bày. in ( 'ĐỒNG HỒ RTC' ) ;
trưng bày. trưng bày ( ) ;
trì hoãn ( 5000 ) ;
}

trống rỗng vòng ( ) {
Ngày Giờ bây giờ = rtc. Hiện nay ( ) ;

trưng bày. rõ ràngHiển thị ( ) ;
trưng bày. setTextSize ( 2 ) ;
trưng bày. bộ con trỏ ( 75 , 0 ) ;
trưng bày. in ( Hiện nay. thứ hai ( ) , THÁNG MƯỜI HAI ) ;
trưng bày. setTextSize ( 2 ) ;
trưng bày. bộ con trỏ ( 25 , 0 ) ;
trưng bày. in ( ://:> ) ;
trưng bày. setTextSize ( 2 ) ;
trưng bày. bộ con trỏ ( 65 , 0 ) ;
trưng bày. in ( ://:> ) ;
trưng bày. setTextSize ( 2 ) ;
trưng bày. bộ con trỏ ( 40 , 0 ) ;
trưng bày. in ( Hiện nay. phút ( ) , THÁNG MƯỜI HAI ) ;
trưng bày. setTextSize ( 2 ) ;
trưng bày. bộ con trỏ ( 0 , 0 ) ;
trưng bày. in ( Hiện nay. giờ ( ) , THÁNG MƯỜI HAI ) ;
trưng bày. setTextSize ( 2 ) ;
trưng bày. bộ con trỏ ( 0 , 25 ) ;
trưng bày. in ( Hiện nay. ngày ( ) , THÁNG MƯỜI HAI ) ;
trưng bày. in ( ngày [ Hiện nay. ngày trong tuần ( ) ] ) ;
trưng bày. setTextSize ( 2 ) ;
trưng bày. bộ con trỏ ( hai mươi , 25 ) ;
trưng bày. in ( '-' ) ;
trưng bày. setTextSize ( 2 ) ;
trưng bày. bộ con trỏ ( 35 , 25 ) ;
trưng bày. in ( Hiện nay. tháng ( ) , THÁNG MƯỜI HAI ) ;
trưng bày. setTextSize ( 2 ) ;
trưng bày. bộ con trỏ ( 60 , 25 ) ;
trưng bày. in ( '-' ) ;
trưng bày. setTextSize ( 2 ) ;
trưng bày. bộ con trỏ ( 75 , 25 ) ;
trưng bày. in ( Hiện nay. năm ( ) , THÁNG MƯỜI HAI ) ;
trưng bày. trưng bày ( ) ;
}

Giải thích mã

Mã bắt đầu với một số thư viện quan trọng cần thiết cho màn hình RTC và OLED. Màn hình OLED được thiết lập bằng thư viện Adafruit SSD1306.

Trong phần vòng lặp, ngày và giờ hiện tại được lấy bằng rtc.now(). Sau đó, màn hình OLED sẽ bị xóa và các thành phần thời gian được hiển thị ở dạng đồng hồ kỹ thuật số. Bạn cũng có thể sửa đổi mã để điều chỉnh định dạng ngày và giờ.

Sau khi mã được tải lên bảng của bạn, bạn sẽ nhận được thời gian hiện tại trên màn hình OLED.

Ghi chú: Đoạn mã trên sử dụng 0x3C Địa chỉ I2C cho OLED. Đây là địa chỉ I2C phổ biến nhất hiện có trên màn hình OLED SSD1306. Nếu bạn muốn tìm địa chỉ I2C cho màn hình OLED của mình, bạn có thể chạy lệnh Mã máy quét I2C .

Phần kết luận

DS3231 là cảm biến RTC có thể được sử dụng để chấm công. Nó có một pin dự phòng có thể giữ thời gian chính xác ngay cả khi bo mạch vi điều khiển của bạn bị tắt. Để giao tiếp ESP2 với DS3231, bạn phải cài đặt thư viện RTClib trong Arduino IDE của mình. Sau đó, bạn phải kết nối mô-đun RTC qua giao thức I2C bằng chân kỹ thuật số của ESP32. Sau khi kết nối, chỉ cần tải mã lên và điều chỉnh thời gian. Giờ đây, cảm biến RTC sẽ lưu giữ thời gian và bạn có thể đọc nó trên màn hình nối tiếp của mình về các dự án dựa trên thời gian thiết kế.