guy-l
Published © GPL3+

Arduino Real Time Clock (RTC) Setter

A simple setup using an Arduino Nano and an LCD Keypad Shield to set the date, time and alarms for a DS3231 Real Time Clock (RTC).

BeginnerFull instructions provided12,465
Arduino Real Time Clock (RTC) Setter

Things used in this project

Story

Read more

Custom parts and enclosures

Holder STL File

Holder STL File

Panel STL File

Panel STL File

Schematics

Circuit

The circuit for the finished item.
Note: Pin 10 was NOT connected as it showed as a bad circuit when tested - this is a common issue with cheaper generic shields

Code

DS3231_Set_Time

Arduino
Use an LCD Keypad Shield to set up and DS3231 RTC
/*
DS3231_set_time.pde
Guy Lowndes
2020-12-18

Information taken from DS3231_set and DS3231_test by Eric Ayars 4/11

Uses an LCD with keypad to set the time for a DS3231 RTC

uses code for the buttons from https://forum.arduino.cc/index.php?topic=354260.0 by Mark Bramwell, July 2010

Uses tips and tricks from https://www.baldengineer.com/arduino-lcd-display-tips.html

*/

#include <DS3231.h>
#include <Wire.h>
#include <LiquidCrystal.h>

DS3231 Clock;
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

/*****************************************************************************************************************/

// These are the ALARM Bits that can be used
// They need to be combined into a single value (see below)
// Found here: https://github.com/mlepard/ArduinoChicken/blob/master/roboCoop/alarmControl.ino
const byte ALRM1_MATCH_EVERY_SEC      = 0b1111;  // once a second
const byte ALRM1_MATCH_SEC            = 0b1110;  // when seconds match
const byte ALRM1_MATCH_MIN_SEC        = 0b1100;  // when minutes and seconds match
const byte ALRM1_MATCH_HR_MIN_SEC     = 0b1000;  // when hours, minutes, and seconds match
const byte ALRM1_MATCH_DY_HR_MIN_SEC  = 0b0000;  // when hours, minutes, and seconds match

const byte ALRM2_ONCE_PER_MIN         = 0b111;   // once per minute (00 seconds of every minute)
const byte ALRM2_MATCH_MIN            = 0b110;   // when minutes match
const byte ALRM2_MATCH_HR_MIN         = 0b100;   // when hours and minutes match

/*****************************************************************************************************************/

// define some values used by the menu controller
const  byte modeSHOWDATETIME = 0b0000;
const  byte modeSHOWALARM1 = 0b0001;
const  byte modeSHOWALARM2 = 0b0010;
const  byte modeSETDATE = 0b0011;
const  byte modeSETTIME = 0b0100;
const  byte modeSETALARM1ON = 0b0101;
const  byte modeSETALARM1 = 0b0110;
const  byte modeSETALARM1METHOD = 0b0111;
const  byte modeSETALARM2ON = 0b1000;
const  byte modeSETALARM2 = 0b1001;
const  byte modeSETALARM2METHOD = 0b1010;
byte currentMode = modeSHOWDATETIME;

// buffers for the display
char line0[21]; 
char line1[21];

// define some values used by the panel and buttons
byte lcd_key     = 0b000;
int adc_key_in  = 0;
const int btnRIGHT  =0b000;
const int btnUP     =0b001;
const int btnDOWN   =0b010;
const int btnLEFT   =0b011;
const int btnSELECT =0b100;
const int btnNONE   =0b101;
int bounceDelay;
byte oldKey = 0b000;

//Variables to control blinking
bool blinkNow=false;
int blinkInt=1;
int maxBlinkInt=3;
uint32_t blinkStart=0;
uint32_t blinkDelay=500;

/***************************************************************
 * Set up and Loop
 ***************************************************************/

void setup() {
	
	// Set the bounce delay
  bounceDelay=50;

  // Start the lcd and set the cursor
  lcd.begin(16,2);
  lcd.setCursor(0,0);

	// Start the I2C interface
	Wire.begin();
  
}

