ESP32 Real Time Clock (RTC) Gamit ang DS1307 at OLED Display

Esp32 Real Time Clock Rtc Gamit Ang Ds1307 At Oled Display



Ang ESP32 ay may kasamang built-in na RTC module, ngunit gumagana lang iyon kapag may power. Kung nawalan ng kuryente, mare-reset ang orasan at hindi mapanatili ang tamang oras. Kaya kung gusto mong subaybayan ang oras o kontrolin ang anumang device na nakabatay sa oras, pagkatapos ay subukan ang DS1307 RTC sensor. Gayunpaman, maaaring iniisip mong ikonekta ang isang backup na baterya sa iyong ESP32 board, ngunit hindi iyon ang pinakamagandang senaryo na gagawin kung mayroon kang kakulangan sa kuryente. Ang pinakamahusay na alternatibo ay ang paggamit ng DS1307 sensor, dahil may kasama itong built-in na baterya na maaaring tumagal nang hindi bababa sa isang taon.

Upang maging malinaw ang mga bagay-bagay, ang panloob na Real-Time Clock (RTC) ng ESP32 ay maaaring subaybayan ang oras kahit na ang pangunahing processor ay naka-off o nasa malalim na pagtulog. Maaari mong gamitin ang ESP32 RTC upang subaybayan ang oras nang hindi gumagamit ng maraming kapangyarihan o nakakaapekto sa pangunahing processor. Pero ito ay nangangailangan pa rin ng kapangyarihan upang tumakbo, hindi gaanong ngunit isang minimum na halaga ng kapangyarihan ay kinakailangan para sa panloob na RTC upang tumakbo.

Kaya kasama nito, natitira na lamang tayo sa solusyon ng paggamit ng panlabas na module ng RTC. Tingnan natin ang mga hakbang ng interfacing ng ESP32 board sa DS1307 RTC module.







Nilalaman:

1. Ano ang RTC DS1307 Module

Ang DS1307 ay isang low-power device na maaaring subaybayan ang oras at petsa nang tumpak. Gumagamit ito ng binary-coded decimal (BCD) na format. Maaari nitong sabihin sa iyo ang oras sa isang detalyadong format tulad ng mga segundo, minuto, at kahit na mga oras at araw. Maaari mo ring i-print ang petsa sa buong format tulad ng buwan at taon. Alam din nito kung kailan ito isang leap year, hanggang 2100. Para makipag-ugnayan sa DS1307, maaari mong gamitin ang I2C protocol.





Ang DS1307 ay may built-in na baterya na kayang paganahin ito nang halos isang taon nang walang panlabas na 5V na pinagmulan. Gamit ang backup na baterya na ito, maaari nitong panatilihin ang oras kahit na naka-off ang pangunahing power. Mayroon din itong 56 bytes ng SRAM upang mag-imbak ng ilang data. Ang DS1307 ay isang madaling gamiting device na mayroong maraming application kapag pinagsama sa isang Arduino o ESP32 board. Halimbawa, maaaring makatulong ang data na ito sa pag-log ng data, mga sistema ng alarma, o pang-industriya na kontrol. Kung kailangan mo ng maaasahang timekeeping, ang DS1307 ay isang magandang opsyon.





Mga Detalye ng Module ng RTC DS1307

Ang RTC DS1307 module ay binubuo ng RTC IC, isang EEPROM, isang kristal na oscillator, at isang may hawak ng baterya para sa backup.



Nasa ibaba ang mga detalye ng mga bahaging ito:

DS1307 RTC IC : Ang DS1307 RTC IC ay isang 8-pin chip na sumusubaybay sa oras at petsa gamit ang I2C protocol. Gumagamit ito ng napakakaunting kapangyarihan, mas mababa sa 500nA. Maaari itong magpakita ng oras sa mga segundo, minuto, at oras, at petsa sa mga araw, buwan, at taon. Maaari rin itong lumipat sa pagitan ng 24-oras at 12-oras na mga format.

24C32 EEPROM IC : Ang 24C32 EEPROM IC ay isang 32-byte chip mula sa Atmel na nag-iimbak ng mga setting, oras, at petsa. Ginagamit din nito ang I2C protocol.

