ในบางโครงการจำเป็นต้องมีหลักฐานเวลาชั่วโมงหรือวันที่ ไม่ว่าจะเป็นเพราะความจำเป็นในการทำหน้าที่บางอย่างตามเวลาเพื่อรักษาปฏิทินของกิจกรรมหรือการลงทะเบียนเพื่อรักษาเวลาในระบบหรือเพียงแค่สร้างนาฬิกาดิจิทัล กับ Arduino. กับ DS3231 คุณจะได้รับมันอีกอย่างหนึ่งของ ส่วนประกอบ ที่เราเพิ่มลงในรายการ
DS3231 เป็นโมดูลที่คุณกำลังมองหาและที่นี่คุณจะพบทุกสิ่งที่คุณต้องการสำหรับการควบคุมและฉันจะแสดงตัวอย่างวิธีการ รวมเข้ากับ Arduino พร้อมตัวอย่างภาคปฏิบัติ ...
DS3231 คืออะไร
ก่อนอื่นคุณควรรู้ว่าก RTC (นาฬิกาตามเวลาจริง)หรือนาฬิกาตามเวลาจริง ชิปเหล่านี้มักใช้ในแอพพลิเคชั่นมากมายจริงๆแล้วพีซีของคุณมีหนึ่งในนั้นบนเมนบอร์ดของคุณและยังใช้พลังงานจาก แบตเตอรี่ CR2032 ด้วย. เป็นระบบที่รักษาเวลาและการกำหนดค่าใน BIOS / UEFI และจากที่ระบบปฏิบัติการใช้เมื่อบูตให้ตรงเวลา (แม้ว่าตอนนี้ด้วยอินเทอร์เน็ตการซิงโครไนซ์กับเซิร์ฟเวอร์สามารถใช้เพื่อความแม่นยำยิ่งขึ้น เป็นอีกเรื่อง…).
สิ่งที่ RTC ทำคือได้รับการวัดเวลาซึ่งง่ายมาก ความแตกต่างจากนาฬิกาอิเล็กทรอนิกส์ประเภทอื่น ๆ ก็คือ วัดเวลาและทำได้โดยการนับพัลส์สัญญาณนาฬิกาโดยรู้ความถี่และช่วงเวลา นอกจากเวลาแล้ว RTC ยังช่วยให้คุณสามารถบันทึกวันสัปดาห์เดือนและปีได้อีกด้วย นั่นคือวันที่เต็ม ...
เพื่อให้เป็นไปได้ RTC จะต้องมาพร้อมกับไฟล์ Xtal หรือโป่งข่าม ซึ่งจะทำหน้าที่เป็นตัวสะท้อนเสียงที่ให้ความถี่ นอกจากนี้คุณต้องมีวงจรอิเล็กทรอนิกส์ที่สามารถนับและจัดเก็บวันที่ไว้ในหน่วยความจำได้ วงจรต้องสามารถนับวินาทีนาทีชั่วโมงวันสัปดาห์เดือนและปี
อีเอสเอ หน่วยความจำมีความผันผวนนั่นคือเหตุผลที่ต้องใช้แบตเตอรี่เพื่อให้มีพลังงานคงที่ หากคุณไม่มีแบตเตอรี่หรือแบตเตอรี่หมดแบตเตอรี่จะถูกลบ ... นั่นคือสิ่งที่เกิดขึ้นกับพีซีเมื่อแบตเตอรี่หมดแสดงเวลาที่ไม่ถูกต้อง หากคุณกำหนดค่าในขณะที่พีซีเปิดอยู่เวลาจะถูกเก็บไว้เนื่องจากกำลังขับเคลื่อน RTC แต่อยู่ในระหว่างกระบวนการที่ปิดอยู่เมื่อจำเป็นต้องใช้แบตเตอรี่ ...
สำหรับโครงการ DIY ผู้ผลิตมักใช้ชิป RTC ทั่วไปสองตัวซึ่งก็คือไฟล์ DS1307 และ DS3231. ทั้งสองผลิตโดย Maxim (เดิมชื่อ Dallas Semiconductor) และ DS3231 มีความแม่นยำมากกว่าของทั้งสองเนื่องจากไม่ได้รับผลกระทบจากการเปลี่ยนแปลงของอุณหภูมิเหมือนในอดีต ดังนั้นจึงไม่ผันผวนมากนักขึ้นอยู่กับอุณหภูมิและช่วยให้เวลาแม่นยำยิ่งขึ้น
DS3231 ไม่ใช่ว่าจะไม่ได้รับผลกระทบจากการเปลี่ยนแปลง แต่มีระบบการวัดอุณหภูมิและการชดเชยในตัวเพื่อให้แน่ใจว่ามีความแม่นยำ 2ppm ซึ่งจะเทียบเท่ากับ เวลาล่าช้า ประมาณ 172 มิลลิวินาทีต่อวันนั่นคืออย่างน้อย 1 วินาทีต่อสัปดาห์ และในทางปฏิบัติมักจะแตกต่างกันเพียง 1 หรือ 2 วินาทีต่อเดือน
สำหรับทาง สื่อสารกับ RTC DS3131 เพื่อรับค่าวันที่ที่จะได้รับทำได้โดย บัส I2C. และสำหรับพลังงานคุณสามารถใช้ 2.3 ถึง 5.5v สำหรับ DS3231 ซึ่งค่อนข้างต่ำกว่า 4.5 ถึง 5.5v สำหรับ DS1307 ดังนั้นจึงสามารถประหยัดพลังงานได้มากกว่าและทำให้แบตเตอรี่ใช้งานได้นานขึ้น
นอกจากนี้คุณควรทราบว่าโมดูลเหล่านี้มักจะมีไฟล์ EEPROM AT24C32 เพิ่มเติม เพื่อจัดเก็บบันทึกและการวัดก่อนหน้านี้ซึ่งค่อนข้างใช้งานได้จริง
การใช้งาน
เกี่ยวกับแอปพลิเคชันฉันได้กล่าวถึงบางส่วนแล้วเช่นการใช้นาฬิกากับ Arduino เพื่อสร้างระบบที่ทำหน้าที่ตาม เวลา อย่างไรก็ตามเพื่อรักษาเวลาให้กับอุปกรณ์เช่นพีซีและอุปกรณ์อิเล็กทรอนิกส์และเครื่องใช้ไฟฟ้าอื่น ๆ อีกมากมายที่มีเวลา ฯลฯ
ยังสามารถใช้ใน โครงการ เพื่อสร้างตัวจับเวลาสำหรับระบบแสงสว่างระบบชลประทานเครื่องบันทึกข้อมูล ฯลฯ แอพพลิเคชั่นได้มากมายที่สุด ...
ซื้อ RTC DS3231
โมดูล DS3131 ราคาถูกและคุณจะพบได้ในร้านขายเครื่องใช้ไฟฟ้าเฉพาะบางแห่งหรือในร้านค้าขนาดใหญ่เช่น eBay, AliExpress, Amazon เป็นต้น หากคุณสนใจที่จะมีคำแนะนำต่อไปนี้:
- ซื้อ DS3231
- ผลิตภัณฑ์ที่ไม่พบ
การรวม DS3231 Arduino
ถ้าคุณต้องการ รวม DS3231 ของคุณเข้ากับบอร์ด Arduino ของคุณ และเริ่มสร้างโครงการที่ "หมดเวลา" ก่อนอื่นคุณต้องทำการเชื่อมต่อที่เหมาะสม เพื่อให้สามารถเชื่อมต่อได้ทำได้ง่ายๆดังนี้:
- ขา SLC ของบอร์ด DS3231 ต้องเชื่อมต่อกับ A5 ของคุณ Arduino UNO.
- SDA ของ DS3231 เชื่อมต่อกับ A4 ของ Arduino
- Vcc จากโมดูลจะไปที่ 5V จาก Arduino
- GND เป็น GND
ตอนนี้คุณได้เชื่อมต่อระบบแล้วสิ่งต่อไปคือการเขียนไฟล์ ร่างซอร์สโค้ด เพื่อตั้งโปรแกรม คุณสามารถแก้ไขรหัสและปรับให้เข้ากับความต้องการของคุณได้ แต่คุณสามารถเริ่มต้นได้เพียงแค่รับวันที่จาก RTC DS3231 ที่เชื่อมต่อกับ Arduino:
#include <Wire.h> #include "RTClib.h" // RTC_DS1307 rtc; RTC_DS3231 rtc; String daysOfTheWeek[7] = { "Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado" }; String monthsNames[12] = { "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre" }; void setup() { Serial.begin(9600); delay(1000); if (!rtc.begin()) { Serial.println(F("No se encuentra el RTC")); while (1); } // Si se ha perdido el suministro eléctrico, fijar fecha y hora if (rtc.lostPower()) { // Fijar a fecha y hora (poner la de compilación del sketch) rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Fijar a fecha y hora específica. En este ejemplo el 2021-01-01 a las 00:00:00 // rtc.adjust(DateTime(2020, 1, 1, 0, 0, 0)); } } //Imprimir completa obtenida la fecha en decimal void printDate(DateTime date) { Serial.print(date.year(), DEC); Serial.print('/'); Serial.print(date.month(), DEC); Serial.print('/'); Serial.print(date.day(), DEC); Serial.print(" ("); Serial.print(daysOfTheWeek[date.dayOfTheWeek()]); Serial.print(") "); Serial.print(date.hour(), DEC); Serial.print(':'); Serial.print(date.minute(), DEC); Serial.print(':'); Serial.print(date.second(), DEC); Serial.println(); } void loop() { // Obtener fecha actual y mostrar por Serial DateTime now = rtc.now(); printDate(now); delay(3000); //Espera 3 segundos }
และเพื่อที่จะใช้วันที่ RTC เพื่อ กำหนดเวลางานบางอย่างเช่นการเปิดหรือปิดไฟสำหรับการรดน้ำอัตโนมัติหรือเพื่อให้เสียงปลุกเป็นต้น โปรดจำไว้ว่าในการจัดการอุปกรณ์ไฟฟ้าแรงสูงคุณสามารถใช้ทรานซิสเตอร์หรือ รีเลย์:
#include <Wire.h> #include "RTClib.h" const int outputPin = LED_BUILTIN; bool state = false; // RTC_DS1307 rtc; RTC_DS3231 rtc; void setup() { Serial.begin(9600); delay(1000); if (!rtc.begin()) { Serial.println(F("Couldn't find RTC")); while (1); } if (rtc.lostPower()) { rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); } } // Se comprueba si está programado el encendido bool isScheduledON(DateTime date) { int weekDay = date.dayOfTheWeek(); float hours = date.hour() + date.minute() / 60.0; // Configuración de horas de 08:30 a 9:30 y de 22:00 a 23:00 (usando decimal) bool hourCondition = (hours > 8.50 && hours < 9.50) || (hours > 22.00 && hours < 23.00); // Configuración del día Lunes, Sábado y Domingo con números (recuerda que en inglés comienza la semana en Domingo=0, Lunes=1,... bool dayCondition = (weekDay == 1 || weekDay == 6 || weekDay == 0); if (hourCondition && dayCondition) { return true; } return false; } void loop() { DateTime now = rtc.now(); if (state == false && isScheduledON(now)) // Apagado { digitalWrite(outputPin, HIGH); state = true; Serial.print("Activado"); } else if (state == true && !isScheduledON(now)) // Encendido { digitalWrite(outputPin, LOW); state = false; Serial.print("Desactivado"); } delay(3000); }