sleep mode и потребление энергии

lacost
Offline
Зарегистрирован: 29.11.2017

Atmega328P. 

Исследую низкое энергопотребление. Задача думаю стандартная - раз в n минут проснуться, опросить датчики, передать по радио и обратно уснуть.

Датчики DS18B20, радио - XD-RF-5V (433 MHZ)

Либы VirtualWire.h и OneWire.h

Все работает и датчики и радио, и засыпает. А вот экономия энергопотребления - нет. В рабочем  режиме 63ма, в спящем 43ма. Ни каких 0.36 mA (что пишут в интернетах) нет.

Просыпается по таймеру.  Режим SLEEP_MODE_PWR_DOWN. Ипользовал и чистые примеры из 

#include <avr/sleep.h>

#include <avr/power.h>

#include <avr/wdt.h>

 

и использовал библиотеку Sleep_n0m1

Результат примерно один и тот же.

Куда копать?

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

А схема подключения? Шар мутный  -не показывает. Да и в скетче у вас  ошибка.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

lacost пишет:

Куда копать?

Для начала, показать скетч и схему. Например, чем Вы её (Atmega328P) кормите? Ну и много всего, давайте скетч и схему, не может она столько в режиме сна отжирать. Она у Вас точно спит?

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

 давайте скетч и схему, не может она столько в режиме сна отжирать. Она у Вас точно спит?

ну почему не может - если радио остается включенным и на ардуине USB и регулятор напряжения не удалены - так и будет.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вот и я ж про тоже

lacost
Offline
Зарегистрирован: 29.11.2017

Далее не вижу смысла. чтение температуры и прочая рутина.

 

Запитано 9В от БП в разъем питания.

b707
Offline
Зарегистрирован: 26.05.2017

lacost. вставьте код как положено - так не только обсуждать, читать-то неудобно.

Во-вторых - ответьте на вопросы:

 - что за ардуина или микроконтроллер

- если это стандартная плата типа Нано или Уно - модифицировали ли вы ее - удаляли светодиоды, регулятор напряжения, USART

- как отправляете в сон передатчик 433 МГц

lacost
Offline
Зарегистрирован: 29.11.2017
#include <VirtualWire.h>
#include <OneWire.h>
#include <Sleep_n0m1.h>


const int transmit_pin = 12;
const int receive_pin = 2;
const int DS_PIN = 8;


const int ACK = 6;
const int RETRY = 3;

const byte ROOM_TEMP = 1;
const byte LINE_TEMP = 2;
const byte VCC = 3;

uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;

int rxtx_wail_timeout = 500; 

//28 FF AC 77 6A 14 4 D
//28 FF E3 5A 65 14 3 BA
byte room_temp[] = { 0x28, 0xFF, 0xAC, 0x77, 0x6A, 0x14, 0x04, 0x0D }; //26-30
byte line_temp[] = { 0x28, 0xFF, 0xE3, 0x5A, 0x65, 0x14, 0x03, 0xBA }; //19-24

int server_addr = 12345; // 433mhz-server address
int this_addr = 23456;  // this device address

Sleep sleep;
unsigned long sleepTime; //how long you want the arduino to sleep

OneWire ds(DS_PIN); // ds-sensors pin


void setup() {

  delay(1000);
  Serial.begin(9600);  // Debugging only
  Serial.println("setup");

  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  
  // Initialise the IO and ISR
  vw_set_tx_pin(transmit_pin);
  vw_set_rx_pin(receive_pin);
  vw_set_ptt_inverted(true); // Required for DR3100
  vw_setup(1000);   // Bits per sec

  sleepTime = 20000; //set sleep time in ms, max sleep time is 49.7 days
 
}

byte count = 1;

void loop() {

  

  Serial.print("Temp on 1-st sensor:");
  Serial.println(get_temp(room_temp));

  Serial.print("Temp on 2-nd sensor:");
  Serial.println(get_temp(line_temp));

  Serial.print("Vcc = ");
  Serial.println(get_vcc());

  //send data to server
  send_data(ROOM_TEMP, round(get_temp(room_temp)));
  send_data(LINE_TEMP, round(get_temp(line_temp)));
  send_data(VCC, round(get_vcc())); 
  
  sleep.pwrDownMode(); //set sleep mode
  sleep.sleepDelay(sleepTime); //sleep for: sleepTime

}


int send_data(int key, int value) {

  int data[] = {server_addr, this_addr, key, value};
  byte retry = RETRY;
  byte receive = 0;
  
  do {
    vw_send((uint8_t *)data, sizeof(data));
    vw_wait_tx();
    vw_rx_start();
    Serial.println("Send msg");
    if(vw_wait_rx_max(rxtx_wail_timeout)) {
      if (vw_get_message(buf,&buflen)) {  // Non - blocking
        Serial.print("Got:  ");Serial.println(char(buf[0]), HEX);
        if ( int(char(buf[0]) == ACK)){
          receive = 1;
          Serial.println("Receiv ACK");
        }
      }
    } else {
      Serial.println("Timeout. Retry");
      delay(random(0, 1000));
    }
  } while (--retry > 0 && !receive);

  return receive;
}

 

lacost
Offline
Зарегистрирован: 29.11.2017

Ардуино - стандартная UNO. Никаких модификаций.

В сон отправляю только так:

sleep.pwrDownMode(); //set sleep mode
sleep.sleepDelay(sleepTime); //sleep for: sleepTime
 
Как отправлять в сон передатчик и термометр - не знаю. Я надеялся что магия сделает все сама.
Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

А ты попробуй вынуть микроконтроллер и померять потребление твоей уно без него.Может навеет койкакой мысЛ в моск.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

lacost пишет:

Ардуино - стандартная UNO. Никаких модификаций.

