วิธีใช้โมดูลนาฬิกาแบบเรียลไทม์ (RTC) DS3231 กับ ESP32

Withi Chi Modul Nalika Baeb Rei Yl Thim Rtc Ds3231 Kab Esp32



ESP32 คือบอร์ดไมโครคอนโทรลเลอร์อัจฉริยะที่มีความสามารถ Wi-Fi และบลูทูธในตัว ESP32 มาพร้อมกับ RTC ภายใน แต่การทำงานขึ้นอยู่กับกำลังไฟ ดังนั้นหากคุณต้องการออกแบบโปรเจ็กต์หรือวงจรที่คุณต้องการรันแม้ไม่มีไฟฟ้า คุณต้องใช้โมดูล RTC ภายนอก เช่น DS1307 หรือ DS3231

เราได้ทำการสอนเกี่ยวกับ DS1307 เชื่อมต่อกับโมดูล ESP32 . วันนี้เราจะพูดถึงพื้นฐานของเซ็นเซอร์ DS3231 RTC และตรวจสอบว่าสามารถเชื่อมต่อกับบอร์ด ESP32 ได้อย่างไร

สารบัญ:







1. โมดูล DS3231 RTC คืออะไร



2. วิธีเชื่อมต่อ DS3231 กับ ESP32



3. ฮาร์ดแวร์





4. รหัส

5. เอาท์พุต



6. วิธีแสดงเวลา RTC DS3231 บนหน้าจอ OLED โดยใช้ ESP32

บทสรุป

1. โมดูล DS3231 RTC คืออะไร

โมดูล DS3231 ให้การบอกเวลาที่แม่นยำสูง ประกอบด้วยคริสตัลออสซิลเลเตอร์ชดเชยอุณหภูมิ (TCXO) ในตัวเพื่อให้เวลาเราได้อย่างแม่นยำอย่างยิ่ง โมดูลทำงานบนโปรโตคอล I2C โดยใช้การกำหนดค่า Master-Slave สามารถรักษาเวลาและวันที่ได้ด้วยแบตเตอรี่สำรองแม้ว่าจะไม่มีไฟเข้าหลักก็ตาม โดยทั่วไปจะใช้ในอุปกรณ์ที่ต้องอาศัยเวลาและวันที่

DS3231 เก็บแท็บวินาที นาที และชั่วโมง นอกจากนี้ยังสามารถบันทึกวันที่และวันธรรมดาได้อีกด้วย เมื่อต้องรับมือกับปีอธิกสุรทิน ระบบจะปรับเวลาให้เหมาะสมโดยอัตโนมัติ นอกจากนี้ยังสามารถแสดงเวลาในรูปแบบ 12 ชั่วโมงหรือ 24 ชั่วโมง พร้อมด้วยตัวบ่งชี้ AM/PM

1.1. DS3231 กับ DS1307

ทั้ง DS3231 และ DS1307 เป็นโมดูลบอกเวลาพร้อมรองรับแบตเตอรี่สำรอง อย่างไรก็ตาม DS3231 มีความแม่นยำมากกว่า DS1307 เหตุผลหลักก็คือ DS1307 ต้องใช้คริสตัล 32kHz ภายนอกในการจับเวลา

อย่างไรก็ตาม RTC DS3231 มีคริสตัลออสซิลเลเตอร์ชดเชยอุณหภูมิ (TCXO) ภายใน ทำให้ได้รับผลกระทบจากอุณหภูมิภายนอกน้อยลง และด้วยเหตุนี้ จึงมีข้อได้เปรียบด้านความแม่นยำที่ไม่กี่นาทีต่อปีกว่า DS1307

1.2. DS3231 พินเอาท์

DS3231 ทำงานโดยใช้โปรโตคอล I2C หัวใจของโมดูล RTC นี้ เรามีชิป RTC ที่แม่นยำซึ่งออกแบบโดย Maxim ชิปนี้จัดการฟังก์ชันตลอดเวลาและสื่อสารโดยใช้ I2C กับ ESP32 หรือบอร์ด Arduino

หมุดหลักของโมดูล RTC DS3231 คือ:

  • วีซีซี: เชื่อมต่อพินนี้เข้ากับขั้วบวกของแหล่งพลังงานของคุณ
  • จีเอ็นดี: การต่อสายดิน
  • มาตรฐานความปลอดภัย: พินข้อมูลอนุกรม (ใช้สำหรับการสื่อสาร I2C)
  • เอสซีแอล: พินนาฬิกาอนุกรม (เป็นส่วนหนึ่งของอินเทอร์เฟซ I2C)
  • คำถาม: พินเอาท์พุต Square Wave (สามารถสร้างสัญญาณเป็นระยะ เช่น สำหรับการเตือนหรือวัตถุประสงค์ในการจับเวลาอื่นๆ)
  • 32K: เอาต์พุตออสซิลเลเตอร์ 32KHz (มีประโยชน์สำหรับการใช้งานกำหนดเวลาที่แม่นยำ)

