sleep mode и потребление энергии
- Войдите на сайт для отправки комментариев
Ср, 29/11/2017 - 17:06
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
Результат примерно один и тот же.
Куда копать?
А схема подключения? Шар мутный -не показывает. Да и в скетче у вас ошибка.
Куда копать?
Для начала, показать скетч и схему. Например, чем Вы её (Atmega328P) кормите? Ну и много всего, давайте скетч и схему, не может она столько в режиме сна отжирать. Она у Вас точно спит?
давайте скетч и схему, не может она столько в режиме сна отжирать. Она у Вас точно спит?
ну почему не может - если радио остается включенным и на ардуине USB и регулятор напряжения не удалены - так и будет.
Вот и я ж про тоже
Далее не вижу смысла. чтение температуры и прочая рутина.
Запитано 9В от БП в разъем питания.
lacost. вставьте код как положено - так не только обсуждать, читать-то неудобно.
Во-вторых - ответьте на вопросы:
- что за ардуина или микроконтроллер
- если это стандартная плата типа Нано или Уно - модифицировали ли вы ее - удаляли светодиоды, регулятор напряжения, USART
- как отправляете в сон передатчик 433 МГц
#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; }Ардуино - стандартная UNO. Никаких модификаций.
В сон отправляю только так:
А ты попробуй вынуть микроконтроллер и померять потребление твоей уно без него.Может навеет койкакой мысЛ в моск.
Ардуино - стандартная UNO. Никаких модификаций.
Ну, так бы сразу и сказали! А то в первом посте было
Atmega328P.
Думал - голая.
Ну, в таком случае Вам всё правильно сказали.
Сказали то наверное правильно, да видно автор очень большой мастер, что особо ничем и не помог, кроме как обратил внимание на то, что "навесное" само по себе не отключается и его надо каким-то образом отключить.
Кроме Максима Максимовича кто-то наверное решал такие задачи - подскажите, каков общий принцип построения подобного решения? Как решается вопрос с отключением питания навесного оборудования?
Кроме Максима Максимовича кто-то наверное решал такие задачи - подскажите, каков общий принцип построения подобного решения? Как решается вопрос с отключением питания навесного оборудования?
Вопрос с оборудованием решается кардинально - путем его удаления.
Во-первых, решения для экономичных девайсов строятся не на готовых платах Уно/Нано, а на голом контроллере Атмега328Р - так как обвзяка на плате ардуино сама по себе жрет до 15мА и ее наличие делает спящий режим бессмысленным.
Во-вторых, все внешние элементы контрукции - датчики, радомодули, блютуз и тд - должны либо иметь свой собственный режим сна, либо их надо полностью отключать от питания при простое - например при помощи транзисторных ключей. Если оборудование не умеет спать и его почему-либо нельзя отключать от питания - низкого потребления с такими элементами не получишь и значит это оборудование не подходит для экономичных девайсов.
Так, становится понятнее. Т.е. нужно перед уходом в сон отдельно отключать питание подаваемое на радиомодуль и термодатчик, а при пробуждении - подавать на них питание и проводить инициализацию. ок.
А что не так с UNO? Я в теоретических прикидках рассчитывал, что мне хватить какой-нибудь кроны на примерно год работы просыпаться раз в 5-10 минут, отправлять температуру и снова засыпать? или это только в теории?
А что не так с UNO? Я в теоретических прикидках рассчитывал, что мне хватить какой-нибудь кроны на примерно год работы просыпаться раз в 5-10 минут, отправлять температуру и снова засыпать? или это только в теории?
Те цифры, про которые вы говорили вначале - типа 0.35мА в режиме сна - относятся к голому МК Атмега328. На плате Уно, кроме самого МК, есть еще регулятор напряжения и плата сопряжения с USB, которые жрут примерно столько же, как и сам МК (10-15мА), но, в отличии от контроллера, в сон не уходят. Чтобы получить из Уно долгоиграющий девайс, народ удаляет с платы все лишнее - или просто перерезает дорожки. ведущие к этим элементам.
Что касается "год на Кроне" - то это вкорне неверный подход, так как Крона имеет 9в - и значит для нее нужен преобразователь напряжения, который будет есть больше, чем сам микроконтроллер. Экономичные девайсы обычно питают источниками 2.5-4 в.
Кроме того, кажется даже для голого МК вы черезчур оптимистичны. Найдите в Гугле емкость Кроны и разделите на потребление Атмеги в спящем режиме
Год - это я примерно сказал. Для 0,35мА выходило что-то порядка 280 дней в полном покое. Меня устроит и 2-3 месяца автономки.
А можно ли питание навесного повесить на цифровые выводы платы? термодатчик на свою, радио на свою. 40 мА должно хватить для питания.
Год - это я примерно сказал. Для 0,35мА выходило что-то порядка 280 дней в полном покое.
У вас что-то с математикой. Емкость Кроны 500-600 мА*Ч. Даже при 100% КПД преобразования напряжения 9в ->5в (что на практике далеко от истины) мой калькулятор обещает мне не более 4х месяцев работы. В любом случае. использование источника с напряжением более 5в изначально неэффективно.
Потребители можно сажать на пины, если ток не больше 40 мА. Однако у большинства передатчиков в режиме передачи ток больше. Термодатчик жрет очень мало по сравнению со всем остальным, на первом этапе можете его не учитывать.
Не придирайтесь. Я даже не представлял себе что на преобразование 9->5 что-то тратится. Суть вовсе не в этом. спасибо что подскали.
Попробую сегодня вечером повесить на цифровые каналы передатчик и термодатчик. Если будут проблемы - заведу их через оптопару.
Как пройдет - напишу.
Спасибо за помощь.
Попробую сегодня вечером повесить на цифровые каналы передатчик и термодатчик. Если будут проблемы - заведу их через оптопару.
Через оптопару, подозреваю, у вас ничего не выйдет - слишком большое падение напряжения на фототранзисторе. Тут нужен низкомный мосфет.
Хотя могу ошибаться, я в этом не очень разбираюсь... Надеюсь. другие подскажут.
Если будут проблемы - заведу их через оптопару.
А чем транзистор не подходит?
ТС, вам в любом случае надо будет добиваться потребления максимум в 100 мкА, иначе даже смысла нет получать компактное долгоиграющее устройство.
ЗЫ. Я тут свое подсчитал потребление 562 мкА - работа от батарейки максимум 29 дней (
и что то "великовата" задача для Atmega328P..... - попроще что нибудь выберете