Trong một số dự án, cần phải có bằng chứng về thời gian, giờ hoặc ngày. Cho dù do nhu cầu thực hiện các chức năng nhất định dựa trên thời gian, để duy trì lịch sự kiện hoặc đăng ký, để giữ thời gian trong một hệ thống hay đơn giản là để tạo đồng hồ kỹ thuật số với Arduino. Với DS3231 bạn có thể lấy nó, một cái khác trong số thành phần mà chúng tôi thêm vào danh sách.
DS3231 là mô-đun bạn đang tìm kiếm và tại đây bạn sẽ tìm thấy mọi thứ bạn cần để kiểm soát nó và tôi cũng sẽ chỉ cho bạn một ví dụ về cách tích hợp nó với Arduino với một ví dụ thực tế ...
DS3231 là gì?
Trước hết, bạn nên biết những gì RTC (Đồng hồ thời gian thực), hoặc đồng hồ thời gian thực. Những con chip này rất thường xuyên xuất hiện trong vô số ứng dụng, trên thực tế, PC của bạn có một trong số chúng trên bo mạch chủ của bạn và nó cũng được cung cấp bởi Pin CR2032 cũng thế. Nó là thứ duy trì thời gian và cấu hình trong BIOS / UEFI và từ đó hệ điều hành lấy nó khi khởi động đúng giờ (mặc dù hiện nay, với Internet, đồng bộ hóa với máy chủ có thể được sử dụng để có độ chính xác cao hơn, nhưng điều này là một câu chuyện khác…).
Những gì RTC làm là thu được các phép đo thời gian, đơn giản vậy thôi. Sự khác biệt so với các loại đồng hồ điện tử khác là chúng chỉ đơn giản là đo thời gianvà nó làm như vậy bằng cách đếm các xung tín hiệu đồng hồ, biết tần số và chu kỳ của nó. Ngoài thời gian, RTC cũng cho phép bạn giữ một tài khoản ngày, tuần, tháng và năm. Đó là, ngày đầy đủ ...
Để có thể thực hiện được điều này, RTC phải đi kèm với Xtal hoặc tinh thể thạch anh cái này sẽ hoạt động như một bộ cộng hưởng, một bộ cung cấp tần số. Ngoài ra, bạn cần mạch điện tử có khả năng đếm và lưu trữ ngày trong bộ nhớ. Mạch phải có khả năng đếm giây, phút, giờ, ngày, tuần, tháng và năm.
Đó bộ nhớ dễ bay hơiĐó là lý do tại sao nó cần pin, để có năng lượng liên tục. Nếu không có pin hoặc hết pin sẽ bị xóa ... Đó là điều xảy ra với PC khi hết pin, chúng báo thời gian không chính xác. Nếu bạn định cấu hình nó khi PC đang bật, thời gian sẽ được giữ nguyên, vì RTC đang được cấp nguồn, nhưng trong quá trình, nó sẽ tắt khi cần pin đó ...
Đối với các dự án DIY, các nhà sản xuất thường sử dụng hai chip RTC phổ biến, đó là DS1307 và DS3231. Cả hai đều được chế tạo bởi Maxim (trước đây là Dallas Semiconductor), và DS3231 là chính xác hơn trong số hai loại, vì nó không bị ảnh hưởng bởi sự thay đổi nhiệt độ như trước đây. Do đó, nó không dao động quá nhiều tùy thuộc vào nhiệt độ, và giữ thời gian chính xác hơn.
DS3231 không phải là nó không bị ảnh hưởng bởi các biến thể, mà là nó có hệ thống đo và bù nhiệt độ tích hợp để đảm bảo độ chính xác 2ppm, tương đương với thời gian trễ khoảng 172ms một ngày, tức là nhiều nhất là hơn 1 giây một tuần. Và trong thực tế, chúng thường chỉ thay đổi 1 hoặc 2 giây mỗi tháng.
Đối với con đường giao tiếp với RTC DS3131 để lấy các giá trị ngày mà nó nhận được, nó được thực hiện bởi Xe buýt I2C. Và đối với nguồn điện, bạn có thể sử dụng 2.3 đến 5.5v cho DS3231, thấp hơn một chút so với 4.5 đến 5.5v cho DS1307, vì vậy nó có thể tiết kiệm năng lượng hơn và kéo dài thời lượng pin.
Ngoài ra, bạn nên biết rằng các mô-đun này thường có EEPROM bổ sung AT24C32 để lưu trữ một số bản ghi và các phép đo trước đó, điều này khá thực tế.
ứng dụng
Đối với các ứng dụng, tôi đã đề cập đến một số, chẳng hạn như triển khai đồng hồ với Arduino, để tạo một hệ thống hoạt động dựa trên Thời gian Dù sao đi nữa, để giữ thời gian trên thiết bị như PC và nhiều thiết bị và đồ dùng điện tử khác có thời gian, v.v.
Cũng có thể được sử dụng trong dự án để tạo bộ hẹn giờ cho hệ thống chiếu sáng, tưới tiêu, bộ ghi dữ liệu, v.v. Các ứng dụng có thể là nhiều nhất ...
Mua RTC DS3231
Các mô-đun DS3131 là giá rẻ, và bạn có thể tìm thấy nó ở một số cửa hàng điện tử chuyên dụng hoặc trong các cửa hàng lớn như eBay, AliExpress, Amazon, v.v. Nếu bạn quan tâm đến việc có một cái, đây là một số đề xuất:
- Mua DS3231
- Không tìm thấy sản phẩm.
Tích hợp Arduino DS3231
Nếu bạn muốn tích hợp DS3231 của bạn với bảng Arduino của bạn và bắt đầu tạo các dự án "hẹn giờ", trước tiên bạn phải thực hiện các kết nối thích hợp. Để có thể kết nối nó, nó đơn giản như sau:
- Chân SLC của bảng DS3231 phải được kết nối với A5 của Arduino UNO.
- SDA của DS3231 được kết nối với A4 của Arduino.
- Vcc từ mô-đun sẽ chuyển đến 5V từ Arduino.
- GND sang GND.
Bây giờ bạn đã kết nối hệ thống, việc tiếp theo là viết mã nguồn phác thảo để lập trình nó. Bạn có thể sửa đổi mã và điều chỉnh chúng theo nhu cầu của mình, nhưng bạn có thể bắt đầu bằng cách chỉ cần lấy ngày từ RTC DS3231 được kết nối với 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 }
Và để sử dụng ngày RTC để lên lịch một số công việc, chẳng hạn như để bật hoặc tắt đèn, để tưới nước tự động hoặc để báo động kêu, v.v. Hãy nhớ rằng để xử lý các thiết bị điện áp cao hơn, bạn có thể sử dụng bóng bán dẫn hoặc giải thích:
#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); }