ต่อไปนี้เป็นส่วนประกอบหลักของโมดูล RTC DS3231:

  • ที่ใส่แบตเตอรี่: ช่วยให้โมดูลทำงานต่อไปได้เมื่อไม่มีพลังงานภายนอก
  • ชิป RTC: ชิปนี้จะรักษาเวลาและวันที่
  • AT24C32 อีพรอม: มีพื้นที่จัดเก็บข้อมูลแบบไม่ลบเลือนสำหรับการบันทึกข้อมูลและวัตถุประสงค์อื่นๆ ด้วยรอบการเขียน 1,000,000 รอบ
  • ทีซีเอ็กซ์โอ: ออสซิลเลเตอร์ชดเชยอุณหภูมิเพื่อให้เวลาที่ถูกต้องสำหรับช่วงอุณหภูมิที่แตกต่างกัน
  • เซ็นเซอร์อุณหภูมิ: ใช้การอ่านอุณหภูมิและจัดเตรียมไว้เป็นส่วนหนึ่งของคุณลักษณะของโมดูล

2. วิธีเชื่อมต่อ DS3231 กับ ESP32

หากต้องการเชื่อมต่อ DS3231 กับ ESP32 คุณต้องติดตั้งไฟล์ ไลบรารี RTClib อันดับแรก. หลังจากติดตั้งไลบรารี Adafruit RTC นี้แล้ว คุณสามารถเชื่อมต่อบอร์ด ESP32 ของคุณกับ DS3231 ได้โดยใช้โปรโตคอล I2C หากต้องการเชื่อมต่อ ESP32 I2C กับโมดูล RTC DS3231 คุณสามารถใช้พิน ESP32 D21 และ D22 ได้

2.1. แผนภาพการเดินสายไฟของ ESP32 พร้อม RTC DS3231

ขั้นแรก คุณต้องต่อสาย ESP32 กับโมดูล I2C RTC DS3231 ของคุณ ปฏิบัติตามการกำหนดค่าพินด้านล่างสำหรับการเดินสาย:

หลังจากเชื่อมต่อ ESP32 กับ RTC DS3231 แล้ว แผนภาพการเดินสายไฟของคุณควรมีลักษณะเช่นนี้ คุณยังสามารถจ่ายไฟให้กับ DS3231 ได้จากพิน VIN ของ ESP32 แรงดันไฟฟ้าในการทำงานของ DS3231 คือ 3.3 ถึง 5.5 VDC

2.2. การติดตั้งไลบรารีที่จำเป็น

เมื่อวงจรพร้อมแล้ว ขั้นตอนต่อไปก็คือ กำหนดค่าบอร์ด ESP32 ของคุณด้วย Arduino IDE . สำหรับการเชื่อมต่อ DS3231 คุณจะต้องติดตั้งไฟล์ ไลบรารี RTClib . คุณสามารถติดตั้งได้โดยใช้ตัวจัดการไลบรารี Arduino IDE

3. ฮาร์ดแวร์

คุณจะต้องมีฮาร์ดแวร์ต่อไปนี้สำหรับการออกแบบนาฬิกา RTC ที่ใช้ DS3231 พร้อม ESP32:

  • บอร์ดพัฒนา ESP32
  • โมดูล RTC DS3231
  • แบตเตอรี่ CR2032
  • สายจัมเปอร์
  • เขียงหั่นขนม

4. รหัส

หลังจากติดตั้งไลบรารี RTC แล้ว ส่วนต่อไปคือการเขียนโค้ดสำหรับ DS3231 และอัปโหลดไปยังบอร์ด ESP32 ขั้นแรก คุณต้องเขียนโค้ดเพื่อตั้งเวลาปัจจุบันของคุณ หลังจากที่คุณตั้งเวลาใน DS3231 แล้ว เครื่องจะจดจำเวลาและทำงานต่อไปแม้ว่าบอร์ด ESP32 ของคุณจะถูกปิดก็ตาม

ตอนนี้ให้เปิด Arduino IDE คอมไพล์และเบิร์นโค้ดลงในบอร์ด ESP32

#รวม
#รวม