void loop() {

  //Set the menu item or display text for the user
  setMenu();

  // read the buttons
  lcd_key = read_LCD_buttons();  

  // check the blink counter isn't too high
  if (blinkInt > maxBlinkInt){blinkInt=maxBlinkInt;}

  // Set the current blink status
  if (currentMode>modeSHOWALARM2 && ((millis()-blinkStart)>blinkDelay)){
    blinkNow=!blinkNow;
    blinkStart=millis();
      } 
  else if (currentMode<=modeSHOWALARM2)
    {blinkNow=false;} 

  // check the key press against the previous key press to avoid issues from long key presses
  if (oldKey!=lcd_key) {
    // depending on which button was pushed, we perform an action
    switch (lcd_key)               
    {     
      case btnRIGHT:
      {
        oldKey = btnRIGHT;
        if (blinkInt<maxBlinkInt) {blinkInt+=1;}
        if (currentMode==modeSHOWDATETIME){currentMode=modeSHOWALARM1;} 
        else if (currentMode==modeSHOWALARM1){currentMode=modeSHOWALARM2;} 
        else if (currentMode==modeSHOWALARM2){currentMode=modeSHOWDATETIME;}
        delay(50);
        break;
      }
      case btnLEFT:
      {
        oldKey = btnLEFT;
        if (blinkInt>1) {blinkInt-=1;}
        delay(50);
        break;
      }
      case btnUP:
      {
        oldKey = btnUP;
        if (currentMode==modeSETDATE){
          if (blinkInt==1){increaseDate();}
          if (blinkInt==2){increaseMonth();}
          if (blinkInt==3){increaseYear();}
        }
        if (currentMode==modeSETTIME){
          if (blinkInt==1){increaseHour();}
          if (blinkInt==2){increaseMinute();}
        }
        if (currentMode==modeSETALARM1ON) {
          if (Clock.checkAlarmEnabled(1)) {AlarmOn(1, false);}
        }
        if (currentMode==modeSETALARM1) {
          if (blinkInt==1){changeAlarmDayOption(1);}
          if (blinkInt==2){ChangeAlarm(1, 1, 0, 0,0);}
          if (blinkInt==3){ChangeAlarm(1, 0, 1, 0,0);}
          if (blinkInt==4){ChangeAlarm(1, 0, 0, 1,0);}
          if (blinkInt==5){ChangeAlarm(1, 0, 0, 0,1);}
        }
        if (currentMode==modeSETALARM1METHOD) {
          changeAlarmMethod(1, 1);
        }
        if (currentMode==modeSETALARM2ON) {
          if (Clock.checkAlarmEnabled(2)) {AlarmOn(2, false);}
        }
        if (currentMode==modeSETALARM2) {
          if (blinkInt==1){changeAlarmDayOption(2);}
          if (blinkInt==2){ChangeAlarm(2, 1, 0, 0,0);}
          if (blinkInt==3){ChangeAlarm(2, 0, 1, 0,0);}
          if (blinkInt==4){ChangeAlarm(2, 0, 0, 1,0);}
          if (blinkInt==5){ChangeAlarm(2, 0, 0, 0,1);}
        }
        if (currentMode==modeSETALARM2METHOD) {
          changeAlarmMethod(2, 1);
        }
        delay(50);
        break;
      }
      case btnDOWN:
      {
        oldKey = btnDOWN;
        if (currentMode==modeSETDATE){
          if (blinkInt==1){decreaseDate();}
          if (blinkInt==2){decreaseMonth();}
          if (blinkInt==3){decreaseYear();}
        }
        if (currentMode==modeSETTIME){
          if (blinkInt==1){decreaseHour();}
          if (blinkInt==2){decreaseMinute();}
        }
        if (currentMode==modeSETALARM1ON) {
          if (!Clock.checkAlarmEnabled(1)) {AlarmOn(1, true);}
        }
        if (currentMode==modeSETALARM1) {
          if (blinkInt==1){changeAlarmDayOption(1);}
          if (blinkInt==2){ChangeAlarm(1, -1, 0, 0,0);}
          if (blinkInt==3){ChangeAlarm(1, 0, -1, 0,0);}
          if (blinkInt==4){ChangeAlarm(1, 0, 0, -1,0);}
          if (blinkInt==5){ChangeAlarm(1, 0, 0, 0,-1);}
        }
        if (currentMode==modeSETALARM1METHOD) {
          changeAlarmMethod(1, 0);
        }
        if (currentMode==modeSETALARM2ON) {
          if (!Clock.checkAlarmEnabled(2)) {AlarmOn(2, true);}
        }
        if (currentMode==modeSETALARM2) {
          if (blinkInt==1){changeAlarmDayOption(2);}
          if (blinkInt==2){ChangeAlarm(2, -1, 0, 0,0);}
          if (blinkInt==3){ChangeAlarm(2, 0, -1, 0,0);}
          if (blinkInt==4){ChangeAlarm(2, 0, 0, -1,0);}
          if (blinkInt==5){ChangeAlarm(2, 0, 0, 0,-1);}
        }
        if (currentMode==modeSETALARM2METHOD) {
          changeAlarmMethod(2, 0);
        }
        delay(50);
        break;
      }
      case btnSELECT:
      {
        blinkInt=1;
        oldKey = btnSELECT;
        if (currentMode==modeSHOWDATETIME){currentMode=modeSETDATE;} 
        else if (currentMode==modeSHOWALARM1){currentMode=modeSETALARM1ON;} 
        else if (currentMode==modeSHOWALARM2){currentMode=modeSETALARM2ON;} 
        else if (currentMode==modeSETDATE){currentMode=modeSETTIME;}
        else if (currentMode==modeSETTIME){currentMode=modeSHOWDATETIME;}
        else if (currentMode==modeSETALARM1ON && Clock.checkAlarmEnabled(1)){currentMode=modeSETALARM1;}
        else if (currentMode==modeSETALARM1ON && !Clock.checkAlarmEnabled(1)){currentMode=modeSHOWALARM1;}
        else if (currentMode==modeSETALARM1){currentMode=modeSETALARM1METHOD;}
        else if (currentMode==modeSETALARM1METHOD){currentMode=modeSHOWALARM1;}
        else if (currentMode==modeSETALARM2ON && Clock.checkAlarmEnabled(2)){currentMode=modeSETALARM2;}
        else if (currentMode==modeSETALARM2ON && !Clock.checkAlarmEnabled(2)){currentMode=modeSHOWALARM2;}
        else if (currentMode==modeSETALARM2){currentMode=modeSETALARM2METHOD;}
        else if (currentMode==modeSETALARM2METHOD){currentMode=modeSHOWALARM2;};
        break;
      }
      case btnNONE:
      {
        oldKey=btnNONE;
        break;
      }
    }
  }
}