Ну, так бы сразу и сказали! А то в первом посте было

lacost пишет:

Atmega328P.

Думал - голая.

Ну, в таком случае Вам всё правильно сказали.

lacost
Offline
Зарегистрирован: 29.11.2017

Сказали то наверное правильно, да видно автор очень большой мастер, что особо ничем и не помог, кроме как обратил внимание на то, что "навесное" само по себе не отключается и его надо каким-то образом отключить. 

Кроме Максима Максимовича кто-то наверное решал такие задачи - подскажите, каков общий принцип построения подобного решения? Как решается вопрос с отключением питания навесного оборудования?

b707
Offline
Зарегистрирован: 26.05.2017

lacost пишет:

 Кроме Максима Максимовича кто-то наверное решал такие задачи - подскажите, каков общий принцип построения подобного решения? Как решается вопрос с отключением питания навесного оборудования?

Вопрос с оборудованием решается кардинально - путем его удаления.

Во-первых, решения для экономичных девайсов строятся не на готовых платах Уно/Нано, а на голом контроллере Атмега328Р - так как обвзяка на плате ардуино сама по себе жрет до 15мА и ее наличие делает  спящий режим бессмысленным.

Во-вторых, все внешние элементы контрукции - датчики, радомодули, блютуз и тд - должны либо иметь свой собственный режим сна, либо их надо полностью отключать от питания при простое - например при помощи транзисторных ключей. Если оборудование не умеет спать и его почему-либо нельзя отключать от питания -  низкого потребления с такими элементами не получишь и значит это оборудование не подходит для экономичных девайсов.

 

lacost
Offline
Зарегистрирован: 29.11.2017

Так, становится понятнее. Т.е. нужно перед уходом в сон отдельно отключать питание подаваемое на радиомодуль и термодатчик, а при пробуждении - подавать на них питание и проводить инициализацию. ок.

А что не так с UNO? Я в теоретических прикидках рассчитывал, что мне хватить какой-нибудь кроны на примерно год работы просыпаться раз в 5-10 минут, отправлять температуру и снова засыпать? или это только в теории?

b707
Offline
Зарегистрирован: 26.05.2017

lacost пишет:

А что не так с UNO? Я в теоретических прикидках рассчитывал, что мне хватить какой-нибудь кроны на примерно год работы просыпаться раз в 5-10 минут, отправлять температуру и снова засыпать? или это только в теории?

Те цифры, про которые вы говорили вначале - типа 0.35мА в режиме сна - относятся к голому МК Атмега328. На плате Уно, кроме самого МК, есть еще регулятор напряжения и плата сопряжения с USB, которые жрут примерно столько же, как и сам МК (10-15мА), но, в отличии от контроллера, в сон не уходят. Чтобы получить из Уно долгоиграющий девайс, народ удаляет с платы все лишнее - или просто перерезает дорожки. ведущие к этим элементам.

Что касается "год на Кроне" - то это вкорне неверный подход, так как Крона имеет 9в - и значит для нее нужен преобразователь напряжения, который будет есть больше, чем сам микроконтроллер. Экономичные девайсы обычно питают источниками 2.5-4 в.

Кроме того,  кажется даже для голого МК вы черезчур оптимистичны. Найдите в Гугле емкость Кроны и разделите на потребление Атмеги в спящем режиме

lacost
Offline
Зарегистрирован: 29.11.2017

Год - это я примерно сказал. Для 0,35мА выходило что-то порядка 280 дней в полном покое. Меня устроит и 2-3 месяца автономки.

А можно ли питание навесного повесить на цифровые выводы платы? термодатчик на свою, радио на свою. 40 мА должно хватить для питания.

b707
Offline
Зарегистрирован: 26.05.2017

lacost пишет:

Год - это я примерно сказал. Для 0,35мА выходило что-то порядка 280 дней в полном покое.

У вас что-то с математикой. Емкость Кроны 500-600 мА*Ч. Даже при 100% КПД преобразования напряжения 9в ->5в (что на практике далеко от истины) мой калькулятор обещает мне не более 4х месяцев работы. В любом случае. использование источника с напряжением более 5в изначально неэффективно.

Потребители можно сажать на пины, если ток не больше 40 мА. Однако у большинства передатчиков в режиме передачи ток больше. Термодатчик жрет очень мало по сравнению со всем остальным, на первом этапе можете его не учитывать.

lacost
Offline
Зарегистрирован: 29.11.2017

Не придирайтесь. Я даже не представлял себе что на преобразование 9->5 что-то тратится. Суть вовсе не в этом.  спасибо что подскали.

Попробую сегодня вечером повесить на цифровые каналы передатчик и термодатчик. Если будут проблемы - заведу их через оптопару.

Как пройдет - напишу.

Спасибо за помощь.

b707
Offline
Зарегистрирован: 26.05.2017

lacost пишет:

Попробую сегодня вечером повесить на цифровые каналы передатчик и термодатчик. Если будут проблемы - заведу их через оптопару.

Через оптопару, подозреваю, у вас ничего не выйдет - слишком большое падение напряжения на фототранзисторе. Тут нужен низкомный мосфет.

Хотя могу ошибаться, я в этом не очень разбираюсь... Надеюсь. другие подскажут.

vdm
vdm аватар
Offline
Зарегистрирован: 29.08.2016

lacost пишет:

Если будут проблемы - заведу их через оптопару.

 

А чем транзистор не подходит?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

ТС, вам в любом случае надо будет добиваться потребления максимум в 100 мкА, иначе даже смысла нет получать компактное долгоиграющее устройство.

ЗЫ. Я тут свое подсчитал потребление 562 мкА - работа от батарейки максимум 29 дней (

и что то "великовата" задача для Atmega328P..... - попроще что нибудь выберете