Đồng hồ thời gian thực ESP32 (RTC) sử dụng DS1307 và màn hình OLED

Dong Ho Thoi Gian Thuc Esp32 Rtc Su Dung Ds1307 Va Man Hinh Oled



ESP32 đi kèm với mô-đun RTC tích hợp, nhưng nó chỉ hoạt động khi có nguồn điện. Nếu mất điện, đồng hồ sẽ bị reset và không thể giữ đúng thời gian. Vì vậy, nếu bạn muốn theo dõi thời gian hoặc điều khiển bất kỳ thiết bị dựa trên thời gian nào, hãy thử cảm biến DS1307 RTC. Tuy nhiên, bạn có thể đang nghĩ đến việc kết nối pin dự phòng với bo mạch ESP32 của mình, nhưng đó không phải là trường hợp tốt nhất nên làm nếu bạn bị thiếu điện. Giải pháp thay thế tốt nhất là sử dụng cảm biến DS1307 vì nó đi kèm với pin tích hợp có thể hoạt động tối thiểu một năm.

Để hiểu rõ hơn, Đồng hồ thời gian thực (RTC) bên trong của ESP32 có thể theo dõi thời gian ngay cả khi bộ xử lý chính tắt nguồn hoặc ở chế độ ngủ sâu. Bạn có thể sử dụng ESP32 RTC để theo dõi thời gian mà không tốn nhiều điện năng hay ảnh hưởng đến bộ xử lý chính. Nhưng nó vẫn cần nguồn điện để chạy, không nhiều nhưng cần một lượng điện năng tối thiểu để RTC bên trong chạy.

Vì vậy, với điều này, chúng ta chỉ còn lại giải pháp sử dụng mô-đun RTC bên ngoài. Hãy cùng xem các bước kết nối bo mạch ESP32 với mô-đun DS1307 RTC.







Nội dung:

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

DS1307 là một thiết bị tiêu thụ ít năng lượng có thể theo dõi ngày giờ một cách chính xác. Nó sử dụng định dạng thập phân mã hóa nhị phân (BCD). Nó có thể cho bạn biết thời gian ở định dạng chi tiết như giây, phút và thậm chí cả giờ và ngày. Bạn cũng có thể in ngày ở định dạng đầy đủ như tháng và năm. Nó cũng biết khi nào là năm nhuận, lên tới năm 2100. Để giao tiếp với DS1307, bạn có thể sử dụng giao thức I2C.





DS1307 có pin tích hợp có thể cung cấp năng lượng cho nó trong khoảng một năm mà không cần nguồn 5V bên ngoài. Sử dụng pin dự phòng này, nó có thể giữ lại thời gian ngay cả khi tắt nguồn điện chính. Nó cũng có 56 byte SRAM để lưu trữ một số dữ liệu. DS1307 là một thiết bị tiện dụng có nhiều ứng dụng khi kết hợp với bo mạch Arduino hoặc ESP32. Ví dụ: dữ liệu này có thể hữu ích trong việc ghi dữ liệu, hệ thống báo động hoặc điều khiển công nghiệp. Nếu bạn cần máy chấm công đáng tin cậy thì DS1307 là một lựa chọn tuyệt vời.





Thông số kỹ thuật mô-đun RTC DS1307

Mô-đun RTC DS1307 bao gồm IC RTC, EEPROM, bộ tạo dao động tinh thể và giá đỡ pin để dự phòng.



Dưới đây là chi tiết của các bộ phận này:

IC RTC DS1307 : IC DS1307 RTC là chip 8 chân theo dõi ngày giờ bằng giao thức I2C. Nó sử dụng rất ít năng lượng, dưới 500nA. Nó có thể hiển thị thời gian theo giây, phút và giờ và ngày theo ngày, tháng và năm. Nó cũng có thể chuyển đổi giữa các định dạng 24 giờ và 12 giờ.

IC EEPROM 24C32 : IC EEPROM 24C32 là chip 32 byte của Atmel để lưu trữ cài đặt, thời gian và ngày tháng. Nó cũng sử dụng giao thức I2C.

Pha lê 32,768kHz : Bộ tạo dao động tinh thể 32,768kHz cung cấp tần số xung nhịp cho IC DS1307 RTC.

Giá đỡ pin : Giá đỡ pin chứa pin CR2032. Nó là một tế bào đồng xu lithium 3V. Nó cung cấp năng lượng liên tục cho IC DS1307 RTC.