/***************************************************************
 * Menu Control
 ***************************************************************/

void setMenu(){

  switch (currentMode)
  {
    case modeSHOWDATETIME:
    {
      showDateTime();
      break;
    }
    case modeSHOWALARM1:
    {
      showAlarm1();
      break;
    }
    case modeSHOWALARM2:
    {
      showAlarm2();
      break;
    }
    case modeSETDATE:
    {
      setDate();
      break;
    }
    case modeSETTIME:
    {
      setTime();
      break;
    }
    case modeSETALARM1ON:
    {
      setAlarmOnOff(1);
      break;
    }
    case modeSETALARM1:
    {
      setAlarm(1);
      break;
    }    
    case modeSETALARM1METHOD:
    {
      setAlarmMethod(1);
      break;
    }
    case modeSETALARM2ON:
    {
      setAlarmOnOff(2);
      break;
    }
    case modeSETALARM2:
    {
      setAlarm(2);
      break;
    }
    case modeSETALARM2METHOD:
    {
      setAlarmMethod(2);
      break;
    }
  }
}

/***************************************************************
 * Functions to read the buttons
 ***************************************************************/

// read the buttons
byte read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // read the value from the sensor
 // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
 // we add approx 50 to those values and check to see if we are close
 if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
 // For V1.1 us this threshold
 if (adc_key_in < 50)   return btnRIGHT;
 if (adc_key_in < 250)  return btnUP;
 if (adc_key_in < 450)  return btnDOWN;
 if (adc_key_in < 650)  return btnLEFT;
 if (adc_key_in < 850)  return btnSELECT; 
 return btnNONE;  // when all others fail, return this...
 
}

/***************************************************************
 * Functions to read and display the time
 ***************************************************************/

