DS3231:Arduino的實時時鐘和日曆

DS3231

在某些項目中,有必要證明時間,小時或日期。 是否由於需要基於時間執行某些功能,維護事件日曆或註冊,將時間保留在系統中或只是創建數字時鐘而導致 與Arduino。 用 DS3231 你可以得到它,另一個 組件 我們添加到列表中。

DS3231是您正在尋找的模塊,在這裡您將找到控制它所需的一切,並且我還將向您展示一個示例,說明如何 與Arduino集成 舉一個實際的例子...

什麼是DS3231?

DS3231

首先,您應該知道 RTC(實時時鐘)或實時時鐘。 這些芯片在許多應用中都很常見,實際上,您的PC主板上有其中一個,並且還由一個 CR2032電池 還。 它可以在BIOS / UEFI中維護時間和配置,並在啟動時按時從操作系統中獲取時間和配置(儘管現在,通過Internet,與服務器的同步可以用於更高的精度,但這可以是另一個故事……)。

RTC所做​​的就是獲得時間測量,就這麼簡單。 與其他類型的電子手錶的區別在於它們只是 測量時間,它通過計數時鐘信號脈衝,知道其頻率和周期來做到這一點。 除了時間以外,RTC還允許您記錄幾天,幾週,幾個月和幾年。 也就是說,完整的日期...

為了使之成為可能,RTC必須隨附一個 Xtal或石英晶體 它將充當諧振器,提供頻率的諧振器。 此外,您需要能夠計算日期並將其存儲在內存中的電子電路。 該電路必須能夠計算秒,分鐘,小時,天,週,月和年。

歐空局 內存易失這就是為什麼它需要電池以保持恆定功率。 如果您沒有電池,或者電池用完了,它將被刪除……這就是PC電池用盡時會發生的錯誤時間。 如果您在PC開機時對其進行配置,則將保留時間,因為RTC處於通電狀態,但是它處於關閉電池的過程中,需要該電池時...

對於DIY項目,製造商通常使用兩種常見的RTC芯片,它們是 DS1307和DS3231。 兩者均由Maxim(前身為Dallas Semiconductor)製造,DS3231兩者中的精度更高,因為它不受溫度變化的影響要比前者大。 因此,它不會隨溫度波動太大,並且可以更精確地保持時間。

有時,由於溫度差異明顯,DS1307每天可能滯後1或2分鐘。 有些應用程序無法忍受的。

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 Arduino集成

Arduino IDE的屏幕截圖

如果你想 將您的DS3231與Arduino開發板集成 並開始創建“定時”項目,必須首先進行適當的連接。 要連接它,它很簡單:

  • DS3231板的SLC引腳必須連接到您計算機的A5 Arduino UNO.
  • DS3231的SDA連接到Arduino的A4。
  • 來自模塊的Vcc將從Arduino升至5V。
  • GND至GND。
記住要安裝庫以在您的Arduino IDE中使用RTC DS3231,否則代碼將無法工作...

現在您已經連接了系統,下一步是編寫 草圖源代碼 對其進行編程。 您可以修改代碼並使它們適應您的需要,但是您可以簡單地從連接到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);
}


成為第一個發表評論

發表您的評論

您的電子郵件地址將不會被發表。 必填字段標有 *

*

*

  1. 負責數據:MiguelÁngelGatón
  2. 數據用途:控制垃圾郵件,註釋管理。
  3. 合法性:您的同意
  4. 數據通訊:除非有法律義務,否則不會將數據傳達給第三方。
  5. 數據存儲:Occentus Networks(EU)託管的數據庫
  6. 權利:您可以隨時限制,恢復和刪除您的信息。