Cung cấp cảm biến DS18B20 : Việc cung cấp cảm biến DS18B20 cho phép bạn hàn và sử dụng cảm biến nhiệt độ DS18B20. Nó không được hàn trước. Bạn có thể hàn gói xuyên lỗ và lấy nhiệt độ từ chân DS của mô-đun.

Danh sách dưới đây cung cấp một số thông số kỹ thuật nhanh của cảm biến DS1307 RTC:

  • Điện áp hoạt động: 4,5–5,5 V, thường là 5 V
  • Mức tiêu thụ hiện tại : Dưới 1,5 mA
  • Sự chính xác : 0–40 °C, tùy thuộc vào tinh thể
  • Ắc quy : CR2032 (đồng xu 3V)
  • Ký ức : 56 byte RAM không biến đổi
  • Giao diện : Giao diện nối tiếp hai dây (I2C)
  • đầu ra : Chân đầu ra 1 Hz
  • Đầu ra sóng vuông có thể lập trình : Tiêu thụ ít hơn 500 nA ở chế độ pin dự phòng
  • Phát hiện mất điện : Mạch chuyển mạch và phát hiện mất điện tự động
  • Mạch cảm nhận công suất : Nó có thể tự động chuyển sang nguồn dự phòng khi thiếu điện
  • Bồi thường năm nhuận : Có hiệu lực đến năm 2100

Sơ đồ chân mô-đun RTC DS1307

Mô-đun này có một số chân với các chức năng khác nhau.

  • VCC là chân cần điện áp DC trong khoảng 3,3V đến 5,5V để cấp nguồn cho mô-đun.
  • GND là chân cho điện áp thấp hoặc nối đất.
  • SDA SCL là các chân truyền dữ liệu và tín hiệu đồng hồ qua bus I2C.
  • DS là chân đo nhiệt độ bằng cảm biến DS1307 nếu bạn có cảm biến trên mô-đun RTC.
  • SQ là chân tạo ra tín hiệu sóng vuông có tần số 1 Hz, 4 kHz, 8 kHz hoặc 32 kHz, tùy thuộc vào cách bạn lập trình nó.
  • MỘT là chân cắm sử dụng pin 3V để giữ thời gian chính xác khi mất nguồn điện chính.

2. Cách kết nối RTC DS1307 và màn hình OLED với ESP32

Để kết nối ESP32 với DS1307 và Màn hình OLED, bạn có thể sử dụng các chân I2C tích hợp của bo mạch ESP32. Cả DS1307 và màn hình OLED đều là thiết bị dựa trên I2C. Sau đó có thể giao tiếp bằng giao thức nô lệ chính I2C qua bus I2C.

Trước khi chúng ta chuyển sang giao tiếp ESP32 với DS1307 và màn hình OLED, trước tiên bạn phải cài đặt một số thư viện cần thiết.

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

Bạn sẽ cần hai thư viện, một cho mô-đun RTC và một cho màn hình OLED. Sử dụng OLED với mô-đun RTC, bạn có thể tạo các bản xem trước đồng hồ mang tính tương tác và tuyệt vời. Nếu bạn không có kế hoạch hiển thị thời gian trên màn hình thì bạn có thể bỏ qua việc cài đặt thư viện này.

Sau đây là hai thư viện mà bạn sẽ cần:

  • RTClib (bởi Adafruit) là một thư viện Arduino IDE để thiết lập và lấy thời gian từ RTC. Nó cũng cung cấp các lớp để thao tác ngày, giờ và thời lượng. Sử dụng thư viện này, bạn có thể giao tiếp và lập trình các mô-đun đồng hồ thời gian thực (RTC), chẳng hạn như DS1307 và DS3231.
  • S SD1306 (bởi Adafruit) là một thư viện dành cho Arduino, sử dụng thư viện này bạn có thể giao tiếp và lập trình màn hình OLED với Arduino hoặc bất kỳ bo mạch vi điều khiển nào khác.

Để tải xuống và cài đặt cả hai thư viện này trong Arduino IDE, trước tiên hãy mở Quản lý thư viện tìm kiếm thư viện RTClib và nhấp vào Cài đặt :

Bạn sẽ có tùy chọn chỉ cài đặt thư viện hoặc các phần phụ thuộc của nó. Nhấn vào Cài đặt tất cả nút để cài đặt hoàn toàn thư viện. Bằng cách này, bạn sẽ không gặp bất kỳ lỗi nào nếu sửa đổi mã tùy thuộc vào sự phụ thuộc của thư viện này.

