Энергоэффективный режим работы с DS3231 пробуждение arduino по будильнику.
- Войдите на сайт для отправки комментариев
Планируется, что 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); }
Мне кажется, либо Вы действительно задаете вопрос на аппаратную тему (ток - категория электрическая, но не программная), но при этом вместо схемы подключения приводите скетч?
Вот схема подключения часов, питание идет с ноги 8, чтобы в спящем режиме было потребление меньше, если подключать к VCC arduino то ток в спящем режиме еще больше (примерно на 300мкА), а так перед сном я отправляю 8 пин в режим INPUT LOW и модуль часов питается от своей батарейки, а после сна перед спросом времени с часов я снова возвращаю питание, жду пару милисекунд, отправляю запрос и часы мне отвечают.
а, электрическая схема будет? - хотя бы часть где жрётся ток.
Вот приблизительная схема, слева то что на плате DS3231, справа контролер. Когда режим сна ток утекает через 10кОм. в момент срабатывания будильника сопротивления порядка 40 Ом. Нога подтягивается к земле и контролер просыпается. В идеале было бы если эти 10кОм заменить на 500кОм или мегаОмы ) но я пока не понял, это сопротивление внутри кристала микросхемы или в обвязке на плате.
Еще добавлю, что такая фигня не с одной платой DS3231. То есть это, специально заложено для чего-то.
Проблема решена, только я не совсем понимаю почему так. Попробую подробно расписать возможно кому-то пригодиться:
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 ток сохранялся. Вот что я понять не могу.
оптопарой отвязаться не пробовали?
Доброго дня Вам, спасибо за публикацию. Озобочен такой же проблемой. Хочу будильником DS3231 "будить" атмегу 328 раз в час призводить опрос 30 термодатчиков и записав их показания на SD снова отправлять контроллер в сон. Моя плата DS3231 запитанная через VCC потребляет 7-8 mA. Если её запитать от ноги контроллера то при его "засыпании" часы начинают потреблять 10-12 mA. При этом на вэходе SQW не появляется сигнал срабатывания будильника. Насколько я понимаю, Вам удалось заставить SQW работать от Vbat, а вот каким образом я не понял.
Вывод МК, от которого запитываете, переводите в режим INPUT. Также на выводах SDA SCL остается напряжение и ток будет утекать через них. На время сна переводите в INPUT и их.
Для Ардуино:
Почитал datasheet на DS323. SQW, SDA,SCL это выводы с открытым стоком и должны быть подтянуты к питанию(max 5.5V). Судя по схеме выше, в этом модуле они подтянуты к VCC, а не к VBAT. Сответственно при питании от VBAT они не работают, т.к. диод D1 запирается. Чтобы SQW работал от батареи, надо ставить внешний подтягивающий резитор к VBAT.
Время прошло конечно много по этой теме. Но всё равно спрошу здесь.
При подключении по схеме автора, без перепайки подтягивающих резисторов, ( только выпаяны светодиод и зарядка) потребление во сне 650 мкА, многовато. Как мне добиться хотя бы 300 мкА как везде описано.
Правильно ли я понял, что надо прописать в коде так: