Энергоэффективный режим работы с DS3231 пробуждение arduino по будильнику.

Anton991
Offline
Зарегистрирован: 09.10.2017

Планируется, что Arduino pro mini обвешаная дачтиками, питающаяся от батареек будет производить измерения 1 раз в час слать их по радио и засыпать, через час по будильнику DS3231 просыпаться повтрять то же самое. Все вроде работает но есть одно НО, которое все портит. Потребление в режиме сна 300 мкА!

250 мкА из которых утекают по линии SQW которая будет arduino. 

То есть если arduino спит без часов потребление 30-40 мкА (что устраивает). Но если подключить часы а именно линию SQW то паразитный ток все портит. Если в линию последовательное ставить резистр, то ток уменьшается но arduino уже не просыпается. 

Ниже код урезанный именно та часть которая отвечает за сон и пробуждение (так то линия запитки и дачтиков висит на одной из ног дуины, перед сном они переводятся в состояние INPUT, что посзволило снизить с единиц мА до десятков мкА).

Подскажите как можно устранить ток по линии SQW.

#include <DS3231.h>
#include <Wire.h> 
#include <LowPower.h>
#include <avr/sleep.h> 
#include <avr/power.h>
#include <SPI.h>
#include <Streaming.h>


#define wakePin 2 

DS3231 clock;
RTCDateTime dt;

void setup() {
  clock.begin();
  clock.enableOutput(false);
  clock.armAlarm1(false);
  clock.armAlarm2(false);
  clock.clearAlarm1();
  clock.clearAlarm2();
}

void loop() {
    
        setSleepTimer(1);
        sleepNow();
        }
  }

void wakeUp()
{
    // Just a handler for the pin interrupt.
}

void setSleepTimer(int mins) {
  uint8_t hours = mins / 60;
  uint8_t mins_left = mins - hours * 60;
  dt = clock.getDateTime();
  uint8_t hnow = dt.hour;
  uint8_t mnow = dt.minute;
  uint8_t sec = dt.second;
  mnow += mins_left;
  if (mnow >= 60) {
    mnow -= 60;
    hnow += 1;
  }
  hnow += hours;
  if (hnow > 23) {
    hnow -= 24;
  }
  clock.setAlarm1(0, hnow, mnow, sec, DS3231_MATCH_H_M_S);
}

  
void sleepNow() {
  ADCSRA = 0;
  power_all_disable();
  attachInterrupt(0, wakeUp, LOW);
  
  PINs_to_sleep();
  
  LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); 
  sleep_enable();  
  sleep_mode();  
  sleep_disable();
  power_all_enable();
  detachInterrupt(0);
  
  PINs_to_work();
  
  delay(100);
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Мне кажется, либо Вы действительно задаете вопрос на аппаратную тему (ток - категория электрическая, но не программная), но при этом вместо схемы подключения приводите скетч?

Anton991
Offline
Зарегистрирован: 09.10.2017

Вот схема подключения часов, питание идет с ноги 8, чтобы в спящем режиме было потребление меньше, если подключать к VCC arduino то ток в спящем режиме еще больше (примерно на 300мкА), а так перед сном я отправляю 8 пин в режим INPUT LOW и модуль часов питается от своей батарейки, а после сна перед спросом времени с часов я снова возвращаю питание, жду пару милисекунд, отправляю запрос и часы мне отвечают.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

а, электрическая схема будет? - хотя бы часть где жрётся ток.

Anton991
Offline
Зарегистрирован: 09.10.2017

Вот приблизительная схема, слева то что на плате DS3231, справа контролер. Когда режим сна ток утекает через 10кОм. в момент срабатывания будильника сопротивления порядка 40 Ом. Нога подтягивается к земле и контролер просыпается. В идеале было бы если эти 10кОм заменить на 500кОм или мегаОмы ) но я пока не понял, это сопротивление внутри кристала микросхемы или в обвязке на плате.

Anton991
Offline
Зарегистрирован: 09.10.2017

Еще добавлю, что такая фигня не с одной платой DS3231. То есть это,  специально заложено для чего-то.

Anton991
Offline
Зарегистрирован: 09.10.2017

