Прерывания RTC и монетные батареи
Обзор
У меня проблемы с тем, что мой RTC быстро разряжает батарейки типа «таблетка» — новые батарейки разряжаются за несколько месяцев. RTC настроен на сигнал прерывания каждые 5 минут, и мне интересно, если к цепи не подключено другое питание, достаточно ли этого для разрядки батарейки?
Подробности и способы устранения неполадок:
Проблемы с моими часами реального времени. Если я оставлю схему без питания на несколько дней (так что единственное питание для часов реального времени будет поступать от резервной батарейки), время сбрасывается на 00:00 1 января 2000 года. это происходит сразу, когда я отключаю его. Если отключаю от компа, на следующий день снова включаю, время нормальное. Если я оставлю его отключенным на несколько дней, а затем включу, дата сбрасывается.
Это говорит о том, что аккумулятор разряжен. Поэтому я проверил его с помощью моего измерителя (и нагрузки 100 Ом, как описано здесь: https://www.youtube.com/ смотреть?v=HcikzMG7mMU). И действительно, уровень заряда значительно снизился по сравнению с начальным значением 3 В.
Все это хорошо, за исключением того, что этой батарее всего несколько месяцев, а в часах реального времени ее должно хватить на годы. У меня есть две батареи, купленные в прошлом году и использованные в модулях RTC, и обе они сейчас разряжены.
Моя текущая гипотеза заключается в том, что после того, как я отключил свою схему от компьютера, RTC продолжает работать на ячейке монеты, запуская прерывания каждые 5 минут, и именно эти прерывания вызывают утечку. Имеет ли это смысл? Если нет, что еще я могу проверить?
Настройка
Макетная плата arduino, DS3231 RTC на коммутационной панели, подключена
- RTC SDA -> Arduino A4
- RTC SCL -> Arduino A5
- Заземление RTC -> Общее заземление
- RTC VCC -> Общий 5 В (от кабеля ftdi/USB при подключении)
- RTC SQW -> Arduino D2
На RTC установлен низкий уровень, а на выводе SQW между прерываниями поддерживается напряжение 5 В. С моим мультиметром кратковременное падение до «LOW» невозможно обнаружить. Я также не могу обнаружить ток на выводе SQW с помощью мультиметра.
Скетч
Включая только код, относящийся к RTC (SD-карта и биты температуры удалены).
/*-(Import required libraries)-*/
#include <Time.h>
#include <DS3232RTC.h> //источник: https://github.com/JChristensen/DS3232RTC
/*-( Declare Constants )-*/
const int wakeUpPin = 2;
#define resolution 5 // частота выхода из спящего режима в минутах
/*-(Declare Variables)-*/
time_t t;
int nextLoop;
/****** SETUP: RUNS ONCE ******/
void setup()
{
Serial.begin(9600);
Serial.println();
pinMode(wakeUpPin, INPUT);
t = RTC.get();
nextLoop = ((minute(RTC.get()) / resolution) + 1) * resolution;
if (nextLoop >= 60) {
nextLoop -= 60;
}
Serial.print(RTC.temperature());
Serial.print(",");
Serial.print(RTC.oscStopped());
Serial.print(",");
Serial.println(nextLoop); // минуты, когда будет снято следующее чтение
}
/****** LOOP: RUNS CONSTANTLY ******/
void loop()
{
t = RTC.get();
Serial.print(year(t), DEC);
Serial.print("/");
Serial.print(month(t), DEC);
Serial.print("/");
Serial.print(day(t), DEC);
Serial.print(",");
Serial.print(hour(t), DEC);
Serial.print(",");
Serial.print(minute(t), DEC);
Serial.print(",");
Serial.print(second(t), DEC);
Serial.print(",");
goToSleep();
}
void goToSleep(void) {
Serial.print("Sleeping until: ");
Serial.println(nextLoop);
Serial.flush();
RTC.setAlarm(ALM2_MATCH_MINUTES, nextLoop, 1, 1);
RTC.alarmInterrupt(ALARM_2, true);
attachInterrupt(0, wakeUp, LOW);
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
detachInterrupt(0);
RTC.alarm(ALARM_2);
nextLoop += resolution;
if (nextLoop >= 60) {
nextLoop -= 60;
}
}
void wakeUp(){
// Обработчик прерывания контакта.
}
@Tyler, 👍4
Обсуждение2 ответа
1) Возможно, короткое замыкание на вашей печатной плате. Как было предложено, попробуйте другой модуль, если это возможно.
2) Не следует ли каким-то образом запрограммировать вывод SQW на прерывание? Насколько я помню, по умолчанию он выводит прямоугольную волну.
3) Попробуйте вызвать clearAlarm();
, чтобы ваш RTC посмотрел, как все работает.
4) Имея там RTC, подключив GND и цифровой вход от Arduino, вы можете digitalRead();
контакт? Таким образом, вы увидите , продолжает ли он запускать прерывания.
Проверьте аккумулятор, он ведет себя как аккумулятор без зарядного устройства. У меня в конце артикула буква "R". Модулей RTC, которые заряжают батарею, очень много. И наоборот, некоторые из них не заряжают аккумулятор. Вы питаете его от чего-то другого, кроме батарейки-таблетки?
- резервный аккумулятор для FeatherWing DS3231, RTC
- Преобразование в Unix Timestamp и обратно
- Разница между «time_t» и «DateTime»
- Создание таймера с использованием часов реального времени с указанием времени начала и остановки
- Питание esp32cam от аккумулятора
- Могу ли я иметь резервное питание для устройства Arduino?
- DS1307RTC Выводит загадочную дату 165/165/2165. Какие возможны исправления?
- Блок питания для Seeeduino Xiao
Извините, вероятно, ваша батарея разряжается не из-за этого. К аккумулятору подключено что-то еще, кроме RTC?, @SoreDakeNoKoto
Ничего больше к монетоприемнику не подключено — это часть коммутационной платы RTC., @Tyler
У вас есть другой RTC для сравнения с этим на случай, если он каким-то неочевидным образом поврежден? Какое было напряжение, когда вы измерили его через несколько дней, и оно больше не могло питать RTC? Батарея типа «таблетка» — CR2032, верно?, @SoreDakeNoKoto
Если я правильно помню, прерывания отключены, пока на DS3231 не подается питание (кроме как через батарею). Вы говорите, что батарея разряжается после нескольких месяцев без питания или после нескольких месяцев без питания (а иногда и без питания). Какой прорыв вы используете? В некоторых прорывах используются перезаряжаемые батареи. Установка в них обычной батареи повредит батарею и объяснит короткий срок службы., @Gerben
Есть ли на коммутационной плате подтягивающий резистор для SQW? Если нет, вы можете попробовать контактный режим INPUT_PULLUP или внешнее подтягивание., @Mikael Patel
Если DS3231 подключен к цепи (питанию), а сам Arduino не выключен, то он вообще не должен использовать батарею, будь то сигналы тревоги или нет. Либо какой-то провод подключен неправильно, либо необходимо заменить RTC, чтобы проверить, сохраняется ли проблема. Кстати, у DS3231 есть внутренние подтяжки. Они работают настолько хорошо, что если у вас есть один на вашем I2C, вы не хотите добавлять другие, потому что тогда они параллельны, что снижает их эффективное сопротивление. Кроме того, I2C подключен к аналоговым контактам (A4 и A5), поэтому INPUT_PULLUP не применяется., @SDsolar
Только что поймал, где вы говорите, что проблема возникает, когда вы полностью отключаете цепь. Я делал это в течение нескольких недель, предварительно запрограммировав несколько DS3231, которые я оставил отключенными на своем рабочем месте для быстрой установки. Они всегда сохраняли время и дату, хотя и с некоторым отклонением. Поэтому, если ваш RTC исправен, это должно быть какое-то внешнее отключение, вызванное схемой., @SDsolar