DS3231 : Arduino를위한 실시간 시계 및 달력

DS3231

일부 프로젝트에서는 시간, 시간 또는 날짜에 대한 증거가 필요합니다. 시간을 기반으로 특정 기능을 수행하거나, 이벤트 또는 등록 일정을 유지하거나, 시스템에 시간을 유지하거나, 단순히 디지털 시계를 만들어야하기 때문입니다. Arduino와 함께. 과 DS3231 당신은 그것을 얻을 수 있습니다. 구성 요소 목록에 추가합니다.

DS3231은 귀하가 찾고 있던 모듈입니다. 여기에서 제어에 필요한 모든 것을 찾을 수 있으며, 방법에 대한 예도 보여 드리겠습니다. Arduino와 통합 실용적인 예를 들어 ...

DS3231은 무엇입니까?

DS3231

우선, 당신은 무엇을 알아야 RTC (실시간 시계), 또는 실시간 시계. 이러한 칩은 여러 응용 프로그램에서 매우 자주 사용됩니다. 사실 PC에는 마더 보드에 이러한 칩이 있으며 CR2032 배터리 또한. BIOS / UEFI에서 시간과 구성을 유지하고 부팅 할 때 운영 체제가 시간을 가져 오는 데 사용됩니다 (이제 인터넷에서는 서버와의 동기화를 사용하여 정밀도를 높일 수 있지만 이는 또 다른 이야기입니다…).

RTC가하는 일은 간단하게 시간 측정을 얻는 것입니다. 다른 유형의 전자 시계와 다른 점은 시간을 재다, 클럭 신호 펄스를 계산하고 주파수와주기를 알면됩니다. 시간 외에도 RTC를 사용하면 일, 주, 월 및 연도를 계산할 수 있습니다. 즉, 전체 날짜 ...

이를 가능하게하려면 RTC에 Xtal 또는 수정 주파수를 제공하는 공진기 역할을합니다. 또한 날짜를 계산하고 메모리에 저장할 수있는 전자 회로가 필요합니다. 회로는 초, 분, 시간, 일, 주, 월 및 년을 계산할 수 있어야합니다.

메모리는 휘발성그렇기 때문에 일정한 전력을 유지하려면 배터리가 필요합니다. 배터리가 없거나 다 떨어지면 지워집니다. 배터리가 다 떨어지면 PC에 일어나는 일이 잘못된 시간을줍니다. PC가 켜져있는 동안 구성하면 RTC에 전원이 공급되고 있기 때문에 시간이 유지되지만 배터리가 필요할 때 꺼지는 프로세스 중입니다.

DIY 프로젝트의 경우 제작자는 일반적으로 두 개의 일반적인 RTC 칩을 사용합니다. DS1307 및 DS3231. 둘 다 Maxim (이전 Dallas Semiconductor)에서 제작했으며 DS3231은 온도 변화의 영향을받지 않기 때문에 둘 중 더 정확합니다. 따라서 온도에 따라 크게 변동하지 않고 시간을보다 정확하게 유지합니다.

때때로 눈에 띄는 온도 차이로 인해 DS1307은 하루에 1 분 또는 2 분 정도 지연 될 수 있습니다. 일부 응용 프로그램에서 견딜 수없는 것.

DS3231은 변동의 영향을받지 않는다는 것이 아니라 온도 측정 및 보상 시스템이 내장되어있어 2ppm의 정확도를 보장합니다. 시간 지연 하루에 약 172ms, 즉 최대 일주일에 1 초 이상입니다. 그리고 실제로는 일반적으로 한 달에 1 ~ 2 초만 변합니다.

길도 RTC와 통신 DS3131이 얻은 날짜 값을 얻으려면 I2C 버스. 그리고 전력의 경우 DS2.3의 경우 5.5 ~ 3231v를 사용할 수 있습니다. DS4.5의 경우 5.5 ~ 1307v보다 약간 낮은 DSXNUMX의 경우보다 에너지 효율적이고 배터리를 더 오래 사용할 수 있습니다.

또한 이러한 모듈에는 일반적으로 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 Ángel Gatón
  2. 데이터의 목적 : 스팸 제어, 댓글 관리.
  3. 합법성 : 귀하의 동의
  4. 데이터 전달 : 법적 의무에 의한 경우를 제외하고 데이터는 제 XNUMX 자에게 전달되지 않습니다.
  5. 데이터 저장소 : Occentus Networks (EU)에서 호스팅하는 데이터베이스
  6. 권리 : 귀하는 언제든지 귀하의 정보를 제한, 복구 및 삭제할 수 있습니다.