nath 6 年之前
父節點
當前提交
04a52df1a3
共有 3 個文件被更改,包括 207 次插入51 次删除
  1. 156 12
      lib/DS3231/DS3231.cpp
  2. 4 2
      lib/DS3231/DS3231.h
  3. 47 37
      src/sketch.ino

+ 156 - 12
lib/DS3231/DS3231.cpp

@@ -41,11 +41,11 @@
 #define REG_ALARM1_SEC	0x07
 #define REG_ALARM1_MIN	0x08
 #define REG_ALARM1_HOUR	0x09
-#define REG_ALARM1_DATE	0xA0
+#define REG_ALARM1_DATE	0x0a
 
-#define REG_ALARM2_MIN	0xB0
-#define REG_ALARM2_HOUR	0xC0
-#define REG_ALARM2_DATE	0xD0
+#define REG_ALARM2_MIN	0x0b
+#define REG_ALARM2_HOUR	0x0c
+#define REG_ALARM2_DATE	0x0d
 
 #define REG_CON		0x0e
 #define REG_STATUS	0x0f
@@ -458,26 +458,170 @@ uint8_t DS3231::_encode(uint8_t value)
 
 
 
-void DS3231::setAlarm1Time(uint8_t date,uint8_t hour, uint8_t min, uint8_t sec)
+void DS3231::setAlarm1Time(uint8_t hour, uint8_t min)
 {
-	if (((date>=1) && (date<31)) && ((hour>=0) && (hour<24)) && ((min>=0) && (min<60)) && ((sec>=0) && (sec<60)))
+	if (((hour>=0) && (hour<24)) && ((min>=0) && (min<60)))
 	{
-		_writeRegister(REG_ALARM1_SEC, _encode(sec));
-		_writeRegister(REG_ALARM1_MIN, _encode(min));
-		_writeRegister(REG_ALARM1_HOUR, _encode(hour));
-		_writeRegister(REG_ALARM1_DATE, _encode(date));
+    min = _encode(min);
+    hour = _encode(hour);
+    
+    uint8_t sec = 0x00;
+    min = min &~ (1<<7);
+    hour = hour &~ (1<<7);;
+    hour = hour &~ (1<<6);
+    uint8_t date = 0x81;
+		_writeRegister(REG_ALARM1_SEC, sec);
+		_writeRegister(REG_ALARM1_MIN, min);
+		_writeRegister(REG_ALARM1_HOUR, hour);
+		_writeRegister(REG_ALARM1_DATE, date);
 	}
 }
 
 
 
-void DS3231::setAlarm2Time(uint8_t min, uint8_t hour, uint8_t date)
+void DS3231::setAlarm2Time(uint8_t hour, uint8_t min)
 {
-	if (((hour>=0) && (hour<24)) && ((min>=0) && (min<60)) && ((date>=1) && (date<31)))
+	if (((hour>=0) && (hour<24)) && ((min>=0) && (min<60)))
 	{
+    min = _encode(min);
+    hour = _encode(hour);
+    
+    min = min &~ (1<<7);
+    hour = hour &~ 0x3f;
+    uint8_t date = 0x81;
 		_writeRegister(REG_ALARM2_MIN, _encode(min));
 		_writeRegister(REG_ALARM2_HOUR, _encode(hour));
 		_writeRegister(REG_ALARM2_DATE, _encode(date));
 	}
 }
 
+char *DS3231::getAlarm1Str(uint8_t format)
+{
+    static char output[] = "xx:xx:xx-xxxxxx";
+    uint8_t sec = _readRegister(REG_ALARM1_SEC);
+    uint8_t min = _readRegister(REG_ALARM1_MIN);
+    uint8_t hour = _readRegister(REG_ALARM1_HOUR);
+    uint8_t date = _readRegister(REG_ALARM1_DATE);
+  
+    // Formatage des bits de controle
+    if((sec&(1<<7)) == 0)
+       output[14] = 48;
+    else
+       output[14] = 49;
+  
+    if((min&(1<<7)) == 0)
+       output[13] = 48;
+    else
+       output[13] = 49;
+  
+    if((hour&(1<<7)) == 0)
+      output[12] = 48;
+    else
+      output[12] = 49;
+  
+    if((hour&(1<<6)) == 0)
+       output[10] = 50;
+    else
+       output[10] = 49;
+       
+    if((date&(1<<7)) == 0)
+      output[11] = 48;
+    else
+      output[11] = 49;
+  
+    if((date&(1<<6)) == 0)
+       output[9] = 77;
+    else
+       output[9] = 87;
+  
+    //Fin formatage des bits de controle
+  
+  
+
+    sec = _decode(sec);
+    min = _decode(min);
+    hour = _decodeH(hour);
+  
+    if (hour<10)
+        output[0]=48; // "0" en ASCII
+    else
+        output[0]=char((hour / 10)+48);
+  
+  
+        output[1]=char((hour % 10)+48);
+ 
+    if (min<10)
+        output[3]=48; // "0" en ASCII
+    else
+        output[3]=char((min / 10)+48);
+ 
+    output[4]=char((min % 10)+48);
+ 
+   
+    output[6]=char((sec / 10)+48);
+    output[7]=char((sec % 10)+48);
+    output[16]=0;
+    
+    return (char*)&output;
+}
+
+char *DS3231::getAlarm2Str(uint8_t format)
+{
+    static char output[] = "xx:xx-xxxxx";
+    uint8_t min = _readRegister(REG_ALARM2_MIN);
+    uint8_t hour = _readRegister(REG_ALARM2_HOUR);
+    uint8_t date = _readRegister(REG_ALARM2_DATE);
+  
+    // Formatage des bits de controle
+  
+    if((min&(1<<7)) == 0)
+       output[10] = 48;
+    else
+       output[10] = 49;
+  
+    if((hour&(1<<7)) == 0)
+      output[9] = 48;
+    else
+      output[9] = 49;
+  
+    if((hour&(1<<6)) == 0)
+       output[7] = 50;
+    else
+       output[7] = 49;
+       
+    if((date&(1<<7)) == 0)
+      output[8] = 48;
+    else
+      output[8] = 49;
+  
+    if((date&(1<<6)) == 0)
+       output[6] = 77;
+    else
+       output[6] = 87;
+  
+    //Fin formatage des bits de controle
+  
+  
+
+    min = _decode(min);
+    hour = _decode(hour);
+  
+    if (hour<10)
+        output[0]=48; // "0" en ASCII
+    else
+        output[0]=char((hour / 10)+48);
+  
+  
+        output[1]=char((hour % 10)+48);
+ 
+    if (min<10)
+        output[3]=48; // "0" en ASCII
+    else
+        output[3]=char((min / 10)+48);
+ 
+    output[4]=char((min % 10)+48);
+ 
+    output[11]=0;
+    
+    return (char*)&output;
+}