void displayText(String line0Text, String line1Text){
  lcd.setCursor(0,0);
  sprintf(line0,"%-21s", line0Text.c_str());
  lcd.print(String(line0));
  lcd.setCursor(0,1);
  sprintf(line1,"%-21s", line1Text.c_str());
  lcd.print(String(line1));  
}

String dateText() {  
  String result="Date: ";
  bool Century=false;
  if (blinkInt!=1 || blinkNow==false)
    {result+=twoDigitNumber(Clock.getDate());}
  else
    {result+="  ";}   
  result+="/";
  if (blinkInt!=2 || blinkNow==false)
    {result+=twoDigitNumber(Clock.getMonth(Century));}
  else
    {result+="  ";}  
  result+="/";
  if (blinkInt!=3 || blinkNow==false)
    {result+=twoDigitNumber(Clock.getYear());}
  else
    {result+="  ";}  
  return result;
}

String timeText() {  
  String result="Time: ";
  bool h12, PM;
  if (blinkInt!=1 || blinkNow==false)
    {result+=twoDigitNumber(Clock.getHour(h12, PM));}
  else
    {result+="  ";}   
  result+=":";
  if (blinkInt!=2 || blinkNow==false)
    {result+=twoDigitNumber(Clock.getMinute());}
  else
    {result+="  ";}
  result+=":";
  result+=twoDigitNumber(Clock.getSecond()); 
  return result;
}

void showDateTime(){  
  displayText(dateText(), timeText());
}

void showAlarm1(){

  byte ADay, AHour, AMinute, ASecond, ABits;
  bool ADy, A12h, Apm;

  String result1="Alarm1: ";
  if (Clock.checkAlarmEnabled(1)) {  
    Clock.getA1Time(ADay, AHour, AMinute, ASecond, ABits, ADy, A12h, Apm);
    if (blinkInt!=1 || blinkNow==false){
      if (ADy) {
        result1+="DOW  ";
      }
      else{
        result1+="DATE ";
      }      
    }  
    else {result1+="     ";}
    if (blinkInt!=2 || blinkNow==false){
      result1+=ADay; }      
    String result2="Alarm1: ";
    if (blinkInt!=3 || blinkNow==false){
      result2+=twoDigitNumber(AHour);}
    else {result2+="  ";}
    result2+=":";
    if (blinkInt!=4 || blinkNow==false){
      result2+=twoDigitNumber(AMinute);}
    else {result2+="  ";}
    result2+=":";
    if (blinkInt!=5 || blinkNow==false){
      result2+=twoDigitNumber(ASecond);  }
  
    displayText(result1, result2);
  }
  else {
    displayText("Alarm1: Off", "");
  }  
}

void showAlarm2(){

  byte ADay, AHour, AMinute, ASecond, ABits;
  bool ADy, A12h, Apm;

  if (Clock.checkAlarmEnabled(1)) {
    String result1="Alarm2: ";    
    Clock.getA2Time(ADay, AHour, AMinute, ABits, ADy, A12h, Apm);
    if (blinkInt!=1 || blinkNow==false){
      if (ADy) {
        result1+="DOW  ";
      }
      else{
        result1+="DATE ";
      }  
    }
    else {result1+="     ";}  
    if (blinkInt!=2 || blinkNow==false){
      result1+=ADay; }    
    else {result1+="  ";}    
    String result2="Alarm2: ";  
    if (blinkInt!=3 || blinkNow==false){
      result2+=twoDigitNumber(AHour);
    }
    else {result2+="  ";}    
    result2+=":";  
    if (blinkInt!=4 || blinkNow==false){
      result2+=twoDigitNumber(AMinute);
    }
    else {result2+="  ";}  
    displayText(result1, result2);
  }
  else {
    displayText("Alarm2: Off", "");
  }  
}