Tương tự tìm kiếm thư viện SSD1306. Thư viện này cần thiết cho màn hình OLED. Nhấp chuột Cài đặt tiến hành với.

Lần này bạn cũng sẽ nhận được thông báo xác nhận tương tự. Bấm vào Cài đặt tất cả lựa chọn.

Bây giờ cả thư viện dành cho OLED và DS1307 đều đã được cài đặt và sẵn sàng sử dụng. Nhưng trước đó, trước tiên hãy tìm địa chỉ I2C cho màn hình OLED.

3. Tìm địa chỉ I2C của màn hình OLED

Địa chỉ I2C là mã định danh duy nhất cho mỗi thiết bị trên bus I2C. Nó cho phép thiết bị chính giao tiếp với một thiết bị phụ cụ thể bằng cách gửi dữ liệu đến địa chỉ của nó. Mục đích của địa chỉ I2C là tránh xung đột và nhầm lẫn giữa nhiều thiết bị trên cùng một bus.

Để lấy địa chỉ của thiết bị I2C, bạn có thể sử dụng bản phác thảo đơn giản quét xe buýt và in địa chỉ của các thiết bị nó tìm thấy. Ngoài ra, bạn có thể kiểm tra bảng dữ liệu của thiết bị để xem địa chỉ mặc định hoặc có thể định cấu hình của thiết bị.

Ở đây trong trường hợp của chúng tôi sau khi chạy mã máy quét I2C, địa chỉ I2C sau của màn hình OLED được hiển thị trên thiết bị đầu cuối Arduino IDE.

Trong hầu hết các trường hợp, khả năng cao là bạn cũng sẽ gặp phải tình trạng tương tự 0x3C địa chỉ cho màn hình OLED của bạn.

4. Kết nối Mô-đun OLED và RTC DS1307 với ESP32

1. Kết nối các chân SDA và SCL của cả mô-đun DS1307 và mô-đun DS1307 Màn hình OLED tới các chân I2C của ESP32. Thường xuyên, đây là GPIO 21 và GPIO 22 , nhưng bạn có thể gán bất kỳ chân nào khác trong mã nếu cần.

2. Kết nối cả VCC và GND của DS1307 và màn hình OLED với các chân 3,3V và GND của ESP32.

3. Lắp pin dạng đồng xu CR2032 vào mô-đun DS1307 để cung cấp nguồn điện dự phòng cho đồng hồ thời gian thực.

4. Tải mã ví dụ từ hướng dẫn này lên bảng ESP32 của bạn. Sửa đổi mã cho đầu ra tùy chỉnh.

Sau khi tải lên, đồng hồ sẽ bắt đầu từ thời gian đã đặt và hiển thị thời gian trên màn hình OLED.

5. Sơ đồ mạch điện

Sơ đồ mạch của ESP32 với DS1307 rất đơn giản, chỉ cần nối bốn dây. Bạn có thể rút ngắn dây I2C SDA và SCL của cả cảm biến OLED và DS1307. Tương tự, để cấp nguồn cho cả hai cảm biến này, có thể sử dụng chân 3V3 và GND của bo mạch ESP32. Bạn cũng có thể cấp nguồn từ một nguồn riêng nếu cần.

Ghi chú : Việc cấp nguồn cho RTC DS1307 từ chân 3,3V của ESP32 là an toàn nếu không vượt quá giới hạn hiện tại của ESP32. Nhưng nếu muốn ở nơi an toàn, bạn có thể sử dụng nguồn điện riêng cho mô-đun RTC hoặc thử cảm biến DS3231 công suất thấp có phạm vi hoạt động trong khoảng 3,3 đến 5,5 VDC.

Hình ảnh bên dưới minh họa kết nối của ESP32 với cảm biến RTC DS1307.

Tương tự, nếu muốn kết nối màn hình OLED để hiển thị thời gian, bạn có thể sử dụng chung chân I2C và chân nguồn của board ESP32.

6. Mã

Sử dụng mã bên dưới, chúng tôi sẽ đặt ngày và giờ hiện tại trên RTC. Sau khi cài đặt thời gian, mã sẽ hiển thị thời gian trên thiết bị đầu cuối Arduino IDE. Trước khi tải mã lên, bạn cần cập nhật mã theo ngày và giờ hiện tại của mình.