32.768kHz Crystal : Ang 32.768kHz crystal oscillator ay nagbibigay ng clock frequency para sa DS1307 RTC IC.

Lalagyan ng baterya : Ang may hawak ng baterya ay may hawak na CR2032 na baterya. Ito ay isang 3V lithium coin cell. Nagbibigay ito ng tuluy-tuloy na kapangyarihan sa DS1307 RTC IC.

Probisyon ng Sensor ng DS18B20 : Ang probisyon ng sensor ng DS18B20 ay nagpapahintulot sa iyo na maghinang at gamitin ang sensor ng temperatura ng DS18B20. Hindi ito pre-soldered. Maaari mong ihinang ang through-hole package at makuha ang temperatura mula sa DS pin ng module.

Ang listahan sa ibaba ay nagbibigay ng ilang mabilis na pagtutukoy ng DS1307 RTC sensor:

  • Operating boltahe: 4.5–5.5 V, karaniwang 5 V
  • Kasalukuyang pagkonsumo : Mas mababa sa 1.5 mA
  • Katumpakan : 0–40 °C, depende sa kristal
  • Baterya : CR2032 (3 V coin)
  • Alaala : 56 bytes ng nonvolatile RAM
  • Interface : Dalawang-wire (I2C) serial interface
  • Output : 1 Hz output pin
  • Programmable square wave output : Kumokonsumo ng mas mababa sa 500 nA sa battery-backup mode
  • Power-fail detection : Awtomatikong power-fail detection at switch circuitry
  • Power-sense circuit : Maaari itong awtomatikong lumipat upang i-back up ang supply sa kakulangan ng kuryente
  • Kabayaran sa taon ng paglukso : May bisa hanggang sa taong 2100

Pinout ng Module ng RTC DS1307

Ang module ay may ilang mga pin na may iba't ibang mga function.

  • VCC ay ang pin na nangangailangan ng DC boltahe sa pagitan ng 3.3V at 5.5V upang ma-power ang module.
  • GND ay ang pin para sa mababang boltahe o lupa.
  • SDA at SCL ay ang mga pin na nagbibigay ng data at mga signal ng orasan sa pamamagitan ng I2C bus.
  • DS ay ang pin na sumusukat sa temperatura gamit ang DS1307 sensor kung mayroon kang isa sa RTC module.
  • SQ ay ang pin na bumubuo ng isang square-wave signal na may frequency na 1 Hz, 4 kHz, 8 kHz, o 32 kHz, depende sa kung paano mo ito pino-program.
  • ISA ay ang pin na gumagamit ng 3V na baterya upang panatilihing tumpak ang oras kapag naka-off ang pangunahing power.

2. Paano Mag-interface ng RTC DS1307 at OLED Display na may ESP32

Upang i-interface ang ESP32 sa DS1307 at OLED Display, maaari mong gamitin ang mga built-in na I2C pin ng ESP32 board. Parehong ang DS1307 at OLED display ay mga I2C-based na device. Pagkatapos ay maaaring makipag-usap gamit ang I2C master slave protocol sa I2C bus.

Bago tayo lumipat patungo sa interfacing ng ESP32 sa DS1307 at OLED display, kailangan mo munang mag-install ng ilang kinakailangang library.

Pag-install ng Mga Kinakailangang Aklatan

Kakailanganin mo ang dalawang library, isa para sa RTC module at isa para sa OLED display. Gamit ang OLED na may RTC module, maaari kang lumikha ng mga kamangha-manghang at interactive na mga preview ng orasan. Kung wala kang planong ipakita ang oras sa screen, maaari mong laktawan ang pag-install ng library na ito.

Ang mga sumusunod ay ang dalawang aklatan na kakailanganin mo:

  • RTClib (ni Adafruit) ay isang library ng Arduino IDE upang magtakda at makakuha ng oras mula sa isang RTC. Nagbibigay din ito ng mga klase para sa pagmamanipula ng mga petsa, oras, at tagal. Gamit ang library na ito, maaari mong i-interface at i-program ang real-time clock (RTC) modules, gaya ng DS1307 at DS3231.
  • S SD1306 (ni Adafruit) ay isang library para sa Arduino, kung saan maaari mong i-interface at iprograma ang mga OLED na ipinapakita gamit ang Arduino o anumang iba pang microcontroller board.

