DS3231: นาฬิกาและปฏิทินแบบเรียลไทม์สำหรับ Arduino ของคุณ

DS3231

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

DS3231 เป็นโมดูลที่คุณกำลังมองหาและที่นี่คุณจะพบทุกสิ่งที่คุณต้องการสำหรับการควบคุมและฉันจะแสดงตัวอย่างวิธีการ รวมเข้ากับ Arduino พร้อมตัวอย่างภาคปฏิบัติ ...

DS3231 คืออะไร

DS3231

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

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

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

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

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

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

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 Arduino

ภาพหน้าจอของ Arduino IDE

ถ้าคุณต้องการ รวม DS3231 ของคุณเข้ากับบอร์ด Arduino ของคุณ และเริ่มสร้างโครงการที่ "หมดเวลา" ก่อนอื่นคุณต้องทำการเชื่อมต่อที่เหมาะสม เพื่อให้สามารถเชื่อมต่อได้ทำได้ง่ายๆดังนี้:

  • ขา SLC ของบอร์ด DS3231 ต้องเชื่อมต่อกับ A5 ของคุณ Arduino UNO.
  • SDA ของ DS3231 เชื่อมต่อกับ A4 ของ Arduino
  • Vcc จากโมดูลจะไปที่ 5V จาก Arduino
  • GND เป็น GND
อย่าลืมติดตั้งไลบรารีเพื่อใช้ RTC DS3231 ใน Arduino IDE ของคุณมิฉะนั้นรหัสจะไม่ทำงาน ...

ตอนนี้คุณได้เชื่อมต่อระบบแล้วสิ่งต่อไปคือการเขียนไฟล์ ร่างซอร์สโค้ด เพื่อตั้งโปรแกรม คุณสามารถแก้ไขรหัสและปรับให้เข้ากับความต้องการของคุณได้ แต่คุณสามารถเริ่มต้นได้เพียงแค่รับวันที่จาก 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);
}


เป็นคนแรกที่จะแสดงความคิดเห็น

แสดงความคิดเห็นของคุณ

อีเมล์ของคุณจะไม่ถูกเผยแพร่ ช่องที่ต้องการถูกทำเครื่องหมายด้วย *

*

*

  1. ผู้รับผิดชอบข้อมูล: Miguel ÁngelGatón
  2. วัตถุประสงค์ของข้อมูล: ควบคุมสแปมการจัดการความคิดเห็น
  3. ถูกต้องตามกฎหมาย: ความยินยอมของคุณ
  4. การสื่อสารข้อมูล: ข้อมูลจะไม่ถูกสื่อสารไปยังบุคคลที่สามยกเว้นตามข้อผูกพันทางกฎหมาย
  5. การจัดเก็บข้อมูล: ฐานข้อมูลที่โฮสต์โดย Occentus Networks (EU)
  6. สิทธิ์: คุณสามารถ จำกัด กู้คืนและลบข้อมูลของคุณได้ตลอดเวลา