#include 'RTClib.h'
RTC_DS1307 DS1307_RTC;
char Tuần_ngày [ 7 ] [ 12 ] = { 'Chủ nhật' , 'Thứ hai' , 'Thứ ba' , 'Thứ Tư' , 'Thứ năm' , 'Thứ sáu' , 'Thứ bảy' } ;
thiết lập vô hiệu ( ) {
Nối tiếp.bắt đầu ( 115200 ) ;
#ifndef ESP8266
trong khi ( ! nối tiếp ) ;
#endif
nếu như ( ! DS1307_RTC.begin ( ) ) {
Serial.println ( 'Không thể tìm thấy RTC' ) ;
trong khi ( 1 ) ;
}
DS1307_RTC.điều chỉnh ( Ngày giờ ( F ( __NGÀY__ ) , F ( __THỜI GIAN__ ) ) ) ;
}
vòng lặp trống ( ) {
Ngày giờ bây giờ = DS1307_RTC.now ( ) ;
Nối tiếp.print ( bây giờ.năm ( ) , THÁNG MƯỜI HAI ) ;
Nối tiếp.print ( '/' ) ;
Nối tiếp.print ( bây giờ.tháng ( ) , THÁNG MƯỜI HAI ) ;
Nối tiếp.print ( '/' ) ;
Nối tiếp.print ( ngày nay ( ) , THÁNG MƯỜI HAI ) ;
Nối tiếp.print ( '(' ) ;
Nối tiếp.print ( Tuần_ngày [ now.dayOfTheWeek ( ) ] ) ;
Nối tiếp.print ( ') ' ) ;
Nối tiếp.print ( bây giờ. giờ ( ) , THÁNG MƯỜI HAI ) ;
Nối tiếp.print ( ':' ) ;
Nối tiếp.print ( bây giờ.phút ( ) , THÁNG MƯỜI HAI ) ;
Nối tiếp.print ( ':' ) ;
Nối tiếp.print ( bây giờ.giây ( ) , THÁNG MƯỜI HAI ) ;
Serial.println ( ) ;
trì hoãn ( 1000 ) ;
}

Mã này sử dụng thư viện RTClib để giao tiếp với mô-đun đồng hồ thời gian thực DS1307 để theo dõi ngày và giờ.

Các cài đặt chức năng bắt đầu với việc khởi tạo tốc độ truyền. Sau đó, trong phần này chúng ta đã xác định chức năng đồng bộ ngày giờ của máy tính với cảm biến DS1307. Thao tác này sẽ tải thời gian biên dịch mã lên cảm biến RTC.

Bạn có thể dùng vòng để lấy ngày và giờ từ RTC. Sau đó, bạn có thể hiển thị nó trên màn hình nối tiếp như sau: năm/tháng/ngày (ngày trong tuần) giờ:phút:giây. Hãy nhớ thêm độ trễ một giây sau mỗi vòng lặp để mã không chạy quá nhanh.

Hiển thị thời gian hiện tại trên màn hình OLED

Để hiển thị cùng thời gian trên màn hình OLED, chúng ta phải bổ sung thêm một phần mã cho màn hình OLED. Đơn giản chỉ cần tải lên mã đã cho. Mã này sẽ hiển thị thời gian hiện tại trên màn hình OLED của bạn.

Hãy nhớ rằng, ở đây chúng tôi sử dụng Mô-đun màn hình OLED SSD I2C 128×64 0,96 inch. Nếu bạn đang sử dụng bất kỳ kích thước nào khác, hãy sửa đổi mã cho phù hợp. Ngoài ra, hãy kiểm tra địa chỉ I2C và sửa đổi nó theo mã đã cho. Trong trường hợp của chúng tôi, chúng tôi có địa chỉ I2C 0x3C cho màn hình OLED.

#include
#include
#include
#include 'RTClib.h'
#xác định SCREEN_WIDTH 128
#xác định SCREEN_HEIGHT 64