Upang i-download at i-install ang parehong mga aklatang ito sa Arduino IDE, buksan muna ang Tagapamahala ng Aklatan hanapin ang RTClib library, at i-click I-install :

Makukuha mo ang opsyon na i-install lamang ang library o ang mga dependency nito. I-click ang I-install Lahat button upang ganap na mai-install ang library. Sa ganitong paraan hindi ka makakakuha ng anumang error kung babaguhin mo ang code na nakadepende sa mga dependency ng library na ito.

Katulad nito, maghanap para sa SSD1306 library. Ang library na ito ay kailangan para sa isang OLED display. I-click I-install Magpatuloy.

Sa pagkakataong ito ay makakatanggap ka rin ng parehong mensahe ng kumpirmasyon. Mag-click sa I-install Lahat opsyon.

Ngayon ang parehong mga aklatan para sa OLED at DS1307 ay naka-install at handa nang gamitin. Ngunit bago iyon, alamin muna ang I2C address para sa OLED display.

3. Paghahanap ng I2C Address ng OLED Display

Ang I2C address ay isang natatanging identifier para sa bawat device sa I2C bus. Pinapayagan nito ang master device na makipag-ugnayan sa isang partikular na slave device sa pamamagitan ng pagpapadala ng data sa address nito. Ang layunin ng I2C address ay upang maiwasan ang mga salungatan at kalituhan sa pagitan ng maraming device sa parehong bus.

Upang makuha ang address ng isang I2C device, maaari mong gamitin ang a simpleng sketch na nag-scan sa bus at nagpi-print ng mga address ng mga device na nahahanap nito. Bilang kahalili, maaari mong tingnan ang datasheet ng device upang makita ang default o maaaring i-configure na address nito.

Dito sa aming kaso pagkatapos patakbuhin ang I2C scanner code ang sumusunod na I2C address ng OLED screen ay ipinapakita sa Arduino IDE terminal.

Kadalasan, malaki ang posibilidad na ganoon din ang makukuha mo 0x3C address para sa iyong OLED screen.

4. Pag-interface ng OLED at RTC DS1307 Module sa ESP32

1. Ikonekta ang SDA at SCL pin ng parehong DS1307 module at ng OLED display sa mga I2C pin ng ESP32. kadalasan, ito ay GPIO 21 at GPIO 22 , ngunit maaari kang magtalaga ng anumang iba pang mga pin sa code kung kinakailangan.

2. Ikonekta ang parehong VCC at GND ng DS1307 at ang OLED display sa 3.3V at GND pin ng ESP32.

3. Maglagay ng CR2032 coin cell na baterya sa DS1307 module para magbigay ng backup na power para sa real-time na orasan.

4. I-upload ang halimbawang code mula sa tutorial na ito sa iyong ESP32 board. Baguhin ang code para sa mga custom na output.

Pagkatapos mag-upload, magsisimula ang isang orasan mula sa itinakdang oras at ipapakita ang oras sa screen ng OLED.

5. Circuit Diagram

Ang circuit diagram ng ESP32 na may DS1307 ay simple, na may apat na wire lang na kailangang ikonekta. Maaari mong paikliin ang mga I2C wire na SDA at SCL ng parehong OLED at DS1307 sensor. Katulad nito, para mapagana ang parehong mga sensor na ito, maaaring gamitin ang 3V3 at GND pin ng ESP32 board. Maaari ka ring mag-power mula sa isang hiwalay na mapagkukunan kung kinakailangan.

Tandaan : Ligtas na paganahin ang RTC DS1307 mula sa isang 3.3V pin ng ESP32 kung ang kasalukuyang limitasyon ng ESP32 ay hindi lalampas. Ngunit kung gusto mong nasa isang ligtas na site, maaari kang gumamit ng hiwalay na power source para sa RTC module o subukan ang low-power na DS3231 sensor na ang operating range ay nasa pagitan ng 3.3 hanggang 5.5 VDC.

Ang larawan sa ibaba ay naglalarawan ng koneksyon ng ESP32 sa RTC DS1307 sensor.

