สารบัญ:

การใช้โมดูลนาฬิกาเรียลไทม์ DS1307 และ DS3231 กับ Arduino: 3 ขั้นตอน
การใช้โมดูลนาฬิกาเรียลไทม์ DS1307 และ DS3231 กับ Arduino: 3 ขั้นตอน

วีดีโอ: การใช้โมดูลนาฬิกาเรียลไทม์ DS1307 และ DS3231 กับ Arduino: 3 ขั้นตอน

วีดีโอ: การใช้โมดูลนาฬิกาเรียลไทม์ DS1307 และ DS3231 กับ Arduino: 3 ขั้นตอน
วีดีโอ: EP.29 โมดูลนาฬิกา ( RTC ) | Nursery Arduino 2024, พฤศจิกายน
Anonim
การใช้โมดูลนาฬิกาเรียลไทม์ DS1307 และ DS3231 กับ Arduino
การใช้โมดูลนาฬิกาเรียลไทม์ DS1307 และ DS3231 กับ Arduino
การใช้โมดูลนาฬิกาเรียลไทม์ DS1307 และ DS3231 กับ Arduino
การใช้โมดูลนาฬิกาเรียลไทม์ DS1307 และ DS3231 กับ Arduino

เราได้รับคำขอเกี่ยวกับวิธีการใช้โมดูลนาฬิกาเรียลไทม์ DS1307 และ DS3231 กับ Arduino จากแหล่งต่างๆ อยู่เสมอ ดังนั้นนี่จึงเป็นบทช่วยสอนส่วนแรกในสองส่วนเกี่ยวกับวิธีการใช้งาน สำหรับบทช่วยสอน Arduino นี้ เรามีโมดูลนาฬิกาแบบเรียลไทม์สองโมดูล หนึ่งโมดูลใช้ Maxim DS1307 (โมดูลสี่เหลี่ยมจัตุรัส) และ DS3231 (โมดูลสี่เหลี่ยม)

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

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

เป็นความคิดที่ดีที่จะซื้อแบตเตอรี่ CR2032 ใหม่และใส่ลงในโมดูล นอกจากการติดตามเวลาและวันที่แล้ว โมดูลเหล่านี้ยังมี EEPROM ขนาดเล็ก ฟังก์ชันการเตือน (DS3231 เท่านั้น) และความสามารถในการสร้างคลื่นสี่เหลี่ยมของความถี่ต่างๆ ซึ่งทั้งหมดนี้จะเป็นหัวข้อของบทช่วยสอนที่สอง

ขั้นตอนที่ 1: เชื่อมต่อโมดูลของคุณกับ Arduino

ทั้งสองโมดูลใช้บัส I2C ซึ่งทำให้การเชื่อมต่อทำได้ง่ายมาก

ก่อนอื่น คุณจะต้องระบุพินบน Arduino หรือบอร์ดที่เข้ากันได้ซึ่งใช้สำหรับบัส I2C ซึ่งเรียกว่า SDA (หรือข้อมูล) และ SCL (หรือนาฬิกา) บน Arduino Uno หรือบอร์ดที่เข้ากันได้ พินเหล่านี้คือ A4 และ A5 สำหรับข้อมูลและนาฬิกา บน Arduino Mega พินคือ D20 และ D21 สำหรับข้อมูลและนาฬิกา และหากคุณใช้ Pro Mini ที่เข้ากันได้กับพินคือ A4 และ A5 สำหรับข้อมูลและนาฬิกาซึ่งขนานกับหมุดหลัก

โมดูล DS1307

หากคุณมีโมดูล DS1307 คุณจะต้องบัดกรีสายไฟเข้ากับบอร์ด หรือบัดกรีบนหมุดส่วนหัวแบบอินไลน์เพื่อให้คุณสามารถใช้สายจัมเปอร์ได้ จากนั้นเชื่อมต่อพิน SCL และ SDA กับ Arduino และพิน Vcc กับพิน 5V และ GND กับ GND

โมดูล DS3231

การเชื่อมต่อโมดูลนี้ทำได้ง่ายด้วยการติดตั้งหมุดส่วนหัวบนบอร์ดที่โรงงาน คุณสามารถเรียกใช้สายจัมเปอร์อีกครั้งจาก SCL และ SDA ไปยัง Arduino และอีกครั้งจากพิน Vcc และ GND ของโมดูลไปยัง 5V หรือ 3.3. V และ GND ของบอร์ดของคุณ อย่างไรก็ตามสิ่งเหล่านี้ถูกทำซ้ำในอีกด้านหนึ่งสำหรับการบัดกรีสายไฟของคุณเอง โมดูลทั้งสองนี้มีตัวต้านทานแบบดึงขึ้นที่จำเป็น ดังนั้นคุณไม่จำเป็นต้องเพิ่มตัวต้านทานของคุณเอง เช่นเดียวกับอุปกรณ์ทั้งหมดที่เชื่อมต่อกับบัส I2C ให้พยายามรักษาความยาวของสาย SDA และ SCL ให้น้อยที่สุด