RTC_DS3231rtc ; // เริ่มต้นอินสแตนซ์ของคลาส RTC_DS3231

เป็นโมฆะ ติดตั้ง ( ) {
อนุกรม เริ่ม ( 115200 ) ;
ลวด. เริ่ม ( ) ;

ถ้า ( ! rtc เริ่ม ( ) ) {
อนุกรม พิมพ์ ( 'ตรวจไม่พบ RTC' ) ;
ในขณะที่ ( 1 ) ; // หยุดชั่วคราวหากไม่พบ RTC
}

//ยกเลิกหมายเหตุบรรทัดด้านล่างเพื่อตั้งค่าวันที่และเวลาเริ่มต้น
//rtc.adjust(วันที่เวลา(__วันที่__, __TIME__));
}

เป็นโมฆะ วนซ้ำ ( ) {
// อ่านเวลาปัจจุบันจากเซ็นเซอร์ (DS3231)
วันที่และเวลาในขณะนี้ = rtc ตอนนี้ ( ) ;

// พิมพ์วันที่และเวลาในบรรทัดเดียวกันด้วยตัวเลขสองหลักสำหรับชั่วโมง นาที และวินาที
อนุกรม พิมพ์ ( 'วันที่ปัจจุบัน: ' ) ;
อนุกรม พิมพ์ ( ตอนนี้. ปี ( ) , ธ.ค ) ;
อนุกรม พิมพ์ ( '/' ) ;
พิมพ์TwoDigits ( ตอนนี้. เดือน ( ) ) ;
อนุกรม พิมพ์ ( '/' ) ;
พิมพ์TwoDigits ( ตอนนี้. วัน ( ) ) ;
อนุกรม พิมพ์ ( ' เวลาปัจจุบัน: ' ) ;
พิมพ์TwoDigits ( ตอนนี้. ชั่วโมง ( ) ) ;
อนุกรม พิมพ์ ( ::: ) ;
พิมพ์TwoDigits ( ตอนนี้. นาที ( ) ) ;
อนุกรม พิมพ์ ( ::: ) ;
พิมพ์TwoDigits ( ตอนนี้. ที่สอง ( ) ) ;
อนุกรม พิมพ์ ( ) ;

ล่าช้า ( 1,000 ) ; // อัปเดตทุกๆ 1 วินาที
}

เป็นโมฆะ พิมพ์TwoDigits ( ภายใน ตัวเลข ) {
ถ้า ( ตัวเลข < 10 ) {
อนุกรม พิมพ์ ( '0' ) ; // เพิ่มศูนย์นำหน้าสำหรับตัวเลขหลักเดียว
}
อนุกรม พิมพ์ ( ตัวเลข ) ;
}

4.1. คำอธิบายรหัส

รหัสเริ่มต้นด้วยการเริ่มต้นการสื่อสารแบบอนุกรม I2C ด้วยความช่วยเหลือของไลบรารีแบบใช้สาย หลังจากนั้น เราได้รวมไลบรารี RTC โดย Adafruit เพื่อเชื่อมต่อกับโมดูล DS3231 ไลบรารีนี้มีฟังก์ชันโต้ตอบกับโมดูล RTC DS3231

ใน ติดตั้ง ส่วนหนึ่งคือบัส I2C จะสตาร์ทและตรวจสอบอุปกรณ์ I2C ที่มีอยู่ หากไม่พบโปรแกรมจะหยุดทำงานโดยไม่มีกำหนด นอกจากนี้ อัตรารับส่งข้อมูลยังถูกกำหนดไว้อีกด้วย เพื่อให้คุณสามารถตรวจสอบเอาต์พุตบนมอนิเตอร์อนุกรม Arduino IDE ได้

การตั้งนาฬิกาเป็นครั้งแรก

เมื่อตั้งโปรแกรม DS3231 คุณต้องทำ ไม่แสดงความคิดเห็นบรรทัดนี้ . นี่จะเป็นการรับเวลาของระบบและจัดเก็บไว้ในหน่วยความจำ RTC เมื่อทำเช่นนี้ นาฬิกาโมดูล RTC จะซิงโครไนซ์กับนาฬิการะบบของคุณ

//rtc.adjust(วันที่เวลา(__วันที่__, __TIME__));

