ESP32 Jam Masa Nyata (RTC) Menggunakan DS1307 dan Paparan OLED

Esp32 Jam Masa Nyata Rtc Menggunakan Ds1307 Dan Paparan Oled



ESP32 datang dengan modul RTC terbina dalam, tetapi itu hanya berfungsi apabila ada kuasa. Jika kuasa terputus, jam akan ditetapkan semula dan tidak dapat mengekalkan masa yang betul. Jadi jika anda ingin menjejaki masa atau mengawal mana-mana peranti berasaskan masa, kemudian cuba penderia DS1307 RTC. Walau bagaimanapun, anda mungkin berfikir untuk menyambungkan bateri sandaran dengan papan ESP32 anda, tetapi itu bukanlah senario terbaik untuk dilakukan jika anda mengalami kekurangan kuasa. Alternatif terbaik ialah menggunakan sensor DS1307, kerana ia dilengkapi dengan bateri terbina dalam yang boleh bertahan sekurang-kurangnya setahun.

Untuk menjelaskannya, Jam Masa Nyata (RTC) dalaman ESP32 boleh menjejaki masa walaupun semasa pemproses utama dimatikan atau dalam tidur nyenyak. Anda boleh menggunakan ESP32 RTC untuk menjejaki masa tanpa menggunakan banyak kuasa atau menjejaskan pemproses utama. Tetapi ia masih memerlukan kuasa untuk berjalan, tidak sebanyak itu tetapi jumlah kuasa minimum diperlukan untuk RTC dalaman untuk berjalan.

Jadi dengan ini, kita hanya tinggal dengan penyelesaian menggunakan modul RTC luaran. Mari lihat langkah-langkah antara muka papan ESP32 dengan modul RTC DS1307.







kandungan:

1. Apakah Modul RTC DS1307

DS1307 ialah peranti berkuasa rendah yang boleh menjejaki masa dan tarikh dengan tepat. Ia menggunakan format perpuluhan berkod binari (BCD). Ia boleh memberitahu anda masa dalam format terperinci seperti saat, minit, malah jam dan hari. Anda juga boleh mencetak tarikh dalam format penuh seperti bulan dan tahun. Ia juga mengetahui bila ia adalah tahun lompat, sehingga 2100. Untuk berkomunikasi dengan DS1307, anda boleh menggunakan protokol I2C.





DS1307 mempunyai bateri terbina dalam yang boleh menghidupkannya selama kira-kira setahun tanpa sumber 5V luaran. Menggunakan sandaran bateri ini, ia boleh mengekalkan masa walaupun kuasa utama dimatikan. Ia juga mempunyai 56 bait SRAM untuk menyimpan beberapa data. DS1307 ialah peranti berguna yang mempunyai banyak aplikasi apabila digabungkan dengan papan Arduino atau ESP32. Contohnya, data ini boleh membantu dalam pengelogan data, sistem penggera atau kawalan industri. Jika anda memerlukan ketepatan masa yang boleh dipercayai, DS1307 ialah pilihan yang bagus.





Spesifikasi Modul RTC DS1307

Modul RTC DS1307 terdiri daripada IC RTC, EEPROM, pengayun kristal dan pemegang bateri untuk sandaran.



Di bawah ialah butiran bahagian ini:

IC DS1307 RTC : IC DS1307 RTC ialah cip 8-pin yang menjejaki masa dan tarikh menggunakan protokol I2C. Ia menggunakan kuasa yang sangat sedikit, kurang daripada 500nA. Ia boleh memaparkan masa dalam saat, minit dan jam, dan tarikh dalam hari, bulan dan tahun. Ia juga boleh bertukar antara format 24 jam dan 12 jam.

24C32 EEPROM IC : IC EEPROM 24C32 ialah cip 32-bait daripada Atmel yang menyimpan tetapan, masa dan tarikh. Ia juga menggunakan protokol I2C.

Kristal 32.768kHz : Pengayun kristal 32.768kHz menyediakan frekuensi jam untuk IC RTC DS1307.

Pemegang Bateri : Pemegang bateri memegang bateri CR2032. Ia adalah sel syiling litium 3V. Ia memberikan kuasa berterusan kepada IC DS1307 RTC.