ขั้นตอนที่ 2: การอ่านและการเขียนเวลาจากโมดูล RTC ของคุณ

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

#include "Wire.h"#define DS3231_I2C_ADDRESS 0x68 // แปลงเลขทศนิยมปกติเป็นเลขฐานสองไบต์ decToBcd (ไบต์ val) { return ((val/10 * 16) + (val% 10)); } // แปลงเลขฐานสองเลขฐานสองเป็นเลขฐานสองเป็นเลขฐานสิบปกติ byte bcdToDec (byte val) { return ((val/16*10) + (val%16)); } การตั้งค่าเป็นโมฆะ () { Wire.begin(); Serial.begin(9600); // ตั้งเวลาเริ่มต้นที่นี่: // DS3231 วินาที นาที ชั่วโมง วัน วันที่ เดือน ปี // setDS3231time(30, 42, 21, 4, 26, 11, 14); } โมฆะ setDS3231time (ไบต์วินาที, ไบต์นาที, ไบต์ชั่วโมง, ไบต์ dayOfWeek, ไบต์ dayOfMonth, ไบต์เดือน, ไบต์ปี) {// ตั้งค่าข้อมูลเวลาและวันที่เป็น DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write(0); // ตั้งค่าอินพุตถัดไปเพื่อเริ่มต้นในวินาทีที่ลงทะเบียน Wire.write(decToBcd(วินาที)); // ตั้งค่าวินาที Wire.write(decToBcd(นาที)); // ตั้งค่านาที Wire.write(decToBcd(hour)); // ตั้งค่าชั่วโมง Wire.write(decToBcd(dayOfWeek)); // กำหนดวันของสัปดาห์ (1=วันอาทิตย์, 7=วันเสาร์) Wire.write(decToBcd(dayOfMonth)); // กำหนดวันที่ (1 ถึง 31) Wire.write(decToBcd(เดือน)); // กำหนดเดือน Wire.write(decToBcd(ปี)); // กำหนดปี (0 ถึง 99) Wire.endTransmission(); } เป็นโมฆะ readDS3231time (ไบต์ * วินาที ไบต์ * นาที ไบต์ * ชั่วโมง ไบต์ * วันในสัปดาห์ ไบต์ * วันของเดือน ไบต์ * เดือน ไบต์ * ปี) { Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write(0); // ตั้งค่าตัวชี้การลงทะเบียน DS3231 เป็น 00h Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // ขอข้อมูลจาก DS3231 เจ็ดไบต์โดยเริ่มจาก register 00h *second = bcdToDec(Wire.read() & 0x7f); *นาที = bcdToDec(Wire.read()); *ชั่วโมง = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *เดือน = bcdToDec(Wire.read()); *ปี = bcdToDec(Wire.read()); } โมฆะ displayTime () { ไบต์วินาที นาที ชั่วโมง วันในสัปดาห์ วันของเดือน เดือน ปี; // ดึงข้อมูลจาก DS3231 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // ส่งไปที่จอภาพอนุกรม Serial.print(ชั่วโมง, ธ.ค.); // แปลงตัวแปรไบต์เป็นเลขฐานสิบเมื่อแสดง Serial.print(":"); ถ้า (นาที<10) { Serial.print("0"); } Serial.print (นาที ธ.ค.); Serial.print(":"); ถ้า (วินาที <10) { Serial.print("0"); } Serial.print (วินาที ธ.ค.); Serial.print(" "); Serial.print (วันของเดือน ธ.ค.); Serial.print("/"); Serial.print (เดือน ธ.ค.); Serial.print("/"); Serial.print (ปี ธ.ค.); Serial.print(" วันในสัปดาห์: "); สวิตช์ (dayOfWeek) { กรณีที่ 1: Serial.println ("วันอาทิตย์"); หยุดพัก; กรณีที่ 2: Serial.println ("วันจันทร์"); หยุดพัก; กรณีที่ 3: Serial.println("วันอังคาร"); หยุดพัก; กรณีที่ 4: Serial.println("วันพุธ"); หยุดพัก; กรณีที่ 5: Serial.println("พฤหัสบดี"); หยุดพัก; กรณีที่ 6: Serial.println("วันศุกร์"); หยุดพัก; กรณีที่ 7: Serial.println("วันเสาร์"); หยุดพัก; } } วงเป็นโมฆะ () { displayTime (); // แสดงข้อมูลนาฬิกาตามเวลาจริงบน Serial Monitor ล่าช้า (1000); // ทุกวินาที }