void showAlarmMethod(int alarmNum) {

  String myString1="";
  String myString2="";

  byte ADay, AHour, AMinute, ASecond, ABitsOP=0b0;
  bool ADy, A12h, Apm;

  if (alarmNum==1){

    myString1 = "Alarm 1 Method:";
    
    Clock.getA1Time(ADay, AHour, AMinute, ASecond, ABitsOP, ADy, A12h, Apm);  

    ABitsOP  = ABitsOP & 0b1111;
    
    if (ABitsOP==ALRM1_MATCH_EVERY_SEC) {myString2 = "Once per Second";}
    else if (ABitsOP==ALRM1_MATCH_SEC) {myString2 = "Seconds Match";}
    else if (ABitsOP==ALRM1_MATCH_MIN_SEC) {myString2 = "Min & Secs Match";}
    else if (ABitsOP==ALRM1_MATCH_HR_MIN_SEC) {myString2 = "Hr, Min & Sec Match";}
    else if (ABitsOP==ALRM1_MATCH_DY_HR_MIN_SEC) {myString2 = "Dy, Hr, Mn & Sec";}
    } else {
    
    Clock.getA2Time(ADay, AHour, AMinute, ABitsOP, ADy, A12h, Apm);  
    
    myString1 = "Alarm 2 Method:";
    
    if ((ABitsOP>>4)==ALRM2_ONCE_PER_MIN) {myString2 = "Once per Minute";}
    else if ((ABitsOP>>4)==ALRM2_MATCH_MIN) {myString2 = "Match Minute";}
    else {myString2 = "Match Hour & Min";}
  }  
  displayText(myString1 , myString2);
}

String twoDigitNumber(byte number)
{
  char buffer[3];
  snprintf(buffer,sizeof(buffer), "%02d", number );
  return String(buffer);
}


/***************************************************************
 * Functions to set the time
 ***************************************************************/

void setDate(){
  displayText("Set the date:", dateText());
  maxBlinkInt=3;  
}

void setTime(){
  displayText("Set the time:", timeText());
  maxBlinkInt=2;  
}

void setAlarmOnOff(int alarmNum){
  if (alarmNum>0 && alarmNum<3) {  
    maxBlinkInt=1;    
    if(Clock.checkAlarmEnabled(alarmNum)){
      blinkInt=2;}
    else {
      blinkInt=1;}    
    if (blinkInt==1 && blinkNow==true)
      {displayText("", "Alarm" + String(alarmNum) + ": ON");}
    else if (blinkInt==2 && blinkNow==true)
      {displayText("Alarm" + String(alarmNum) + ": OFF", "");}
    else 
     { displayText("Alarm" + String(alarmNum) + ": OFF", "Alarm" + String(alarmNum) + ": ON");}
  }
}


void setAlarm(int alarmNum){
  if (alarmNum>0 && alarmNum<3) {  
    if (alarmNum==1)
    {
      maxBlinkInt=5;    
      showAlarm1();
    }
    if (alarmNum==2)
    {
      maxBlinkInt=4;    
      showAlarm2();
    }
  }
}

void setAlarmMethod(int alarmNum){

  if (alarmNum>0 && alarmNum<3) {    

    if (alarmNum==1)
    {
      maxBlinkInt=1;    
      showAlarmMethod(1);
    }
    if (alarmNum==2)
    {
      maxBlinkInt=1;    
      showAlarmMethod(2);
    }
  }
}

/***************************************************************
 * Functions to increase and decrease time elements
 ***************************************************************/

void increaseYear(){
  bool Century=false;
  byte Year=Clock.getYear();
  if (Year<99)
    {Year = Year + 1;}
  else
    {Year = 00;}
  Clock.setYear(Year);  

  if (Clock.getDate()>monthMaxDays(Clock.getMonth(Century))){
    Clock.setDate(monthMaxDays(Clock.getMonth(Century)));
  }
}

void decreaseYear(){
  bool Century=false;
  byte Year=Clock.getYear();  
  if (Year>1)
    {Year = Year - 1;}
  else
    {Year = 99;}   
  Clock.setYear(Year); 

   if (Clock.getDate()>monthMaxDays(Clock.getMonth(Century))){
    Clock.setDate(monthMaxDays(Clock.getMonth(Century)));
  }
}

void increaseMonth(){
  bool Century=false;
  byte Month=Clock.getMonth(Century);
  if (Month<12) {
    Month = Month + 1;
  }
  else
  {
    Month = 1;
  }
  
  Clock.setMonth(Month);  
  
  if (Clock.getDate()>monthMaxDays(Clock.getMonth(Century))){
    Clock.setDate(monthMaxDays(Clock.getMonth(Century)));
  }
}