Проблема решена, только я не совсем понимаю почему так. Попробую подробно расписать возможно кому-то пригодиться: 

1) Arduino Pro mini обвязана датчиками 3 из которых подключены по OneWire а три напрямую к аналоговым входам A0,1,2. Подключен радиомодуль по интефейсу SPI. И подключены часы DS3231 по I2C. 

2) Так как устройство должно работать очень эрегоэффективно, условно говоря закопано в землю на пару лет. То питани датчиков и часов заведены на ножки контролера а не на общую шину VCC. питание датчиков 8 нога, питание часов 5 (в принципе можно их и на одну их сумарное потребление около 3 мА), питание радиомодуля от общей шины, так как опытным путем измерено что он в покое абсолютно ничего не потребляет ну возможно от 0 до 1 мкА. 

3) pro mini в спящем режиме потребляет от 10 до 20 мкА, потребление наверное зависит от прошивки, но от чего именно в скетче я точно сказать не могу. 

4) Как часы подключены указано в сообщениях выше. Еще мне пригодилась вот эта схемка самого модуля

на ней видно что SQW подтянута 4.7 кОм (сборка резисторов RP1) к VCC, я решил попробовать обрезать эту дорожку и вместо 4.7кОм поставить сопротивление по более. Поставил и о чудо проблема решилась, потребление с 300 мкА упало до 20 мкА, и будильник сробатывает и пробуждает arduino.

Вывод: каким то образом ток рассеивался на этом RP1, хотя он подтягивает к линии VCC.

p.s до этого когда искал место утечки, ток исчезал когда я отключал от часов линии SQW или GND, но при отключении линии VCC ток сохранялся. Вот что я понять не могу. 

M0ld0vanin
Offline
Зарегистрирован: 12.01.2016

оптопарой отвязаться не пробовали?

rumatapolar
Offline
Зарегистрирован: 14.07.2017

Доброго дня Вам, спасибо за публикацию. Озобочен такой же проблемой. Хочу будильником DS3231 "будить" атмегу 328 раз в час призводить опрос 30 термодатчиков и записав их показания на SD снова отправлять контроллер в сон. Моя плата DS3231  запитанная через VCC потребляет 7-8 mA. Если её запитать от ноги контроллера то при его "засыпании"  часы начинают потреблять 10-12 mA. При этом на вэходе SQW не появляется сигнал срабатывания будильника.  Насколько я понимаю, Вам удалось  заставить SQW работать от Vbat, а вот каким образом я не понял.

ikrred1
Offline
Зарегистрирован: 26.09.2018

Вывод МК, от которого запитываете, переводите в режим INPUT. Также на выводах SDA SCL остается напряжение и ток будет утекать через них. На время сна переводите в INPUT и их.

Для Ардуино:

pinMode(A4,INPUT);
pinMode(A5,INPUT);

 

ikrred1
Offline
Зарегистрирован: 26.09.2018

Почитал datasheet  на DS323. SQW, SDA,SCL  это выводы с открытым стоком и должны быть подтянуты к питанию(max 5.5V). Судя по схеме выше, в этом модуле они подтянуты к VCC, а не к VBAT. Сответственно при питании от VBAT они не работают, т.к. диод D1 запирается. Чтобы SQW работал от батареи, надо ставить внешний подтягивающий резитор к VBAT.

S_Sergey_G
Offline
Зарегистрирован: 27.01.2021

Время прошло конечно много по этой теме. Но всё равно спрошу здесь.

При подключении по схеме автора, без перепайки подтягивающих резисторов, ( только выпаяны светодиод и зарядка) потребление во сне 650 мкА, многовато. Как мне добиться хотя бы 300 мкА как везде описано.

Правильно ли я понял, что надо прописать в коде так:

    pinMode(8,OUTPUT); // пин питания RTC
    pinMode(A4,INPUT);  // SDA
    pinMode(A5,INPUT);  // SCL
------------------------------
   digitalWrite(8, LOW);
   digitalWrite(4, LOW);
   digitalWrite(5, LOW);
и с SQW поставить сопротивление к Vbat ни чего не перепаивая?