在某些項目中,有必要證明時間,小時或日期。 是否由於需要基於時間執行某些功能,維護事件日曆或註冊,將時間保留在系統中或只是創建數字時鐘而導致 與Arduino。 用 DS3231 你可以得到它,另一個 組件 我們添加到列表中。
DS3231是您正在尋找的模塊,在這裡您將找到控制它所需的一切,並且我還將向您展示一個示例,說明如何 與Arduino集成 舉一個實際的例子...
什麼是DS3231?
首先,您應該知道 RTC(實時時鐘)或實時時鐘。 這些芯片在許多應用中都很常見,實際上,您的PC主板上有其中一個,並且還由一個 CR2032電池 還。 它可以在BIOS / UEFI中維護時間和配置,並在啟動時按時從操作系統中獲取時間和配置(儘管現在,通過Internet,與服務器的同步可以用於更高的精度,但這可以是另一個故事……)。
RTC所做的就是獲得時間測量,就這麼簡單。 與其他類型的電子手錶的區別在於它們只是 測量時間,它通過計數時鐘信號脈衝,知道其頻率和周期來做到這一點。 除了時間以外,RTC還允許您記錄幾天,幾週,幾個月和幾年。 也就是說,完整的日期...
為了使之成為可能,RTC必須隨附一個 Xtal或石英晶體 它將充當諧振器,提供頻率的諧振器。 此外,您需要能夠計算日期並將其存儲在內存中的電子電路。 該電路必須能夠計算秒,分鐘,小時,天,週,月和年。
歐空局 內存易失這就是為什麼它需要電池以保持恆定功率。 如果您沒有電池,或者電池用完了,它將被刪除……這就是PC電池用盡時會發生的錯誤時間。 如果您在PC開機時對其進行配置,則將保留時間,因為RTC處於通電狀態,但是它處於關閉電池的過程中,需要該電池時...
對於DIY項目,製造商通常使用兩種常見的RTC芯片,它們是 DS1307和DS3231。 兩者均由Maxim(前身為Dallas Semiconductor)製造,DS3231兩者中的精度更高,因為它不受溫度變化的影響要比前者大。 因此,它不會隨溫度波動太大,並且可以更精確地保持時間。
DS3231並非不受變化的影響,而是具有內置的溫度測量和補償系統以確保2ppm的精度,這等效於 時差 每天約172毫秒,即每週最多不超過1秒。 實際上,它們通常每個月僅變化1或2秒。
至於方式 與RTC通訊 DS3131獲取它獲得的日期值,它是通過 I2C總線。 對於電源,DS2.3可以使用5.5至3231v,比DS4.5可以使用5.5至1307v更低,因此它可以提高能效並延長電池壽命。
另外,您應該知道這些模塊通常有一個 EEPROM 額外的AT24C32 存儲一些記錄和以前的測量值,這非常實用。
應用
至於應用程序,我已經提到過一些,例如用Arduino實現時鐘,以創建一個基於 時間 不管怎樣,要在有時間的設備(例如PC以及許多其他電子設備和電器)上花費時間。
也可以用在 項目 為照明,灌溉系統,數據記錄器等創建計時器應用程序可以是最多的...
購買RTC DS3231
模塊 DS3131便宜,您可以在一些專門的電子商店或大型商店中找到它,例如eBay,AliExpress,Amazon等。 如果您有興趣購買一個,這裡有一些建議:
- 購買DS3231
- 找不到產品。
DS3231 Arduino集成
如果你想 將您的DS3231與Arduino開發板集成 並開始創建“定時”項目,必須首先進行適當的連接。 要連接它,它很簡單:
- DS3231板的SLC引腳必須連接到您計算機的A5 Arduino UNO.
- DS3231的SDA連接到Arduino的A4。
- 來自模塊的Vcc將從Arduino升至5V。
- GND至GND。
現在您已經連接了系統,下一步是編寫 草圖源代碼 對其進行編程。 您可以修改代碼並使它們適應您的需要,但是您可以簡單地從連接到Arduino的RTC DS3231獲取日期開始:
#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); }