สารบัญ:
- ขั้นตอนที่ 1: เชื่อมต่อโมดูลของคุณกับ Arduino
- ขั้นตอนที่ 2: การอ่านและการเขียนเวลาจากโมดูล RTC ของคุณ
- ขั้นตอนที่ 3:
วีดีโอ: การใช้โมดูลนาฬิกาเรียลไทม์ DS1307 และ DS3231 กับ Arduino: 3 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:04
เราได้รับคำขอเกี่ยวกับวิธีการใช้โมดูลนาฬิกาเรียลไทม์ 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 - ทุกอย่างสำหรับผู้ผลิตและผู้ที่ชื่นชอบอุปกรณ์อิเล็กทรอนิกส์ พร้อมบริการจัดส่งฟรีทั่วโลก
แนะนำ:
การเชื่อมต่อเซ็นเซอร์อุณหภูมิ DS18B20 กับ Arduino และ ESP8266: 8 ขั้นตอน
การเชื่อมต่อเซ็นเซอร์อุณหภูมิ DS18B20 กับ Arduino และ ESP8266: ว่าไงพวก! Akarsh จาก CETech วันนี้เราจะเพิ่ม Sensor ใหม่ให้กับคลังแสงของเราที่รู้จักกันในชื่อ DS18B20 Temperature Sensor เป็นเซ็นเซอร์อุณหภูมิคล้ายกับ DHT11 แต่มีชุดการใช้งานที่แตกต่างกัน เราจะเปรียบเทียบว่า
การเปรียบเทียบ LV-MaxSonar-EZ และ HC-SR04 Sonar Range Finders กับ Arduino: 20 ขั้นตอน (พร้อมรูปภาพ)
การเปรียบเทียบ LV-MaxSonar-EZ และ HC-SR04 Sonar Range Finders กับ Arduino: ฉันพบว่าหลายโครงการ (โดยเฉพาะหุ่นยนต์) ต้องการหรือได้รับประโยชน์จากการวัดระยะทางไปยังวัตถุในแบบเรียลไทม์ ตัวค้นหาช่วงโซนาร์มีราคาไม่แพงนักและสามารถเชื่อมต่อกับไมโครคอนโทรลเลอร์เช่น Arduino ได้อย่างง่ายดาย นี้ใน
การใช้ ESP8266 กับ Arduino และ Blynk: 4 ขั้นตอน
การใช้ ESP8266 กับ Arduino และ Blynk: เชื่อมต่อ Arduino Mega ของคุณกับแอป blynk โดยใช้ espp8266 shield
อีกหนึ่งคำแนะนำในการใช้ DIYMall RFID-RC522 และ Nokia LCD5110 กับ Arduino: 8 ขั้นตอน (พร้อมรูปภาพ)
อีกหนึ่งคำแนะนำในการใช้ DIYMall RFID-RC522 และ Nokia LCD5110 กับ Arduino: เหตุใดฉันจึงรู้สึกว่าจำเป็นต้องสร้างคำแนะนำอื่นสำหรับ DIYMall RFID-RC522 และ Nokia LCD5110 เพื่อบอกความจริงกับคุณว่าฉันกำลังทำงานกับ Proof of Concept เมื่อปีที่แล้วโดยใช้อุปกรณ์ทั้งสองนี้และอย่างใด "วางผิดที่"
การใช้ Dot Matrix LED กับ Arduino และ Shift Register: 5 ขั้นตอน
การใช้ Dot Matrix LED กับ Arduino และ Shift Register: Siemens DLO7135 Dot matrix LED เป็นออปโตอิเล็กทรอนิกส์ชิ้นหนึ่งที่น่าทึ่ง มันถูกเรียกเก็บเงินเป็น 5x7 Dot Matrix Intelligent Display (r) พร้อมหน่วยความจำ/ตัวถอดรหัส/ไดรเวอร์ นอกจากหน่วยความจำนั้นแล้ว ยังมีจอแสดงผล ASCII 96 อักขระที่ตั้งค่าบนและล่าง