24
24
* @see <a href="https://www.foroelectro.net/librerias-arduino-ide-f29/rtclib-arduino-libreria-simple-y-eficaz-para-rtc-y-t95.html">https://www.foroelectro.net/librerias-arduino-ide-f29/rtclib-arduino-libreria-simple-y-eficaz-para-rtc-y-t95.html</a>
25
25
* @see <a href="mailto:naguissa@foroelectro.net">naguissa@foroelectro.net</a>
26
26
* @see <a href="https://github.com/Naguissa/uEEPROMLib">See uEEPROMLib for EEPROM support.</a>
27
- * @version 6.5 .0
27
+ * @version 6.6 .0
28
28
*/
29
29
30
30
#include < Arduino.h>
@@ -86,34 +86,40 @@ void uRTCLib::refresh() {
86
86
// case URTCLIB_MODEL_DS3231: // Commented out because it's default mode
87
87
// case URTCLIB_MODEL_DS3232: // Commented out because it's default mode
88
88
default :
89
- URTCLIB_WIRE.requestFrom (_rtc_address, 15 );
89
+ URTCLIB_WIRE.requestFrom (_rtc_address, 19 );
90
90
break ;
91
91
}
92
-
92
+ // 0x00h
93
93
_second = URTCLIB_WIRE.read () & 0b01111111 ;
94
94
uRTCLIB_YIELD
95
95
_second = uRTCLIB_bcdToDec (_second);
96
96
97
+ // 0x01h
97
98
_minute = URTCLIB_WIRE.read () & 0b01111111 ;
98
99
uRTCLIB_YIELD
99
100
_minute = uRTCLIB_bcdToDec (_minute);
100
101
102
+ // 0x02h
101
103
_hour = URTCLIB_WIRE.read () & 0b00111111 ;
102
104
uRTCLIB_YIELD
103
105
_hour = uRTCLIB_bcdToDec (_hour);
104
106
107
+ // 0x03h
105
108
_dayOfWeek = URTCLIB_WIRE.read ();
106
109
uRTCLIB_YIELD
107
110
_dayOfWeek = uRTCLIB_bcdToDec (_dayOfWeek);
108
111
112
+ // 0x04h
109
113
_day = URTCLIB_WIRE.read ();
110
114
uRTCLIB_YIELD
111
115
_day = uRTCLIB_bcdToDec (_day);
112
116
117
+ // 0x05h
113
118
_month = URTCLIB_WIRE.read () & 0b00011111 ;
114
119
uRTCLIB_YIELD
115
120
_month = uRTCLIB_bcdToDec (_month);
116
121
122
+ // 0x06h
117
123
_year = URTCLIB_WIRE.read ();
118
124
uRTCLIB_YIELD
119
125
_year = uRTCLIB_bcdToDec (_year);
@@ -124,6 +130,7 @@ void uRTCLib::refresh() {
124
130
switch (_model) {
125
131
case URTCLIB_MODEL_DS1307:
126
132
uint8_t status;
133
+ // 0x07h
127
134
status = URTCLIB_WIRE.read ();
128
135
if (status & 0b00010000 ) {
129
136
_sqwg_mode = status & 0b10000000 ? URTCLIB_SQWG_OFF_1 : URTCLIB_SQWG_OFF_0;
@@ -157,22 +164,26 @@ void uRTCLib::refresh() {
157
164
_a1_mode = URTCLIB_ALARM_TYPE_1_NONE;
158
165
_a2_mode = URTCLIB_ALARM_TYPE_2_NONE;
159
166
167
+ // 0x07h
160
168
_a1_second = URTCLIB_WIRE.read ();
161
169
uRTCLIB_YIELD
162
170
_a1_mode = _a1_mode | ((_a1_second & 0b10000000 ) >> 7 );
163
171
_a1_second = uRTCLIB_bcdToDec ((_a1_second & 0b01111111 )); // parentheses for bitwise operation as argument for uRTCLIB_bcdToDec is required
164
172
// otherwise wrong result will be returned by function
165
173
174
+ // 0x08h
166
175
_a1_minute = URTCLIB_WIRE.read ();
167
176
uRTCLIB_YIELD
168
177
_a1_mode = _a1_mode | ((_a1_minute & 0b10000000 ) >> 6 );
169
178
_a1_minute = uRTCLIB_bcdToDec ((_a1_minute & 0b01111111 ));
170
179
180
+ // 0x09h
171
181
_a1_hour = URTCLIB_WIRE.read ();
172
182
uRTCLIB_YIELD
173
183
_a1_mode = _a1_mode | ((_a1_hour & 0b10000000 ) >> 5 );
174
184
_a1_hour = uRTCLIB_bcdToDec ((_a1_hour & 0b00111111 ));
175
185
186
+ // 0x0Ah
176
187
_a1_day_dow = URTCLIB_WIRE.read ();
177
188
uRTCLIB_YIELD
178
189
_a1_mode = _a1_mode | ((_a1_day_dow & 0b10000000 ) >> 4 );
@@ -182,18 +193,21 @@ void uRTCLib::refresh() {
182
193
_a1_day_dow = _a1_day_dow & 0b00111111 ;
183
194
_a1_day_dow = uRTCLIB_bcdToDec (_a1_day_dow);
184
195
196
+ // 0x0Bh
185
197
_a2_minute = URTCLIB_WIRE.read ();
186
198
uRTCLIB_YIELD
187
199
_a2_mode = _a2_mode | ((_a2_minute & 0b10000000 ) >> 6 );
188
200
_a2_minute = _a2_minute & 0b01111111 ;
189
201
_a2_minute = uRTCLIB_bcdToDec (_a2_minute);
190
202
203
+ // 0x0Ch
191
204
_a2_hour = URTCLIB_WIRE.read ();
192
205
uRTCLIB_YIELD
193
206
_a2_mode = _a2_mode | ((_a2_hour & 0b10000000 ) >> 5 );
194
207
_a2_hour = _a2_hour & 0b00111111 ;
195
208
_a2_hour = uRTCLIB_bcdToDec (_a2_hour);
196
209
210
+ // 0x0Dh
197
211
_a2_day_dow = URTCLIB_WIRE.read ();
198
212
uRTCLIB_YIELD
199
213
_a2_mode = _a2_mode | ((_a2_day_dow & 0b10000000 ) >> 4 );
@@ -204,6 +218,7 @@ void uRTCLib::refresh() {
204
218
205
219
206
220
// Control registers
221
+ // 0x0Eh
207
222
LSB = URTCLIB_WIRE.read ();
208
223
uRTCLIB_YIELD
209
224
@@ -227,15 +242,34 @@ void uRTCLib::refresh() {
227
242
_a2_mode = URTCLIB_ALARM_TYPE_2_NONE;
228
243
}
229
244
230
- // Temperature registers (11h-12h) get updated automatically every 64s
231
- URTCLIB_WIRE.beginTransmission (_rtc_address);
232
- URTCLIB_WIRE.write (0x11 );
233
- URTCLIB_WIRE.endTransmission ();
234
- URTCLIB_WIRE.requestFrom (_rtc_address, 2 );
245
+
246
+
247
+ // 0x0Fh
248
+ LSB = URTCLIB_WIRE.read (); // Control
235
249
uRTCLIB_YIELD
236
250
251
+ _lost_power = (bool ) (LSB & 0x10000000b );
252
+ _32k = (bool ) (LSB & 0x00001000b );
253
+ _a2_triggered_flag = (bool ) (LSB & 0x00000010b );
254
+ _a1_triggered_flag = (bool ) (LSB & 0x00000001b );
255
+
256
+
257
+ // 0x10h
258
+ _aging = URTCLIB_WIRE.read (); // Aging
259
+ uRTCLIB_YIELD
260
+ if (_aging & 0b10000000 ) {
261
+ _aging--;
262
+ }
263
+
264
+
265
+ // Temperature registers (11h-12h) get updated automatically every 64s
266
+
267
+ // 0x11h
237
268
MSB = URTCLIB_WIRE.read (); // 2's complement int portion
269
+ uRTCLIB_YIELD
270
+ // 0x12h
238
271
LSB = URTCLIB_WIRE.read (); // fraction portion
272
+ uRTCLIB_YIELD
239
273
_temp = 0b0000000000000000 | (MSB << 2 ) | (LSB >> 6 ); // 8+2 bits, *25 is the same as number + 2bitdecimals * 100 in base 10
240
274
if (MSB & 0b10000000 ) {
241
275
_temp = (_temp | 0b1111110000000000 );
@@ -260,35 +294,7 @@ void uRTCLib::refresh() {
260
294
* @return True if power was lost (both power sources, VCC and VBAT)
261
295
*/
262
296
bool uRTCLib::lostPower () {
263
- uint8_t status;
264
-
265
- switch (_model) {
266
- case URTCLIB_MODEL_DS1307:
267
- uRTCLIB_YIELD
268
- URTCLIB_WIRE.beginTransmission (_rtc_address);
269
- URTCLIB_WIRE.write (0X00 );
270
- URTCLIB_WIRE.endTransmission ();
271
- uRTCLIB_YIELD
272
- URTCLIB_WIRE.requestFrom (_rtc_address, 1 );
273
- status = URTCLIB_WIRE.read ();
274
- uRTCLIB_YIELD
275
- return ((status & 0B10000000 ) == 0B10000000 );
276
- break ;
277
-
278
- // case URTCLIB_MODEL_DS3231: // Commented out because it's default mode
279
- // case URTCLIB_MODEL_DS3232: // Commented out because it's default mode
280
- default :
281
- uRTCLIB_YIELD
282
- URTCLIB_WIRE.beginTransmission (_rtc_address);
283
- URTCLIB_WIRE.write (0X0F );
284
- URTCLIB_WIRE.endTransmission ();
285
- uRTCLIB_YIELD
286
- URTCLIB_WIRE.requestFrom (_rtc_address, 1 );
287
- status = URTCLIB_WIRE.read ();
288
- uRTCLIB_YIELD
289
- return ((status & 0B10000000 ) == 0B10000000 );
290
- break ;
291
- }
297
+ return _lost_power;
292
298
}
293
299
294
300
/* *
@@ -299,9 +305,8 @@ bool uRTCLib::lostPower() {
299
305
* Others have a 'OSF' Oscillator Stop Flag in Register 0Fh
300
306
*/
301
307
void uRTCLib::lostPowerClear () {
302
-
303
- uint8_t status;
304
-
308
+ uint8_t status;
309
+ _lost_power = false ;
305
310
switch (_model) {
306
311
case URTCLIB_MODEL_DS1307:
307
312
uRTCLIB_YIELD
@@ -1100,6 +1105,31 @@ uint8_t uRTCLib::alarmDayDow(const uint8_t alarm) {
1100
1105
}
1101
1106
1102
1107
1108
+
1109
+ /* *
1110
+ * \brief Checks if any alarm has been triggered
1111
+ *
1112
+ * @param alarm Alarm number:
1113
+ * - #URTCLIB_ALARM_1
1114
+ * - #URTCLIB_ALARM_2
1115
+ * - #URTCLIB_ALARM_ANY
1116
+ *
1117
+ * @return Current stored day or dow. 0b11111111 means error.
1118
+ */
1119
+ bool uRTCLib::alarmTriggered (const uint8_t alarm) {
1120
+ if ((alarm == URTCLIB_ALARM_1 || alarm == URTCLIB_ALARM_ANY) && _a1_triggered_flag) {
1121
+ return true ;
1122
+ }
1123
+ if ((alarm == URTCLIB_ALARM_2 || alarm == URTCLIB_ALARM_ANY) && _a2_triggered_flag) {
1124
+ return true ;
1125
+ }
1126
+ return false ;
1127
+ }
1128
+
1129
+
1130
+
1131
+
1132
+
1103
1133
/* ************* SQuare Wave Generator ****************/
1104
1134
1105
1135
/* *
@@ -1341,26 +1371,7 @@ bool uRTCLib::ramWrite(const uint8_t address, byte data) {
1341
1371
* @return Aging register value on RTC, 2-complement recalculated (use as regular int8_t)
1342
1372
*/
1343
1373
int8_t uRTCLib::agingGet () {
1344
- int8_t ret = 0 ;
1345
- switch (_model) {
1346
- case URTCLIB_MODEL_DS3231:
1347
- case URTCLIB_MODEL_DS3232:
1348
- URTCLIB_WIRE.beginTransmission (_rtc_address);
1349
- uRTCLIB_YIELD
1350
- URTCLIB_WIRE.write (0x10 );
1351
- uRTCLIB_YIELD
1352
- URTCLIB_WIRE.endTransmission ();
1353
- uRTCLIB_YIELD
1354
- URTCLIB_WIRE.requestFrom (_rtc_address, 1 );
1355
- uRTCLIB_YIELD
1356
- ret = URTCLIB_WIRE.read (); // 2's complement portion
1357
- if (ret & 0b10000000 ) {
1358
- ret--;
1359
- }
1360
- break ;
1361
-
1362
- }
1363
- return ret;
1374
+ return _aging;
1364
1375
}
1365
1376
1366
1377
/* *
@@ -1417,4 +1428,92 @@ bool uRTCLib::agingSet(int8_t val) {
1417
1428
}
1418
1429
1419
1430
1431
+
1432
+ /* *
1433
+ * \brief Enables 32K pin output
1434
+ *
1435
+ * As DS1307 doen't have this functionality we map it to SqWG with 32K frequency
1436
+ */
1437
+ bool uRTCLib::enable32KOut () {
1438
+ _32k = true ;
1439
+ switch (_model) {
1440
+ case URTCLIB_MODEL_DS1307: // As DS1307 doesn't have this pin, map it to SqWG at same frequency
1441
+ return sqwgSetMode (URTCLIB_SQWG_32768H);
1442
+ break ;
1443
+
1444
+ // case URTCLIB_MODEL_DS3231: // Commented out because it's default mode
1445
+ // case URTCLIB_MODEL_DS3232: // Commented out because it's default mode
1446
+ default :
1447
+ uint8_t status;
1448
+ uRTCLIB_YIELD
1449
+ URTCLIB_WIRE.beginTransmission (_rtc_address);
1450
+ URTCLIB_WIRE.write (0X0F );
1451
+ URTCLIB_WIRE.endTransmission ();
1452
+ uRTCLIB_YIELD
1453
+ URTCLIB_WIRE.requestFrom (_rtc_address, 1 );
1454
+ status = URTCLIB_WIRE.read ();
1455
+ status |= 0b00001000 ;
1456
+ uRTCLIB_YIELD
1457
+ URTCLIB_WIRE.beginTransmission (_rtc_address);
1458
+ uRTCLIB_YIELD
1459
+ URTCLIB_WIRE.write (0X0F );
1460
+ uRTCLIB_YIELD
1461
+ URTCLIB_WIRE.write (status);
1462
+ uRTCLIB_YIELD
1463
+ URTCLIB_WIRE.endTransmission ();
1464
+ uRTCLIB_YIELD
1465
+ return true ;
1466
+ break ;
1467
+ }
1468
+ }
1469
+
1470
+ /* *
1471
+ * \brief Enables 32K pin output
1472
+ *
1473
+ * As DS1307 doen't have this functionality we map it to SqWG with 32K frequency
1474
+ */
1475
+ bool uRTCLib::disable32KOut () {
1476
+ _32k = false ;
1477
+ switch (_model) {
1478
+ case URTCLIB_MODEL_DS1307: // As DS1307 doesn't have this pin, map it to SqWG at same frequency
1479
+ return sqwgSetMode (URTCLIB_SQWG_OFF_0);
1480
+ break ;
1481
+
1482
+ // case URTCLIB_MODEL_DS3231: // Commented out because it's default mode
1483
+ // case URTCLIB_MODEL_DS3232: // Commented out because it's default mode
1484
+ default :
1485
+ uint8_t status;
1486
+ uRTCLIB_YIELD
1487
+ URTCLIB_WIRE.beginTransmission (_rtc_address);
1488
+ URTCLIB_WIRE.write (0X0F );
1489
+ URTCLIB_WIRE.endTransmission ();
1490
+ uRTCLIB_YIELD
1491
+ URTCLIB_WIRE.requestFrom (_rtc_address, 1 );
1492
+ status = URTCLIB_WIRE.read ();
1493
+ status &= 0b11110111 ;
1494
+ uRTCLIB_YIELD
1495
+ URTCLIB_WIRE.beginTransmission (_rtc_address);
1496
+ uRTCLIB_YIELD
1497
+ URTCLIB_WIRE.write (0X0F );
1498
+ uRTCLIB_YIELD
1499
+ URTCLIB_WIRE.write (status);
1500
+ uRTCLIB_YIELD
1501
+ URTCLIB_WIRE.endTransmission ();
1502
+ uRTCLIB_YIELD
1503
+ return true ;
1504
+ break ;
1505
+ }
1506
+ }
1507
+
1508
+
1509
+ /* *
1510
+ * \brief Checks 32K pin output status
1511
+ *
1512
+ * As DS1307 doen't have this functionality we map it to SqWG with 32K frequency
1513
+ */
1514
+ bool uRTCLib::status32KOut () {
1515
+ return _32k;
1516
+ }
1517
+
1518
+
1420
1519
/* ** EEPROM functionality has been moved to separate library: https://github.com/Naguissa/uEEPROMLib ***/
0 commit comments