Peruntukan Sensor DS18B20 : Peruntukan sensor DS18B20 membolehkan anda memateri dan menggunakan sensor suhu DS18B20. Ia bukan pra-pateri. Anda boleh memateri pakej lubang telus dan mendapatkan suhu daripada pin DS modul.

Senarai di bawah memberikan beberapa spesifikasi pantas sensor DS1307 RTC:

  • Voltan kendalian: 4.5–5.5 V, biasanya 5 V
  • Penggunaan terkini : Kurang daripada 1.5 mA
  • Ketepatan : 0–40 °C, bergantung kepada kristal
  • Bateri : CR2032 (syiling 3 V)
  • Ingatan : 56 bait RAM tidak meruap
  • Antara muka : Antara muka bersiri dua wayar (I2C).
  • Pengeluaran : Pin keluaran 1 Hz
  • Output gelombang persegi boleh diprogramkan : Menggunakan kurang daripada 500 nA dalam mod sandaran bateri
  • Pengesanan kegagalan kuasa : Pengesanan kegagalan kuasa automatik dan litar suis
  • Litar deria kuasa : Ia boleh bertukar secara automatik untuk menyandarkan bekalan apabila kekurangan kuasa
  • Pampasan tahun lompat : Sah sehingga tahun 2100

Pinout Modul RTC DS1307

Modul ini mempunyai beberapa pin dengan fungsi yang berbeza.

  • VCC ialah pin yang memerlukan voltan DC antara 3.3V dan 5.5V untuk menggerakkan modul.
  • GND ialah pin untuk voltan rendah atau tanah.
  • SDA dan SCL ialah pin yang menyampaikan data dan isyarat jam melalui bas I2C.
  • DS ialah pin yang mengukur suhu dengan sensor DS1307 jika anda mempunyai satu pada modul RTC.
  • SQ ialah pin yang menjana isyarat gelombang persegi dengan frekuensi 1 Hz, 4 kHz, 8 kHz atau 32 kHz, bergantung pada cara anda memprogramkannya.
  • SATU ialah pin yang menggunakan bateri 3V untuk memastikan masa tepat apabila kuasa utama dimatikan.

2. Cara Mengantaramuka RTC DS1307 dan Paparan OLED dengan ESP32

Untuk antara muka ESP32 dengan DS1307 dan Paparan OLED, anda boleh menggunakan pin I2C terbina dalam papan ESP32. Kedua-dua paparan DS1307 dan OLED adalah peranti berasaskan I2C. Kemudian boleh berkomunikasi menggunakan protokol hamba induk I2C melalui bas I2C.

Sebelum kita beralih ke antara muka ESP32 dengan paparan DS1307 dan OLED, pertama anda perlu memasang beberapa perpustakaan yang diperlukan.

Memasang Perpustakaan yang Diperlukan

Anda akan memerlukan dua perpustakaan, satu untuk modul RTC dan satu untuk paparan OLED. Menggunakan OLED dengan modul RTC, anda boleh mencipta pratonton jam yang menakjubkan dan interaktif. Jika anda tidak mempunyai rancangan untuk memaparkan masa pada skrin, maka anda boleh melangkau pemasangan perpustakaan ini.

Berikut ialah dua perpustakaan yang anda perlukan:

  • RTClib (oleh Adafruit) ialah perpustakaan IDE Arduino untuk menetapkan dan mendapatkan masa daripada RTC. Ia juga menyediakan kelas untuk memanipulasi tarikh, masa dan tempoh. Menggunakan perpustakaan ini, anda boleh antara muka dan memprogram modul jam masa nyata (RTC), seperti DS1307 dan DS3231.
  • S SD1306 (oleh Adafruit) ialah perpustakaan untuk Arduino, yang mana anda boleh antara muka dan memprogram paparan OLED dengan Arduino atau mana-mana papan mikropengawal lain.

Untuk memuat turun dan memasang kedua-dua perpustakaan ini dalam Arduino IDE, mula-mula buka fail Pengurus Perpustakaan cari perpustakaan RTClib, dan klik Pasang :

Anda akan mendapat pilihan untuk memasang hanya perpustakaan atau kebergantungannya. Klik pada Pasang Semua butang untuk memasang perpustakaan sepenuhnya. Dengan cara ini anda tidak akan mendapat sebarang ralat jika anda mengubah suai kod yang bergantung pada kebergantungan perpustakaan ini.

Begitu juga, cari perpustakaan SSD1306. Pustaka ini diperlukan untuk paparan OLED. klik Pasang untuk meneruskan.

Kali ini anda juga akan mendapat mesej pengesahan yang sama. Klik pada Pasang Semua pilihan.

Kini kedua-dua perpustakaan untuk OLED dan DS1307 telah dipasang dan sedia untuk digunakan. Tetapi sebelum itu, pertama, ketahui alamat I2C untuk paparan OLED.

3. Mencari Alamat I2C Paparan OLED

Alamat I2C ialah pengecam unik untuk setiap peranti pada bas I2C. Ia membolehkan peranti induk berkomunikasi dengan peranti hamba tertentu dengan menghantar data ke alamatnya. Tujuan alamat I2C adalah untuk mengelakkan konflik dan kekeliruan antara berbilang peranti pada bas yang sama.

Untuk mendapatkan alamat peranti I2C, anda boleh menggunakan a lakaran ringkas yang mengimbas bas dan mencetak alamat daripada peranti yang ditemuinya. Sebagai alternatif, anda boleh menyemak lembaran data peranti untuk melihat alamat lalai atau boleh dikonfigurasikannya.

Di sini dalam kes kami selepas menjalankan kod pengimbas I2C alamat I2C berikut skrin OLED dipaparkan pada terminal IDE Arduino.

Selalunya, terdapat kemungkinan besar anda juga akan mendapat perkara yang sama 0x3C alamat untuk skrin OLED anda.

4. Mengantaramukakan Modul OLED dan RTC DS1307 dengan ESP32

1. Sambungkan pin SDA dan SCL bagi kedua-dua modul DS1307 dan Paparan OLED ke pin I2C daripada ESP32. Biasanya, ini ialah GPIO 21 dan GPIO 22 , tetapi anda boleh menetapkan sebarang pin lain juga dalam kod jika perlu.

2. Sambungkan kedua-dua VCC dan GND DS1307 dan paparan OLED ke pin 3.3V dan GND ESP32.

3. Masukkan bateri sel syiling CR2032 ke dalam modul DS1307 untuk menyediakan kuasa sandaran untuk jam masa nyata.

4. Muat naik kod contoh daripada tutorial ini ke papan ESP32 anda. Ubah suai kod untuk output tersuai.

Selepas memuat naik, jam akan bermula dari masa yang ditetapkan dan memaparkan masa pada skrin OLED.

5. Rajah Litar

Gambar rajah litar ESP32 dengan DS1307 adalah mudah, dengan hanya empat wayar yang perlu disambungkan. Anda boleh memendekkan wayar I2C SDA dan SCL bagi kedua-dua penderia OLED dan DS1307. Begitu juga, untuk menghidupkan kedua-dua sensor ini, pin 3V3 dan GND papan ESP32 boleh digunakan. Anda juga boleh kuasa daripada sumber yang berasingan jika perlu.

Catatan : Adalah selamat untuk menghidupkan RTC DS1307 daripada pin 3.3V ESP32 jika had semasa ESP32 tidak melebihi. Tetapi jika anda ingin berada di tapak yang selamat, anda boleh menggunakan sumber kuasa berasingan untuk modul RTC atau cuba sensor DS3231 berkuasa rendah yang julat operasinya antara 3.3 hingga 5.5 VDC.

Imej di bawah menggambarkan sambungan ESP32 dengan penderia RTC DS1307.

Begitu juga, jika anda ingin menyambungkan skrin OLED untuk memaparkan masa, anda boleh menggunakan pin I2C yang sama dan pin kuasa papan ESP32.

6. Kod

Menggunakan kod di bawah, kami akan menetapkan tarikh dan masa semasa pada RTC. Selepas menetapkan masa, kod akan memaparkan masa pada terminal IDE Arduino. Sebelum anda memuat naik kod, anda perlu mengemas kininya dengan tarikh dan masa semasa anda.