+ 4 - 2
lib/DS3231/DS3231.h

@@ -82,9 +82,11 @@ class DS3231
 		Time	getTime();
 		void	setTime(uint8_t hour, uint8_t min, uint8_t sec);
 
-		void	setAlarm1Time(uint8_t date,uint8_t hour, uint8_t min, uint8_t sec);
-		void	setAlarm2Time(uint8_t min, uint8_t hour, uint8_t date);
+		void	setAlarm1Time(uint8_t hour, uint8_t min);
+		void	setAlarm2Time(uint8_t hour, uint8_t min);
 
+    char *getAlarm1Str(uint8_t format=FORMAT_LONG);
+    char *getAlarm2Str(uint8_t format=FORMAT_LONG);
 
 		void	setDate(uint8_t date, uint8_t mon, uint16_t year);
 		void	setDOW();

+ 47 - 37
src/sketch.ino

@@ -6,6 +6,7 @@
 
 #include <Stepper.h>
 #include <DS3231.h>
+#include <string.h>
 
 #include "../lib/calsol.h"
 
@@ -23,54 +24,63 @@ Stepper myStepper2(stepsPerRevolution, 2, 3, 4, 5);
 DS3231  rtc(4, 5);
 
 struct Date_t {
-        unsigned long annee;
-        unsigned long mois;
-        unsigned long jour;
+	unsigned long annee;
+	unsigned long mois;
+	unsigned long jour;
 };
 
 
 void stepperOff() {
-  for(int i=2; i<=9; i++) {
-    digitalWrite(i, LOW);  
-  }
+	for(int i=2; i<=9; i++) {
+		digitalWrite(i, LOW);  
+	}
 }
 
 
 void setup() {
-  Serial.begin(115200);
-  rtc.begin();  
-  // The following lines can be uncommented to set the date and time
+	Serial.begin(115200);
+	rtc.begin();  
+		rtc.setAlarm1Time(8, 20);
+		rtc.setAlarm2Time(14, 45);
+	// The following lines can be uncommented to set the date and time
 
-  /*  rtc.setDOW(THURSDAY);     // Set Day-of-Week to SUNDAY
-      rtc.setTime(22, 14, 0);     // Set the time to 12:00:00 (24hr format)
-      rtc.setDate(4, 11, 2019);   // Set the date to January 1st, 2014 */
+	/*  rtc.setDOW(THURSDAY);     // Set Day-of-Week to SUNDAY
+	  rtc.setTime(22, 14, 0);     // Set the time to 12:00:00 (24hr format)
+	  rtc.setDate(4, 11, 2019);   // Set the date to January 1st, 2014 */
 
 }
 
 void loop() {
-  myStepper2.setSpeed(100);
-  for(int i=0; i<=STEP_REV*REV; i++) {
-      myStepper1.step(1);
-      myStepper2.step(-1);
-  }
-  for(int i=0; i<=STEP_REV*REV; i++) {
-      myStepper1.step(-1);
-      myStepper2.step(1);
-  }
-  stepperOff();
-  delay(3000);
-
- // Send Day-of-Week
-  Serial.print(rtc.getDOWStr());
-  Serial.print(" ");
-  
-  // Send date
-  Serial.print(rtc.getDateStr());
-  Serial.print(" -- ");
-
-  // Send time
-  Serial.println(rtc.getTimeStr());
-  
-  // Wait one second before repeating :)
-  delay (1000);
+	/*myStepper2.setSpeed(100);
+	for(int i=0; i<=STEP_REV*REV; i++) {
+		myStepper1.step(1);
+		myStepper2.step(-1);
+	}
+	for(int i=0; i<=STEP_REV*REV; i++) {
+		myStepper1.step(-1);
+		myStepper2.step(1);
+	}
+	stepperOff();
+	delay(3000);*/
+
+	// Send Day-of-Week
+	Serial.print(rtc.getDOWStr());
+	Serial.print(" ");
+
+	// Send date
+	Serial.print(rtc.getDateStr());
+	Serial.print(" -- ");
+
+	// Send time
+	Serial.println(rtc.getTimeStr());
+
+	
+	Serial.print("Alarm 1 : ");
+	Serial.println(rtc.getAlarm1Str());
+	Serial.println("-----------------------------------------------");
+	Serial.print("Alarm 2 : ");
+	Serial.println(rtc.getAlarm2Str());	
+	
+	// Wait one second before repeating :)
+	delay (1000);
 }