void decreaseMonth(){
  bool Century=false;
  byte Month=Clock.getMonth(Century);
  if (Month>1) {
    Month = Month - 1;
  }
  else
  {
    Month = 12;
  }  
  Clock.setMonth(Month); 
  if (Clock.getDate()>monthMaxDays(Clock.getMonth(Century))){
    Clock.setDate(monthMaxDays(Clock.getMonth(Century)));
  }
}

void increaseDate(){ 
  bool Century=false; 
  byte Date=Clock.getDate();
  if (Date<monthMaxDays(Clock.getMonth(Century))) {
    Date = Date + 1;
  }
  else
  {
    Date = 1;
  }    
  Clock.setDate(Date);  
}

void decreaseDate(){ 
  bool Century=false; 
  byte Date=Clock.getDate();  
  if(Date>1) {
    Date = Date- 1;    
  }
  else {
    Date = monthMaxDays(Clock.getMonth(Century));
  }
  Clock.setDate(Date);    
}

void increaseHour(){
  bool h12, PM;
  byte Hour=Clock.getHour(h12, PM);
  if (Hour<24)
    {Hour = Hour + 1;}
  else
    {Hour = 1;}
  Clock.setHour(Hour);  
}

void decreaseHour(){
  bool h12, PM;
  byte Hour=Clock.getHour(h12, PM);
  if (Hour>1)
    {Hour = Hour - 1;}
  else
    {Hour = 24;}
  Clock.setHour(Hour);  
}

void increaseMinute(){
  byte Minute=Clock.getMinute();
  if (Minute<60)
    {Minute = Minute + 1;}
  else
    {Minute = 1;}
  Clock.setMinute(Minute);  
  Clock.setSecond(0);  
}

void decreaseMinute(){
  byte Minute=Clock.getMinute();
  if (Minute>0)
    {Minute = Minute - 1;}
  else
    {Minute = 60;}
  Clock.setMinute(Minute);  
  Clock.setSecond(0);  
}

int monthMaxDays(int monthNumber){
  switch (monthNumber){
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
      return 31;
    case 4:
    case 6:
    case 9:
    case 11:
      return 30;
    case 2:
      int remainingYears;
      remainingYears=((Clock.getYear()-2020)%4);
      if (remainingYears==0){
        return 29;
      }
      else{
        return 28;
      }
   default:
    return 0;
  }
}

/***************************************************************
 * Functions to set Alarms
 ***************************************************************/

 void AlarmOn(int alarmNum, bool setOn){
  if (alarmNum>0 && alarmNum<3) {
    if (setOn){Clock.turnOnAlarm(alarmNum);}
    else {Clock.turnOffAlarm(alarmNum);}  
  }  
 }

 void changeAlarmDayOption(int alarmNum){

  byte ADay, AHour, AMinute, ASecond, ABits;
  bool ADy, A12h, Apm;

  //Collect the current alarm settings
  if (alarmNum==1){Clock.getA1Time(ADay, AHour, AMinute, ASecond, ABits, ADy, A12h, Apm);}
  if (alarmNum==2){Clock.getA2Time(ADay, AHour, AMinute, ABits, ADy, A12h, Apm);}

  ADy=!ADy;

  if (ADy && ADay>7) {ADay=7;}

  //Reset the alarm settings
  if (alarmNum==1){Clock.setA1Time(ADay, AHour, AMinute, ASecond, ABits, ADy, A12h, Apm);}
  if (alarmNum==2){Clock.setA2Time(ADay, AHour, AMinute, ABits, ADy, A12h, Apm);}
}


 void ChangeAlarm(int alarmNum, int dayAdjust, int hourAdjust, int minAdjust,int secAdjust){

  byte ADay, AHour, AMinute, ASecond, ABits;
  bool ADy, A12h, Apm;

  //Collect the current alarm settings
  if (alarmNum==1){Clock.getA1Time(ADay, AHour, AMinute, ASecond, ABits, ADy, A12h, Apm);}
  if (alarmNum==2){Clock.getA2Time(ADay, AHour, AMinute, ABits, ADy, A12h, Apm);}

  //Adjust the date
  ADay+=dayAdjust;
  if (ADy){
    if (ADay<1){ADay=7;}
    if (ADay>7){ADay=1;}
  }
  else {
    if (ADay<1){ADay=31;}
    if (ADay>31){ADay=1;}
  }

  //Adjust the hour
  AHour+=hourAdjust;
  if (AHour<0){AHour=23;}
  if (AHour>23){AHour=0;}

  //Adjust the minute
  AMinute+=minAdjust;
  if (AMinute<0){AMinute=59;}
  if (AMinute>59){AMinute=0;}

  //Adjust the second
  if (alarmNum==1){
    ASecond+=secAdjust;
    if (ASecond<0){ASecond=59;}
    if (ASecond>59){ASecond=0;}
  }
  
  //Reset the alarm settings
  if (alarmNum==1){Clock.setA1Time(ADay, AHour, AMinute, ASecond, ABits, ADy, A12h, Apm);}
  if (alarmNum==2){Clock.setA2Time(ADay, AHour, AMinute, ABits, ADy, A12h, Apm);}

 }