Katulad nito, kung gusto mong ikonekta ang OLED screen upang ipakita ang oras, maaari mong gamitin ang parehong mga I2C pin at ang mga power pin ng ESP32 board.

6. Kodigo

Gamit ang code sa ibaba, itatakda namin ang kasalukuyang petsa at oras sa RTC. Pagkatapos itakda ang oras, ipapakita ng code ang oras sa Arduino IDE terminal. Bago mo i-upload ang code, kailangan mong i-update ito gamit ang iyong kasalukuyang petsa at oras.

#include 'RTClib.h'
RTC_DS1307 DS1307_RTC;
char Week_days [ 7 ] [ 12 ] = { 'Linggo' , 'Lunes' , 'Martes' , 'Miyerkules' , 'Huwebes' , 'Biyernes' , 'Sabado' } ;
walang bisang setup ( ) {
Serial.magsimula ( 115200 ) ;
#ifndef ESP8266
habang ( ! Serial ) ;
#tapusin kung
kung ( ! DS1307_RTC.magsimula ( ) ) {
Serial.println ( 'Hindi mahanap ang RTC' ) ;
habang ( 1 ) ;
}
DS1307_RTC.adjust ( PetsaOras ( F ( __DATE__ ) , F ( __TIME__ ) ) ) ;
}
walang laman na loop ( ) {
DateTime ngayon = DS1307_RTC.now ( ) ;
Serial.print ( ngayon.taon ( ) , DEC ) ;
Serial.print ( '/' ) ;
Serial.print ( ngayon.buwan ( ) , DEC ) ;
Serial.print ( '/' ) ;
Serial.print ( ngayong araw ( ) , DEC ) ;
Serial.print ( '(' ) ;
Serial.print ( Linggo_araw [ ngayon.dayOfTheWeek ( ) ] ) ;
Serial.print ( ') ' ) ;
Serial.print ( ngayon.oras ( ) , DEC ) ;
Serial.print ( ':' ) ;
Serial.print ( ngayon.minuto ( ) , DEC ) ;
Serial.print ( ':' ) ;
Serial.print ( ngayon.pangalawa ( ) , DEC ) ;
Serial.println ( ) ;
pagkaantala ( 1000 ) ;
}

Ginagamit ng code na ito ang RTClib library upang mag-interface sa isang DS1307 real-time na module ng orasan na sumusubaybay sa petsa at oras.

Ang setup Nagsimula ang function sa pagsisimula ng baud rate. Pagkatapos nito, sa loob ng seksyong ito, tinukoy namin ang function upang i-sync ang petsa at oras ng computer gamit ang DS1307 sensor. Ito ay mag-a-upload ng oras ng code compilation sa RTC sensor.

Maaari mong gamitin ang loop function upang makuha ang petsa at oras mula sa RTC. Pagkatapos, maaari mo itong ipakita sa serial monitor tulad nito: taon/buwan/araw (araw ng linggo) oras: minuto: segundo. Tandaang magdagdag ng isang segundong pagkaantala pagkatapos ng bawat loop, para hindi masyadong mabilis tumakbo ang code.

Ipakita ang Kasalukuyang Oras sa OLED Display

Upang ipakita ang parehong oras sa OLED screen, kailangan naming magdagdag ng karagdagang bahagi ng code para sa OLED screen. I-upload lang ang ibinigay na code. Ipapakita ng code na ito ang kasalukuyang oras sa iyong OLED screen.

Tandaan, dito ginagamit namin ang 0.96-inch 128×64 I2C SSD OLED Display Module. Kung gumagamit ka ng anumang iba pang laki, baguhin ang code nang naaayon. Gayundin, suriin ang I2C address at baguhin ito sa ibinigay na code. Sa aming kaso, mayroon kaming I2C address na 0x3C para sa OLED screen.

