Технический форум
Вернуться   Технический форум > Электроника, самоделки и техника > Форум по электронике > Электроника для начинающих


Ответ
 
Опции темы Опции просмотра
Старый 27.10.2017, 16:28   #1 (permalink)
Antoshk
Новичок
 
Регистрация: 10.02.2015
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Энергоэффективный режим работы Arduino с DS3231

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

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

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

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

Код:
#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() {
  pinMode(wakePin, INPUT_PULLUP);
  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);
}
Подскажите как можно устранить ток по линии SQW.
Antoshk вне форума   Ответить с цитированием

Старый 27.10.2017, 16:28
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Пожалуйста, просмотрите данные топики, скорее всего там будет решение вашего вопроса

Двухканальный режим работы памяти
Режим работы А транзистора
Samsung 710 N - неоптимальный режим работы
Странный режим работы машины

Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Метки
arduino, ds3231, lowpower


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 19:50.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.