Skip to content
This repository has been archived by the owner on Aug 27, 2024. It is now read-only.

Commit

Permalink
upd
Browse files Browse the repository at this point in the history
  • Loading branch information
GyverLibs committed Jul 20, 2022
1 parent 077f3e0 commit 70c6e16
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 43 deletions.
24 changes: 13 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,20 +60,21 @@ void setHMSDMY(int8_t hours, int8_t minutes, int8_t seconds, int8_t date, int8_t
uint8_t second;
uint8_t minute;
uint8_t hour;
uint8_t day; // день недели (пн.. вс - 1.. 7)
uint8_t day; // день недели (пн.. вс = 1.. 7)
uint8_t date;
uint8_t month;
uint16_t year;
DateTime getTime(); // получить в структуру DateTime
uint8_t getSeconds(); // получить секунды
uint8_t getMinutes(); // получить минуты
uint8_t getHours(); // получить часы
uint8_t getDay(); // получить день недели
uint8_t getDate(); // получить число
uint16_t getYear(); // получить год
uint8_t getMonth(); // получить месяц
DateTime getTime(); // получить в структуру DateTime
uint8_t getSeconds(); // получить секунды
uint8_t getMinutes(); // получить минуты
uint8_t getHours(); // получить часы
uint8_t getDay(); // получить день недели
uint8_t getDate(); // получить число
uint16_t getYear(); // получить год
uint8_t getMonth(); // получить месяц
uint32_t getUnix(int16_t gmt); // получить unix время (указать свой часовой пояс в часах ИЛИ минутах)
String getTimeString(); // получить время как строку вида HH:MM:SS
String getDateString(); // получить дату как строку вида DD.MM.YYYY
void getTimeChar(char* array); // получить время как char array [8] вида HH:MM:SS
Expand Down Expand Up @@ -203,7 +204,8 @@ void loop() {
- v2.4 - исправлена установка времени компиляции
- v2.5 - добавлен begin для проверки наличия модуля на линии
- v2.6 - исправлены отрицательные температуры

- v2.7 - добавлен вывод unix

<a id="feedback"></a>
## Баги и обратная связь
При нахождении багов создавайте **Issue**, а лучше сразу пишите на почту [alex@alexgyver.ru](mailto:alex@alexgyver.ru)
Expand Down
1 change: 1 addition & 0 deletions keywords.txt
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ getTimeString KEYWORD2
getDateString KEYWORD2
getTimeChar KEYWORD2
getDateChar KEYWORD2
getUnix KEYWORD2

second KEYWORD2
minute KEYWORD2
Expand Down
2 changes: 1 addition & 1 deletion library.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name=microDS3231
version=2.6
version=2.7
author=AlexGyver <alex@alexgyver.ru>
maintainer=AlexGyver <alex@alexgyver.ru>
sentence=Light library for DS3231 RTC module
Expand Down
45 changes: 27 additions & 18 deletions src/microDS3231.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#include "microDS3231.h"

//static const uint8_t _ds_daysInMonth[] PROGMEM = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
static uint8_t _ds_DIM(uint8_t i) {
static uint8_t DS_dim(uint8_t i) {
return (i < 7) ? ((i == 1) ? 28 : ((i & 1) ? 30 : 31)) : ((i & 1) ? 31 : 30);
}

Expand All @@ -11,9 +11,8 @@ static uint16_t getWeekDay(uint16_t y, uint8_t m, uint8_t d) {
uint16_t days = d;
for (uint8_t i = 1; i < m; ++i)
//days += pgm_read_byte(_ds_daysInMonth + i - 1);
days += _ds_DIM(i - 1);
if (m > 2 && y % 4 == 0)
++days;
days += DS_dim(i - 1);
if (m > 2 && y % 4 == 0) days++;
return (days + 365 * y + (y + 3) / 4 + 4) % 7 + 1;
}

Expand All @@ -23,16 +22,16 @@ MicroDS3231::MicroDS3231(uint8_t addr) : _addr(addr) {
}

bool MicroDS3231::begin(void){
Wire.begin(); // Инит шины
Wire.beginTransmission(_addr); // Зовем DS3231 по адресу
Wire.begin(); // Инит шины
Wire.beginTransmission(_addr); // Зовем DS3231 по адресу
return (!Wire.endTransmission()); // если никто не откликнулся - возвращаем false
}

void MicroDS3231::setTime(int8_t seconds, int8_t minutes, int8_t hours, int8_t date, int8_t month, int16_t year) {
// защиты от дурака
month = constrain(month, 1, 12);
//date = constrain(date, 0, pgm_read_byte(_ds_daysInMonth + month - 1));
date = constrain(date, 0, _ds_DIM(month - 1));
date = constrain(date, 0, DS_dim(month - 1));
seconds = constrain(seconds, 0, 59);
minutes = constrain(minutes, 0, 59);
hours = constrain(hours, 0, 23);
Expand Down Expand Up @@ -63,23 +62,22 @@ void MicroDS3231::setTime(DateTime time) {
}

static int charToDec(const char* p) {
return (10 * (*p - '0') + (*++p - '0'));
return ((*p - '0') * 10 + (*(p + 1) - '0'));
}

void MicroDS3231::setTime(const __FlashStringHelper* stamp) {
char buff[25];
memcpy_P(buff, stamp, 25);

// Wed Jul 14 22:00:24 2021
// 4 8 11 14 17 22
// Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
char buff[25];
memcpy_P(buff, stamp, 25);
int h, m, s, d, mo, y;
h = charToDec(buff + 11);
m = charToDec(buff + 14);
s = charToDec(buff + 17);
d = charToDec(buff + 8);
switch (buff[4]) {
case 'J': mo = (buff[5] == 'a') ? 1 : (mo = (buff[6] == 'n') ? 6 : 7); break;
case 'J': mo = (buff[5] == 'a') ? 1 : ((buff[6] == 'n') ? 6 : 7); break;
case 'F': mo = 2; break;
case 'A': mo = (buff[6] == 'r') ? 4 : 8; break;
case 'M': mo = (buff[6] == 'r') ? 3 : 5; break;
Expand Down Expand Up @@ -107,9 +105,21 @@ DateTime MicroDS3231::getTime() {
now.year = unpackRegister(Wire.read()) + 2000;
return now;
}

uint32_t MicroDS3231::getUnix(int16_t gmt) {
DateTime now = getTime();
if (abs(gmt) <= 12) gmt *= 60;
int8_t my = (now.month >= 3) ? 1 : 0;
uint16_t y = now.year + my - 1970;
uint16_t dm = 0;
for (int i = 0; i < now.month - 1; i++) dm += DS_dim(i);
return (((now.date-1+dm+((y+1)/4)-((y+69)/100)+((y+369)/100/4)+365*(y-my))*24ul+now.hour)*60ul+now.minute-gmt)*60ul+now.second;
}

String MicroDS3231::getTimeString() {
DateTime now = getTime();
String str = "";
String str; // HH:MM:SS
str.reserve(8);
if (now.hour < 10) str += '0';
str += now.hour;
str += ':';
Expand All @@ -122,7 +132,8 @@ String MicroDS3231::getTimeString() {
}
String MicroDS3231::getDateString() {
DateTime now = getTime();
String str = "";
String str; // DD.MM.YYYY
str.reserve(10);
if (now.date < 10) str += '0';
str += now.date;
str += '.';
Expand Down Expand Up @@ -156,8 +167,7 @@ void MicroDS3231::getDateChar(char* array) {
array[10] = '\0';
}
bool MicroDS3231::lostPower(void) { // возвращает true, если 1 января 2000
if (getYear() == 2000 && getMonth() == 1 && getDate() == 1) return true;
else return false;
return (getYear() == 2000 && getMonth() == 1 && getDate() == 1);
}

uint8_t MicroDS3231::getSeconds(void) {
Expand Down Expand Up @@ -194,8 +204,7 @@ uint8_t MicroDS3231::readRegister(uint8_t addr) {
Wire.write(addr);
if (Wire.endTransmission() != 0) return 0;
Wire.requestFrom(_addr, (uint8_t)1);
uint8_t data = Wire.read();
return data;
return Wire.read();
}

uint8_t MicroDS3231::unpackRegister(uint8_t data) {
Expand Down
29 changes: 16 additions & 13 deletions src/microDS3231.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
v2.4 - исправлена установка времени компиляции
v2.5 - добавлен begin для проверки наличия модуля на линии
v2.6 - исправлены отрицательные температуры
v2.7 - добавлен вывод unix
*/

#ifndef microDS3231_h
Expand All @@ -46,33 +47,35 @@ struct DateTime {
class MicroDS3231 {
public:
MicroDS3231(uint8_t addr = 0x68); // конструктор. Можно передать адрес
bool begin(void); // инициализация, вернет true, если RTC найден
bool begin(); // инициализация, вернет true, если RTC найден
void setTime(const __FlashStringHelper* stamp); // установка времени == времени компиляции
void setTime(DateTime time); // установить из структуры DateTime
void setTime(int8_t seconds, int8_t minutes, int8_t hours, int8_t date, int8_t month, int16_t year); // установка времени
void setHMSDMY(int8_t hours, int8_t minutes, int8_t seconds, int8_t date, int8_t month, int16_t year); // установка времени тип 2

DateTime getTime(void); // получить в структуру DateTime
uint8_t getSeconds(void); // получить секунды
uint8_t getMinutes(void); // получить минуты
uint8_t getHours(void); // получить часы
uint8_t getDay(void); // получить день недели
uint8_t getDate(void); // получить число
uint16_t getYear(void); // получить год
uint8_t getMonth(void); // получить месяц
DateTime getTime(); // получить в структуру DateTime
uint8_t getSeconds(); // получить секунды
uint8_t getMinutes(); // получить минуты
uint8_t getHours(); // получить часы
uint8_t getDay(); // получить день недели
uint8_t getDate(); // получить число
uint16_t getYear(); // получить год
uint8_t getMonth(); // получить месяц

uint32_t getUnix(int16_t gmt); // получить unix время (указать свой часовой пояс в часах ИЛИ минутах)

String getTimeString(); // получить время как строку вида HH:MM:SS
String getDateString(); // получить дату как строку вида DD.MM.YYYY
void getTimeChar(char* array); // получить время как char array [8] вида HH:MM:SS
void getDateChar(char* array); // получить дату как char array [10] вида DD.MM.YYYY

bool lostPower(void); // проверка на сброс питания
float getTemperatureFloat(void);// получить температуру float
int getTemperature(void); // получить температуру int
bool lostPower(); // проверка на сброс питания
int getTemperature(); // получить температуру int
float getTemperatureFloat(); // получить температуру float

private:
uint8_t encodeRegister(int8_t data);
int getTemperatureRaw(void);
int getTemperatureRaw();
uint8_t readRegister(uint8_t addr);
uint8_t unpackRegister(uint8_t data);
uint8_t unpackHours(uint8_t data);
Expand Down

0 comments on commit 70c6e16

Please sign in to comment.