Màn hình Adafbean_SSD1306 ( SCREEN_WIDTH, SCREEN_HEIGHT, & Dây điện, - 1 ) ;
RTC_DS1307 RTC;
ngày char [ 7 ] [ 12 ] = { 'Chủ nhật' , 'Thứ hai' , 'Thứ ba' , 'Thứ Tư' , 'Thứ năm' , 'Thứ sáu' , 'Thứ bảy' } ;
thiết lập vô hiệu ( ) {
Nối tiếp.bắt đầu ( 115200 ) ;
nếu như ( ! RTC.bắt đầu ( ) ) {
Serial.println ( 'Không thể tìm thấy RTC' ) ;
trong khi ( 1 ) ;
}
RTC.điều chỉnh ( Ngày giờ ( F ( __NGÀY__ ) , F ( __THỜI GIAN__ ) ) ) ;
nếu như ( ! hiển thị.bắt đầu ( SSD1306_SWITCHCAPVCC, 0x3C ) ) {
Serial.println ( F ( 'Phân bổ SSD1306 không thành công' ) ) ;
( ;; ) ;
}
trì hoãn ( 1000 ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setTextColor ( TRẮNG ) ;
display.setCthon ( 30 , hai mươi ) ;
display.println ( 'Linux' ) ;
hiển thị.display ( ) ;
trì hoãn ( 3000 ) ;
display.clearDisplay ( ) ;
}
vòng lặp trống ( ) {
Ngày giờ bây giờ = RTC.now ( ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setCthon ( 0 , 0 ) ;
hiển thị.print ( ngày nay ( ) ) ;
hiển thị.print ( '/' ) ;
hiển thị.print ( bây giờ.tháng ( ) ) ;
hiển thị.print ( '/' ) ;
hiển thị.print ( bây giờ.năm ( ) ) ;
display.println ( ngày [ now.dayOfTheWeek ( ) ] ) ;
display.println ( '' ) ;
display.setCthon ( 0 , 40 ) ;
nếu như ( bây giờ. giờ ( ) < 10 )
hiển thị.print ( '0' ) ;
hiển thị.print ( bây giờ. giờ ( ) ) ;
hiển thị.print ( ':' ) ;
nếu như ( bây giờ.phút ( ) < 10 )
hiển thị.print ( '0' ) ;
hiển thị.print ( bây giờ.phút ( ) ) ;
hiển thị.print ( ':' ) ;
nếu như ( bây giờ.giây ( ) < 10 )
hiển thị.print ( '0' ) ;
display.println ( bây giờ.giây ( ) ) ;
hiển thị.display ( ) ;
}

Mã bắt đầu bằng các thư viện mà chúng tôi đã cài đặt cho RTC và màn hình. Sau đó, nó xác định kích thước màn hình và địa chỉ hiển thị. Nó khởi tạo mảng với tên ngày trong tuần.

Các cài đặt phần bắt đầu với giao tiếp nối tiếp. Nó kiểm tra xem RTC và màn hình có hoạt động hay không. Sau đó, chúng tôi đã xác định một chuỗi văn bản “Linuxhint” sẽ hiển thị trong 3 giây. Đây chỉ là thông báo mở đầu hoặc khởi động, bạn cũng có thể sửa đổi thông báo này bằng văn bản tùy chỉnh của mình.

Các vòng hàm lấy ngày và giờ của mô-đun DS1307. Sau đó, nó xóa màn hình và in ngày giờ theo cách được định dạng. Mã này cũng thêm các số 0 đứng đầu vào giờ, phút và giây, trong trường hợp giá trị của chúng nhỏ hơn 10.

7. Phần cứng

Sau khi tải mã lên bảng ESP32, bạn sẽ thấy kết quả đầu ra sau trên màn hình OLED. Đối với phần cứng, chúng tôi đã sử dụng màn hình OLED và mô-đun I2C RTC DS1307. Bảng ESP32 với 30 chân được sử dụng. Bạn cũng có thể thử nghiệm với bất kỳ bo mạch ESP32 nào khác, nhưng hãy đảm bảo kết nối các chân I2C chính xác.

Phần kết luận

RTC DS1307 có SRAM 56 byte có hỗ trợ pin dự phòng. Nó là một thiết bị 8 chân sử dụng giao thức truyền thông I2C. Để giao tiếp mô-đun DS1307 RTC với ESP32, bạn có thể sử dụng các chân I2C (GPIO 22 (SCL) và GPIO 21 (SDA)) của bo mạch ESP32. Bạn có thể in thời gian trên bảng điều khiển Arduino IDE hoặc sử dụng bất kỳ màn hình nào như OLED hoặc I2C LCD để hiển thị thời gian. Mô-đun DS1307 RTC là một thiết bị hữu ích để theo dõi ngày giờ trong các ứng dụng khác nhau. Một số ứng dụng chính bao gồm bộ ghi dữ liệu, đồng hồ kỹ thuật số và đồng hồ thông minh.