#include 'RTClib.h'
RTC_DS1307 DS1307_RTC;
char Week_days [ 7 ] [ 12 ] = { 'Ahad' , 'Isnin' , 'Selasa' , 'Rabu' , 'Khamis' , 'Jumaat' , 'Sabtu' } ;
persediaan kosong ( ) {
Bersiri.mulakan ( 115200 ) ;
#ifndef ESP8266
sementara ( ! bersiri ) ;
#endif
jika ( ! DS1307_RTC.mulakan ( ) ) {
Serial.println ( 'Tidak dapat mencari RTC' ) ;
sementara ( 1 ) ;
}
DS1307_RTC.adjust ( Masa tarikh ( F ( __TARIKH__ ) , F ( __MASA__ ) ) ) ;
}
gelung kosong ( ) {
DateTime sekarang = DS1307_RTC.now ( ) ;
Bersiri.cetak ( sekarang.tahun ( ) , DIS ) ;
Bersiri.cetak ( '/' ) ;
Bersiri.cetak ( sekarang.bulan ( ) , DIS ) ;
Bersiri.cetak ( '/' ) ;
Bersiri.cetak ( sekarang.hari ( ) , DIS ) ;
Bersiri.cetak ( '(' ) ;
Bersiri.cetak ( Minggu_hari [ sekarang.dayOfTheWeek ( ) ] ) ;
Bersiri.cetak ( ') ' ) ;
Bersiri.cetak ( sekarang.jam ( ) , DIS ) ;
Bersiri.cetak ( ':' ) ;
Bersiri.cetak ( sekarang.minit ( ) , DIS ) ;
Bersiri.cetak ( ':' ) ;
Bersiri.cetak ( sekarang.kedua ( ) , DIS ) ;
Serial.println ( ) ;
kelewatan ( 1000 ) ;
}

Kod ini menggunakan Pustaka RTClib untuk antara muka dengan modul jam masa nyata DS1307 yang menjejaki tarikh dan masa.

The persediaan fungsi bermula dengan memulakan kadar baud. Selepas itu, di dalam bahagian ini, kami menentukan fungsi untuk menyegerakkan tarikh dan masa komputer dengan sensor DS1307. Ini akan memuat naik masa penyusunan kod ke penderia RTC.

Anda boleh menggunakan gelung berfungsi untuk mendapatkan tarikh dan masa daripada RTC. Kemudian, anda boleh memaparkannya pada monitor bersiri seperti ini: tahun/bulan/hari (hari dalam seminggu) jam:minit:saat. Ingat untuk menambah kelewatan satu saat selepas setiap gelung, supaya kod tidak berjalan terlalu pantas.

Paparkan Masa Semasa pada Paparan OLED

Untuk memaparkan masa yang sama pada skrin OLED, kami perlu menambah bahagian kod tambahan untuk skrin OLED. Hanya muat naik kod yang diberikan. Kod ini akan memaparkan masa semasa pada skrin OLED anda.

Ingat, di sini kami menggunakan Modul Paparan OLED SSD I2C 128×64 inci 0.96 inci. Jika anda menggunakan saiz lain, ubah suai kod tersebut dengan sewajarnya. Juga, semak alamat I2C dan ubah suainya dalam kod yang diberikan. Dalam kes kami, kami mempunyai alamat I2C 0x3C untuk skrin OLED.

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