#include
#include
#include
#include 'RTClib.h'
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Display ng Adafruit_SSD1306 ( SCREEN_WIDTH, SCREEN_HEIGHT, at Kawad, - 1 ) ;
RTC_DS1307 RTC;
char days [ 7 ] [ 12 ] = { 'Linggo' , 'Lunes' , 'Martes' , 'Miyerkules' , 'Huwebes' , 'Biyernes' , 'Sabado' } ;
walang bisang setup ( ) {
Serial.magsimula ( 115200 ) ;
kung ( ! RTC.simulan ( ) ) {
Serial.println ( 'Hindi mahanap ang RTC' ) ;
habang ( 1 ) ;
}
RTC.adjust ( PetsaOras ( F ( __DATE__ ) , F ( __TIME__ ) ) ) ;
kung ( ! pagpapakita.simulan ( SSD1306_SWITCHCAPVCC, 0x3C ) ) {
Serial.println ( F ( 'Nabigo ang paglalaan ng SSD1306' ) ) ;
para sa ( ;; ) ;
}
pagkaantala ( 1000 ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setTextColor ( PUTI ) ;
display.setCursor ( 30 , dalawampu ) ;
display.println ( 'Linux' ) ;
display.display ( ) ;
pagkaantala ( 3000 ) ;
display.clearDisplay ( ) ;
}
walang laman na loop ( ) {
DateTime ngayon = RTC.now ( ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setCursor ( 0 , 0 ) ;
display.print ( ngayong araw ( ) ) ;
display.print ( '/' ) ;
display.print ( ngayon.buwan ( ) ) ;
display.print ( '/' ) ;
display.print ( ngayon.taon ( ) ) ;
display.println ( araw [ ngayon.dayOfTheWeek ( ) ] ) ;
display.println ( '' ) ;
display.setCursor ( 0 , 40 ) ;
kung ( ngayon.oras ( ) < 10 )
display.print ( '0' ) ;
display.print ( ngayon.oras ( ) ) ;
display.print ( ':' ) ;
kung ( ngayon.minuto ( ) < 10 )
display.print ( '0' ) ;
display.print ( ngayon.minuto ( ) ) ;
display.print ( ':' ) ;
kung ( ngayon.pangalawa ( ) < 10 )
display.print ( '0' ) ;
display.println ( ngayon.pangalawa ( ) ) ;
display.display ( ) ;
}

Nagsimula ang code sa mga aklatan na na-install namin para sa RTC at sa display. Pagkatapos nito, tinutukoy nito ang laki ng screen at ang display address. Sinisimulan nito ang array na may mga pangalan ng karaniwang araw.

Ang setup bahagi ay nagsisimula sa serial communication. Sinusuri nito kung gumagana o hindi ang RTC at ang display. Pagkatapos nito, tinukoy namin ang isang string na text na 'Linuxhint' na ipapakita sa loob ng 3 segundo. Ito ay isang pambungad o startup na mensahe lamang, maaari mo ring baguhin ang mensaheng ito gamit ang iyong pasadyang teksto.

Ang loop Nakukuha ng function ang petsa at oras ng module ng DS1307. Pagkatapos nito, iki-clear nito ang display at ipi-print ang petsa at oras sa naka-format na paraan. Nagdaragdag din ang code ng mga nangungunang zero sa mga oras, minuto, at segundo, kung sakaling mas maliit sa 10 ang mga value ng mga ito.

7. Hardware

Pagkatapos i-upload ang code sa ESP32 board, makikita mo ang sumusunod na output sa OLED screen. Para sa hardware, ginamit namin ang OLED screen at isang I2C RTC DS1307 module. Ginagamit ang ESP32 board na may 30 pin. Maaari ka ring mag-eksperimento sa anumang iba pang ESP32 board, ngunit siguraduhing ikonekta nang tama ang mga I2C pin.

Konklusyon

Ang RTC DS1307 ay may 56-byte na SRAM na may suporta sa backup ng baterya. Ito ay isang 8-pin na device na gumagamit ng I2C communication protocol. Upang i-interface ang DS1307 RTC module sa ESP32, maaari mong gamitin ang I2C pins (GPIO 22 (SCL) at GPIO 21 (SDA)) ng ESP32 board. Maaari mong i-print ang oras sa isang Arduino IDE console o gumamit ng anumang screen tulad ng OLED o I2C LCD upang ipakita ang oras. Ang DS1307 RTC module ay isang kapaki-pakinabang na aparato para sa pagsubaybay ng oras at petsa sa iba't ibang mga application. Kasama sa ilang pangunahing application ang mga data logger, digital na orasan, at mga smartwatch.