void changeAlarmMethod(int alarmNum, int dir) {

  byte ADay1, AHour1, AMinute1, ASecond1, ADay2, AHour2, AMinute2, ABits=0b0;
  bool ADy1, A12h1, Apm1, ADy2, A12h2, Apm2;

  int AlarmBits;
  
  if (alarmNum==1){    
    Clock.getA1Time(ADay1, AHour1, AMinute1, ASecond1, ABits, ADy1, A12h1, Apm1); 
    ABits  = ABits & 0b1111;
    
    if (dir == 1) {
        if (ABits==ALRM1_MATCH_EVERY_SEC) {AlarmBits |= ALRM1_MATCH_SEC;}        
        else if (ABits==ALRM1_MATCH_SEC) {AlarmBits |= ALRM1_MATCH_MIN_SEC;}
        else if (ABits==ALRM1_MATCH_MIN_SEC) {AlarmBits |= ALRM1_MATCH_HR_MIN_SEC;}
        else if (ABits==ALRM1_MATCH_HR_MIN_SEC) {AlarmBits |= ALRM1_MATCH_DY_HR_MIN_SEC;}
        else if (ABits==ALRM1_MATCH_DY_HR_MIN_SEC) {AlarmBits |= ALRM1_MATCH_EVERY_SEC;}
        }
    else if (dir == 0) {
        if (ABits==ALRM1_MATCH_EVERY_SEC) {AlarmBits |= ALRM1_MATCH_DY_HR_MIN_SEC;}
        else if (ABits==ALRM1_MATCH_SEC) {AlarmBits |= ALRM1_MATCH_EVERY_SEC;}
        else if (ABits==ALRM1_MATCH_MIN_SEC) {AlarmBits |= ALRM1_MATCH_SEC;}
        else if (ABits==ALRM1_MATCH_HR_MIN_SEC) {AlarmBits |= ALRM1_MATCH_MIN_SEC;}
        else {AlarmBits |= ALRM1_MATCH_HR_MIN_SEC;}
    }
    else {AlarmBits |= ABits;}
    Clock.setA1Time(ADay1, AHour1, AMinute1, ASecond1, AlarmBits, ADy1, A12h1, Apm1);       
    
  } else {

    Clock.getA2Time(ADay2, AHour2, AMinute2, ABits, ADy2, A12h2, Apm2); 
    ABits = ABits >> 4;

    if (dir == 1) {
      if (ABits==ALRM2_ONCE_PER_MIN) {AlarmBits = ALRM2_MATCH_MIN;}
      else if (ABits==ALRM2_MATCH_MIN) {AlarmBits = ALRM2_MATCH_HR_MIN;}
      else {AlarmBits = ALRM2_ONCE_PER_MIN;}
    }
    if (dir == 0) {
      if (ABits==ALRM2_ONCE_PER_MIN) {AlarmBits = ALRM2_MATCH_HR_MIN;}
      else if (ABits==ALRM2_MATCH_HR_MIN) {AlarmBits = ALRM2_MATCH_MIN;}
      else {AlarmBits = ALRM2_ONCE_PER_MIN;}
    }
    AlarmBits = AlarmBits << 4;
    Clock.setA2Time(ADay2, AHour2, AMinute2, AlarmBits, ADy2, A12h2, Apm2);
    
  }
}

Credits

guy-l
1 project • 4 followers
Contact

Comments

Please log in or sign up to comment.