Paparan Adafruit_SSD1306 ( SCREEN_WIDTH, SCREEN_HEIGHT, & Kawat, - 1 ) ;
RTC_DS1307 RTC;
hari-hari char [ 7 ] [ 12 ] = { 'Ahad' , 'Isnin' , 'Selasa' , 'Rabu' , 'Khamis' , 'Jumaat' , 'Sabtu' } ;
persediaan kosong ( ) {
Bersiri.mulakan ( 115200 ) ;
jika ( ! RTC.mulakan ( ) ) {
Serial.println ( 'Tidak dapat mencari RTC' ) ;
sementara ( 1 ) ;
}
RTC.adjust ( Masa tarikh ( F ( __TARIKH__ ) , F ( __MASA__ ) ) ) ;
jika ( ! paparan.mula ( SSD1306_SWITCHCAPVCC, 0x3C ) ) {
Serial.println ( F ( 'Peruntukan SSD1306 gagal' ) ) ;
untuk ( ;; ) ;
}
kelewatan ( 1000 ) ;
paparan.clearDisplay ( ) ;
paparan.setTextSize ( 2 ) ;
paparan.setTextColor ( PUTIH ) ;
display.setCursor ( 30 , dua puluh ) ;
paparan.println ( 'Linux' ) ;
paparan.paparan ( ) ;
kelewatan ( 3000 ) ;
paparan.clearDisplay ( ) ;
}
gelung kosong ( ) {
DateTime sekarang = RTC.now ( ) ;
paparan.clearDisplay ( ) ;
paparan.setTextSize ( 2 ) ;
display.setCursor ( 0 , 0 ) ;
paparan.cetak ( sekarang.hari ( ) ) ;
paparan.cetak ( '/' ) ;
paparan.cetak ( sekarang.bulan ( ) ) ;
paparan.cetak ( '/' ) ;
paparan.cetak ( sekarang.tahun ( ) ) ;
paparan.println ( hari [ sekarang.dayOfTheWeek ( ) ] ) ;
paparan.println ( '' ) ;
display.setCursor ( 0 , 40 ) ;
jika ( sekarang.jam ( ) < 10 )
paparan.cetak ( '0' ) ;
paparan.cetak ( sekarang.jam ( ) ) ;
paparan.cetak ( ':' ) ;
jika ( sekarang.minit ( ) < 10 )
paparan.cetak ( '0' ) ;
paparan.cetak ( sekarang.minit ( ) ) ;
paparan.cetak ( ':' ) ;
jika ( sekarang.kedua ( ) < 10 )
paparan.cetak ( '0' ) ;
paparan.println ( sekarang.kedua ( ) ) ;
paparan.paparan ( ) ;
}

Kod bermula dengan perpustakaan yang kami pasang untuk RTC dan paparan. Selepas itu, ia mentakrifkan saiz skrin dan alamat paparan. Ia memulakan tatasusunan dengan nama hari bekerja.

The persediaan bahagian bermula dengan komunikasi bersiri. Ia menyemak sama ada RTC dan paparan berfungsi atau tidak. Selepas itu, kami telah menentukan teks rentetan 'Linuxhint' yang akan dipaparkan selama 3 saat. Ini adalah mesej pembukaan atau permulaan sahaja, anda boleh mengubah suai mesej ini dengan teks tersuai anda juga.

The gelung fungsi mendapat tarikh dan masa modul DS1307. Selepas itu, ia mengosongkan paparan dan mencetak tarikh dan masa dalam cara yang diformat. Kod ini juga menambah sifar pendahuluan kepada jam, minit dan saat, sekiranya nilainya lebih kecil daripada 10.

7. Perkakasan

Selepas memuat naik kod ke papan ESP32, anda akan melihat output berikut pada skrin OLED. Untuk perkakasan, kami telah menggunakan skrin OLED dan modul I2C RTC DS1307. Papan ESP32 dengan 30 pin digunakan. Anda boleh bereksperimen dengan papan ESP32 lain juga, tetapi pastikan anda menyambungkan pin I2C dengan betul.

Kesimpulan

RTC DS1307 mempunyai SRAM 56-bait dengan sokongan sandaran bateri. Ia adalah peranti 8-pin yang menggunakan protokol komunikasi I2C. Untuk antara muka modul RTC DS1307 dengan ESP32, anda boleh menggunakan pin I2C (GPIO 22 (SCL) dan GPIO 21 (SDA)) pada papan ESP32. Anda boleh mencetak masa pada konsol IDE Arduino atau menggunakan mana-mana skrin seperti OLED atau I2C LCD untuk memaparkan masa. Modul RTC DS1307 ialah peranti yang berguna untuk menjejaki masa dan tarikh dalam pelbagai aplikasi. Beberapa aplikasi utama termasuk pembalak data, jam digital dan jam tangan pintar.