หลังจากตั้งเวลาแล้ว คุณต้องอัปโหลดโค้ดด้านบนอีกครั้ง แต่คราวนี้คุณต้องอัปโหลด แสดงความคิดเห็นเกี่ยวกับบรรทัดฟังก์ชัน rtc.adjust() . มิฉะนั้นการดำเนินการนี้จะเขียนทับเวลาที่ตั้งไว้ก่อนหน้าของคุณ และเมื่อปิด ESP32 ของคุณ RTC จะเริ่มใหม่อีกครั้งนับจากเวลาที่คุณอัปโหลดโค้ด

เมื่อทำเช่นนี้ เวลาของคุณจะยังคงอยู่ในพื้นหลังของโมดูล RTC ตราบใดที่โมดูล RTC มีพลังงานอยู่ในเซลล์ CR2032

ใน วนซ้ำ ส่วนหนึ่งคืออ่านวันที่และเวลาปัจจุบันจากโมดูล DS3231 โดยใช้ฟังก์ชัน rtc.now() ส่วนประกอบวันที่และเวลาจะถูกแยกออกมา และวันที่ที่จัดรูปแบบแล้วจะถูกพิมพ์บนจอภาพอนุกรม Arduino IDE ทุกๆ หนึ่งวินาที

5. เอาท์พุต

หลังจากอัปโหลดโค้ดไปยังบอร์ด ESP32 แล้ว คุณจะเห็นเวลาที่จะเริ่มพิมพ์บนมอนิเตอร์อนุกรม Arduino IDE

6. วิธีแสดงเวลา RTC DS3231 บนหน้าจอ OLED โดยใช้ ESP32

คุณยังสามารถก้าวไปอีกขั้นหนึ่งและแสดงเวลาบนหน้าจอ OLED ของคุณหลังจากอ่านค่าจาก DS3231 สำหรับสิ่งนี้ คุณจะต้องติดตั้งไฟล์ ไลบรารี Adafruit GFX SSD1306 ใน Arduino IDE

เมื่อติดตั้งแล้ว ให้เชื่อมต่อ ESP32 กับโมดูล OLED และ RTC ในการกำหนดค่าต่อไปนี้

หลังจากเชื่อมต่อเซ็นเซอร์แล้ว คุณจะเห็นวงจรดูเหมือนแผนผังด้านล่าง

ตอนนี้อัปโหลดรหัส DS3231 ต่อไปนี้ไปยังบอร์ด ESP32

#รวม
#รวม
#รวม
#รวม 'RTClib.h'

RTC_DS3231rtc ;

ถ่าน วัน [ 7 ] [ 12 ] = { 'วันอาทิตย์' , 'วันจันทร์' , 'วันอังคาร' , 'วันพุธ' , 'วันพฤหัสบดี' , 'วันศุกร์' , 'วันเสาร์' } ;

จอแสดงผล Adafruit_SSD1306 = Adafruit_SSD1306 ( 128 , 64 , & ลวด , - - 1 ) ;

เป็นโมฆะ ติดตั้ง ( ) {
อนุกรม เริ่ม ( 115200 ) ;

แสดง. เริ่ม ( SSD1306_SWITCHCAPVCC , 0x3C ) ;

ถ้า ( ! rtc เริ่ม ( ) ) {
อนุกรม พิมพ์ ( 'ไม่พบ RTC! ตรวจสอบวงจร' ) ;
ในขณะที่ ( 1 ) ;
}
//ยกเลิกหมายเหตุบรรทัดด้านล่างขณะตั้งเวลาเป็นครั้งแรก
//rtc.adjust(วันที่เวลา(__วันที่__, __TIME__));
แสดง. จอแสดงผลที่ชัดเจน ( ) ;
แสดง. setTextColor ( สีขาว ) ;
แสดง. กำหนดขนาดข้อความ ( 2 ) ;
แสดง. ตั้งเคอร์เซอร์ ( 0 , ยี่สิบ ) ;
แสดง. พิมพ์ ( 'นาฬิกา RTC' ) ;
แสดง. แสดง ( ) ;
ล่าช้า ( 5,000 ) ;
}