อาจมีโค้ดจำนวนมาก แต่จะแบ่งออกเป็นส่วนต่างๆ ที่จัดการได้ดี

ขั้นแรกประกอบด้วยไลบรารี Wire ซึ่งใช้สำหรับการสื่อสารบัส I2C ตามด้วยการกำหนดที่อยู่บัสสำหรับ RTC เป็น 0x68 ตามด้วยฟังก์ชันสองฟังก์ชันที่แปลงตัวเลขทศนิยมเป็น BCD (ทศนิยมแบบไบนารี) และในทางกลับกัน สิ่งเหล่านี้จำเป็นเนื่องจาก RTC ICs ทำงานใน BCD ไม่ใช่ทศนิยม

ฟังก์ชัน setDS3231time() ใช้เพื่อตั้งค่านาฬิกา การใช้งานนั้นง่ายมาก แทรกค่าจากปีลงไปเป็นวินาทีอย่างง่ายๆ และ RTC จะเริ่มต้นจากเวลานั้น ตัวอย่างเช่น หากคุณต้องการตั้งค่าวันที่และเวลาต่อไปนี้ – วันพุธที่ 26 พฤศจิกายน 2014 และ 21:42 น. และ 30 วินาที – คุณจะใช้:

setDS3231time(30, 42, 21, 4, 26, 11, 14);

ขั้นตอนที่ 3:

โปรดทราบว่าเวลาถูกตั้งค่าโดยใช้เวลา 24 ชั่วโมง และพารามิเตอร์ที่สี่คือ "วันในสัปดาห์" ซึ่งอยู่ระหว่าง 1 ถึง 7 ซึ่งเป็นวันอาทิตย์ถึงวันเสาร์ตามลำดับ พารามิเตอร์เหล่านี้เป็นค่าไบต์หากคุณกำลังแทนที่ตัวแปรของคุณเอง

เมื่อคุณเรียกใช้ฟังก์ชันแล้ว ก็ควรที่จะนำหน้าด้วย // และอัปโหลดโค้ดของคุณอีกครั้ง ดังนั้นจะไม่รีเซ็ตเวลาเมื่อมีการหมุนเวียนพลังงานหรือรีเซ็ตไมโครคอนโทรลเลอร์ การอ่านเวลาจาก RTC ของคุณนั้นง่ายพอ ๆ กัน อันที่จริงสามารถติดตามกระบวนการได้อย่างเรียบร้อยภายในฟังก์ชัน displayTime() คุณจะต้องกำหนดตัวแปรเจ็ดไบต์เพื่อเก็บข้อมูลจาก RTC จากนั้นจึงแทรกตัวแปรเหล่านี้ในฟังก์ชัน readDS3231time() ตัวอย่างเช่น ถ้าตัวแปรของคุณคือ:

ไบต์วินาที นาที ชั่วโมง วันในสัปดาห์ วันของเดือน เดือน ปี;

… คุณจะรีเฟรชพวกเขาด้วยข้อมูลปัจจุบันจาก RTC โดยใช้:

readDS3232time(&วินาที &นาที &ชั่วโมง &วันในสัปดาห์ &วันของเดือน &เดือน &ปี);

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

เพียงเพื่อตรวจสอบว่าทุกอย่างใช้งานได้ ป้อนเวลาและวันที่ที่เหมาะสมลงในสเก็ตช์การสาธิต อัปโหลด แสดงความคิดเห็นเกี่ยวกับฟังก์ชัน setDS3231time() แล้วอัปโหลดอีกครั้ง จากนั้นเปิดจอภาพแบบอนุกรม และคุณควรจะได้รับการแสดงเวลาและวันที่ปัจจุบันที่กำลังทำงานอยู่

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

คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับ IC นาฬิกาตามเวลาจริงได้จากเว็บไซต์ของผู้ผลิต - DS1307 และ DS3231

โพสต์นี้มาถึงคุณโดย pmdway.com - ทุกอย่างสำหรับผู้ผลิตและผู้ที่ชื่นชอบอุปกรณ์อิเล็กทรอนิกส์ พร้อมบริการจัดส่งฟรีทั่วโลก

แนะนำ: