Помогите clock module 3231 сбоем питания

Почему-то после отключения питания ардуино сбивается время. Батарейка.

// Пример: uRTCLib + DS3231
//author: Alunts Arthur Arthurovich;
//Kamil v ad;
//Pikunov v ad;



#include "uRTCLib.h"
uRTCLib rtc(0x68); // адрес 0x68 для DS3231
String de1="/";
String de2=":";
int ss  = 0;
int mm  = 0;
int hh  = 0;
int day = 0;        
int mon = 0;     
int yr  = 0;
int dow = 0;  
int Temp0 = 0;
char WW1[8][24] = { "0","Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"};

void getTime0(){
   // Обновляем внутренние данные модуля (если библиотека поддерживает refresh)
rtc.refresh();
ss  = rtc.second();
mm  = rtc.minute();
hh  = rtc.hour();
day = rtc.day();        // день месяца
mon = rtc.month();      // месяц
yr = 2000 + rtc.year(); // год (uRTCLib возвращает год относительно 2000)
dow = rtc.dayOfWeek();  // день недели (1..7)
Temp0 = rtc.temp()/100.0f;;
Serial.println(yr+de1+mon+de1+day+de1+ WW1[dow]+" "+hh+de2+mm+de2+ss+" "+de1+Temp0);
}

void setup() {
  Serial.begin(9600);
  URTCLIB_WIRE.begin();
  //_______ ss, mm, hh, w, dd, mm, yy 26=2026________
  //rtc.set(30, 22, 12, 1, 4,  5,  26);//____________
 
  delay(3000); // читать каждую секундуgetTime0();
  getTime0();
}

void loop() {
  //delay(1000); // читать каждую секундуgetTime0();
  //getTime0();
}

У ds3231 нужно включать работу от батарейки, по умолчанию при отключении питания осцилятор останавливается.

Как это делается в используемой библиотеке, я не знаю ))

Осцилятор, как его врубить?
Какую либу использовать?

Если ручками (самому читать/писать регистры), то так

 uint8_t temp_buffer = read_register(0x0e) & 0b11100111;
// поднимаем флаг BBSQW - работа от батареи
temp_buffer = temp_buffer | 0b01000000;
// устанавливаем ~EOSC и INTCN в 0 - запускаем генератор
temp_buffer = temp_buffer & 0b01111011;
// записываем контрольный бит
write_register(0x0e, temp_buffer);

Собственно, чтение/запись

#define CLOCK_ADDRESS 0x68

uint8_t read_register(uint8_t reg)
{
  Wire.beginTransmission(CLOCK_ADDRESS);
  Wire.write(reg);
  Wire.endTransmission();
  Wire.requestFrom(CLOCK_ADDRESS, 1);
  return Wire.read();
}

void write_register(uint8_t reg, uint8_t data)
{
  Wire.beginTransmission(CLOCK_ADDRESS);
  Wire.write(reg);
  Wire.write(data);
  Wire.endTransmission();
}

Спасибо, блеф, но куда это всавлять в setup, или в гавно пьян?

Именно так

void setup() {
  Serial.begin(9600);
  URTCLIB_WIRE.begin();
  //_______ ss, mm, hh, w, dd, mm, yy 26=2026________
  //rtc.set(30, 22, 12, 1, 4,  5,  26);//____________
uint8_t temp_buffer = read_register(0x0e) & 0b11100111;
// поднимаем флаг BBSQW - работа от батареи
temp_buffer = temp_buffer | 0b01000000;
// устанавливаем ~EOSC и INTCN в 0 - запускаем генератор
temp_buffer = temp_buffer & 0b01111011;
// записываем контрольный бит
write_register(0x0e, temp_buffer);
 
  delay(3000); // читать каждую секундуgetTime0();
  getTime0();
}
// Пример: uRTCLib + DS3231
//author: Alunts Arthur Arthurovich;
//Kamil v ad;
//Pikunov v ad;

#include "uRTCLib.h"
uRTCLib rtc(0x68); // адрес 0x68 для DS3231
String de1="/";
String de2=":";
int ss  = 0;
int mm  = 0;
int hh  = 0;
int day = 0;        
int mon = 0;     
int yr  = 0;
int dow = 0;  
int Temp0 = 0;
char WW1[8][24] = { "0","Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"};

void getTime0(){
   // Обновляем внутренние данные модуля (если библиотека поддерживает refresh)
rtc.refresh();
ss  = rtc.second();
mm  = rtc.minute();
hh  = rtc.hour();
day = rtc.day();        // день месяца
mon = rtc.month();      // месяц
yr = 2000 + rtc.year(); // год (uRTCLib возвращает год относительно 2000)
dow = rtc.dayOfWeek();  // день недели (1..7)
Temp0 = rtc.temp()/100.0f;;
Serial.println(yr+de1+mon+de1+day+de1+ WW1[dow]+" "+hh+de2+mm+de2+ss+" "+de1+Temp0);
}

void setup() {
  Serial.begin(9600);
  URTCLIB_WIRE.begin();
  //_______ ss, mm, hh, w, dd, mm, yy 26=2026________
  //rtc.set(30, 22, 12, 1, 4,  5,  26);//____________
uint8_t temp_buffer = read_register(0x0e) & 0b11100111;
// поднимаем флаг BBSQW - работа от батареи
temp_buffer = temp_buffer | 0b01000000;
// устанавливаем ~EOSC и INTCN в 0 - запускаем генератор
temp_buffer = temp_buffer & 0b01111011;
// записываем контрольный бит
write_register(0x0e, temp_buffer);
 
  delay(3000); // читать каждую секундуgetTime0();
  getTime0();
}

void loop() {
  //delay(1000); // читать каждую секундуgetTime0();
  //getTime0();
}

Ругается на read_register? LДА!

Кэп, А почем-то оно ругается я сделал как Вы сказали?

А это я для кого привел?

Кэп, не понятно? Можно рабочий version?

Вставьте код из сообщения по ссылке выше перед setup()

Говорит отказано в доступе это мой квас!

#define CLOCK_ADDRESS 0x68 uint8_t shSimpleRTC::read_register(uint8_t reg) { Wire.beginTransmission(CLOCK_ADDRESS); 
Wire.write(reg); Wire.endTransmission(); Wire.requestFrom(CLOCK_ADDRESS, 1);
return Wire.read();
 }

void shSimpleRTC::write_register(uint8_t reg, uint8_t data){ 
Wire.beginTransmission(CLOCK_ADDRESS);
Wire.write(reg); Wire.write(data);
Wire.endTransmission();

Здесь ничего не пропущено!?
Дайте, пожалуйста, полный код неразбериха!

Я дал вам код. Если вы не в состоянии перейти по ссылке и скопировать его - это уже не моя проблема :wink:

интересно, я один это вижу в сообщениях ТС ? Может у меня глюки? :slight_smile:

конечно он не в состоянии. Ты его забыл что ли? Посылай его сразу

Спасибо, вроде бы катит все как надо!!
Как заряжать батаейрку?

// Пример: uRTCLib + DS3231
//author: Alunts Arthur Arthurovich;
//Kamil v ad;
//Pikunov v ad;

#include "uRTCLib.h"
uRTCLib rtc(0x68); // адрес 0x68 для DS3231
String de1="/";
String de2=":";
int ss  = 0;
int mm  = 0;
int hh  = 0;
int day = 0;        
int mon = 0;     
int yr  = 0;
int dow = 0;  
int Temp0 = 0;
char WW1[8][24] = { "0","Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"};
#define CLOCK_ADDRESS 0x68

uint8_t read_register(uint8_t reg)
{
  Wire.beginTransmission(CLOCK_ADDRESS);
  Wire.write(reg);
  Wire.endTransmission();
  Wire.requestFrom(CLOCK_ADDRESS, 1);
  return Wire.read();
}

void write_register(uint8_t reg, uint8_t data)
{
  Wire.beginTransmission(CLOCK_ADDRESS);
  Wire.write(reg);
  Wire.write(data);
  Wire.endTransmission();
}
void getTime0(){
   // Обновляем внутренние данные модуля (если библиотека поддерживает refresh)
rtc.refresh();
ss  = rtc.second();
mm  = rtc.minute();
hh  = rtc.hour();
day = rtc.day();        // день месяца
mon = rtc.month();      // месяц
yr = 2000 + rtc.year(); // год (uRTCLib возвращает год относительно 2000)
dow = rtc.dayOfWeek();  // день недели (1..7)
Temp0 = rtc.temp()/100.0f;;
Serial.println(yr+de1+mon+de1+day+de1+ WW1[dow]+" "+hh+de2+mm+de2+ss+" "+de1+Temp0);
}

void setup() {
  Serial.begin(9600);
  URTCLIB_WIRE.begin();
  //_______ ss, mm, hh, w, dd, mm, yy 26=2026________
//rtc.set(30, 45, 14, 1, 4,  5,  26);      //____________
uint8_t temp_buffer = read_register(0x0e) & 0b11100111;
// поднимаем флаг BBSQW - работа от батареи
temp_buffer = temp_buffer | 0b01000000;
// устанавливаем ~EOSC и INTCN в 0 - запускаем генератор
temp_buffer = temp_buffer & 0b01111011;
// записываем контрольный бит
write_register(0x0e, temp_buffer);
 
  delay(3000); // читать каждую секундуgetTime0();
  getTime0();
}

void loop() {

 delay(1000); // читать каждую секундуgetTime0();
 getTime0();


}

Зато, типа, решил самостоятельно :sweat_smile:

конечно сам!

“вы мне ничем не помогли!” (с)

В чем обида-то?
-Я же Вас знаю:Вы меня любите, я себя тоже.
-Я опубликовал готовый вариант (полный код).
В любом случае Огромное Спасибо за Ваш Бесценный Труд.)))
Кстати. А Вам слабо?