เป็นโมฆะ วนซ้ำ ( ) {
วันที่และเวลาในขณะนี้ = rtc ตอนนี้ ( ) ;

แสดง. จอแสดงผลที่ชัดเจน ( ) ;
แสดง. กำหนดขนาดข้อความ ( 2 ) ;
แสดง. ตั้งเคอร์เซอร์ ( 75 , 0 ) ;
แสดง. พิมพ์ ( ตอนนี้. ที่สอง ( ) , ธ.ค ) ;
แสดง. กำหนดขนาดข้อความ ( 2 ) ;
แสดง. ตั้งเคอร์เซอร์ ( 25 , 0 ) ;
แสดง. พิมพ์ ( ::: ) ;
แสดง. กำหนดขนาดข้อความ ( 2 ) ;
แสดง. ตั้งเคอร์เซอร์ ( 65 , 0 ) ;
แสดง. พิมพ์ ( ::: ) ;
แสดง. กำหนดขนาดข้อความ ( 2 ) ;
แสดง. ตั้งเคอร์เซอร์ ( 40 , 0 ) ;
แสดง. พิมพ์ ( ตอนนี้. นาที ( ) , ธ.ค ) ;
แสดง. กำหนดขนาดข้อความ ( 2 ) ;
แสดง. ตั้งเคอร์เซอร์ ( 0 , 0 ) ;
แสดง. พิมพ์ ( ตอนนี้. ชั่วโมง ( ) , ธ.ค ) ;
แสดง. กำหนดขนาดข้อความ ( 2 ) ;
แสดง. ตั้งเคอร์เซอร์ ( 0 , 25 ) ;
แสดง. พิมพ์ ( ตอนนี้. วัน ( ) , ธ.ค ) ;
แสดง. พิมพ์ ( วัน [ ตอนนี้. วันของสัปดาห์ ( ) ] ) ;
แสดง. กำหนดขนาดข้อความ ( 2 ) ;
แสดง. ตั้งเคอร์เซอร์ ( ยี่สิบ , 25 ) ;
แสดง. พิมพ์ ( '-' ) ;
แสดง. กำหนดขนาดข้อความ ( 2 ) ;
แสดง. ตั้งเคอร์เซอร์ ( 35 , 25 ) ;
แสดง. พิมพ์ ( ตอนนี้. เดือน ( ) , ธ.ค ) ;
แสดง. กำหนดขนาดข้อความ ( 2 ) ;
แสดง. ตั้งเคอร์เซอร์ ( 60 , 25 ) ;
แสดง. พิมพ์ ( '-' ) ;
แสดง. กำหนดขนาดข้อความ ( 2 ) ;
แสดง. ตั้งเคอร์เซอร์ ( 75 , 25 ) ;
แสดง. พิมพ์ ( ตอนนี้. ปี ( ) , ธ.ค ) ;
แสดง. แสดง ( ) ;
}

คำอธิบายรหัส

โค้ดเริ่มต้นด้วยไลบรารีที่สำคัญบางตัวที่จำเป็นสำหรับหน้าจอ RTC และ OLED จอแสดงผล OLED ได้รับการตั้งค่าโดยใช้ไลบรารี Adafruit SSD1306

ในส่วนของลูป รับวันที่และเวลาปัจจุบันโดยใช้ rtc.now() หลังจากนั้น หน้าจอ OLED จะถูกล้างและส่วนประกอบของเวลาจะแสดงในรูปแบบนาฬิกาดิจิทัล คุณยังสามารถแก้ไขโค้ดเพื่อปรับรูปแบบวันที่และเวลาได้

เมื่อโค้ดถูกอัพโหลดไปยังบอร์ดของคุณ คุณจะได้รับเวลาปัจจุบันบนหน้าจอ OLED

บันทึก: รหัสข้างต้นใช้ 0x3C ที่อยู่ I2C สำหรับ OLED นี่คือที่อยู่ I2C ทั่วไปที่มีอยู่บนจอแสดงผล OLED SSD1306 หากคุณต้องการค้นหาที่อยู่ I2C สำหรับหน้าจอ OLED ของคุณ คุณสามารถเรียกใช้ รหัสสแกนเนอร์ I2C .

บทสรุป

DS3231 เป็นเซ็นเซอร์ RTC ที่สามารถใช้ในการบอกเวลาได้ มีแบตเตอรี่สำรองที่สามารถรักษาเวลาได้อย่างแม่นยำแม้ว่าบอร์ดไมโครคอนโทรลเลอร์ของคุณจะปิดอยู่ก็ตาม หากต้องการเชื่อมต่อ ESP2 กับ DS3231 คุณต้องติดตั้งไลบรารี RTClib ใน Arduino IDE ของคุณ หลังจากนั้นคุณต้องเชื่อมต่อโมดูล RTC ผ่านโปรโตคอล I2C โดยใช้พินดิจิทัลของ ESP32 เมื่อเชื่อมต่อแล้ว เพียงอัปโหลดโค้ดและปรับเวลา ตอนนี้เซ็นเซอร์ RTC จะรักษาเวลา และคุณสามารถอ่านได้บนจอภาพอนุกรมของคุณเกี่ยวกับโครงการที่อิงตามเวลาในการออกแบบ