Понизить энергопотребление

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Приветствую!

Собственно, есть очень корявый (надеюсь, пока) скетч, который планируется юзать на ProMini в связке с nRF24L01+ и MAX485: https://github.com/Porokhnya/GreenhouseProject/blob/master/UniversalSensorsModule/UniversalSensorsModule.ino - и далее по тексту, собственно, все исходники тут: 

В скетче также реализован протокол 1-Wire, для работы по шнурку. Т.е. фактически платка может отдавать показания тремя путями: по 1-Wire, по RS-485 и по радиоканалу. Плюсом к этому - по 1-Wire осуществляется регистрация этого добра в центральном контроллере.

То есть вводные, грубо говоря, такие: 

1. Поменялся уровень на пине 2 (1-Wire) - проснуться, маслать до упора, заснуть, когда долго ничего на линии не меняется;

2. Проснуться по приёму байта по UART, отработать, заснуть;

3. Выставить таймер на определённый интервал, заснуть, проснуться, снять показания с датчиков, выплюнуть в эфир, заснуть.

Поскольку в энергосбережении я пока деревянный по уши - надо дописать в скетч требуемый функционал. Из железа надо: Pro Mini 5V 16 MHz, стандартный модуль nRF24L01+, китайскую платку RS-485. 

Предлагайте по бюджету.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Блин, ссылка на все исходники не прицепилась: https://github.com/Porokhnya/GreenhouseProject/blob/master/UniversalSensorsModule/

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

Ну, вот это Вы, конечно, читали? Если нет. почитайте, может тогда и услуги исполнителя не понадобятся. Там вроде всё до микроампер расписано.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

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

Ну, вот это Вы, конечно, читали? Если нет. почитайте, может тогда и услуги исполнителя не понадобятся. Там вроде всё до микроампер расписано.

Читал, но пока каша, как это всё свести с моими говнонабросками :) Поэтому сюда и написал - свои силы надо оценивать трезво. Меня бы вполне устроил вариант работы скажем, в месяц от парочки аккумуляторов не сильно большого формата.

Onkel
Offline
Зарегистрирован: 22.02.2016

DIYMan пишет:

Читал, но пока каша, как это всё свести с моими говнонабросками :) Поэтому сюда и написал - свои силы надо оценивать трезво. Меня бы вполне устроил вариант работы скажем, в месяц от парочки аккумуляторов не сильно большого формата.

тз пришлите ydom coБaКa mail.ru , если код на С устроит. В ардуино Ide отключать всякие миллис себе дороже, а я на CV вам напишу, он и честный 200 баков стоит, а есть и так.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

ТЗ, собственно, я озвучил в первом посте: внедрить код засыпания/просыпания в уже имеющийся код, переписывать с нуля мне не надо, это прорва работы. Сам написанный код по объёму небольшой, разобраться вполне реально, что к чему.

Onkel
Offline
Зарегистрирован: 22.02.2016

Ну дело ваше, сделать бывает проще чем переделывать. Имейте, впрочем, на будущее в виду- если Вам будет нужно, я по тз код напишу, мыл мой выше.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Onkel пишет:

Ну дело ваше, сделать бывает проще чем переделывать. Имейте, впрочем, на будущее в виду- если Вам будет нужно, я по тз код напишу, мыл мой выше.

Ок, спасибо, буду иметь в виду. С STM8L работаете?

Onkel
Offline
Зарегистрирован: 22.02.2016

нет, все атмелы atmega / atxmega и stm32 , ну и 51 некоторые, которые в Keil uVision есть.

a5021
Offline
Зарегистрирован: 07.07.2013

DIYMan пишет:
С STM8L работаете?

А для него чего нужно?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

a5021 пишет:

DIYMan пишет:
С STM8L работаете?

А для него чего нужно?

Для низкого энергопотребления. В прошивке надо реализацию некоторых команд протокола 1-Wire, работа по RS-485 через UART, работа с нордиковским nRF. Короче, порт того, что наколбашено под мегу, только более грамотный. Почём нынче опиум?

З.Ы. Про STM - это немного оффтоп, меня прежде всего интересует вопрос, поднятый в стартовом топике. Ибо боюсь, что я впорю не по-детски - опыта не так много, как хотелось бы.

a5021
Offline
Зарегистрирован: 07.07.2013

Я сейчас пилю потихоньку свой проект для stm32f030 + NRF24L01, т.ч. тема близкая. Там как раз все вопросы минимального энергопотребления уже проработаны (измеренное усредненное на прототипе = 12.22мкА/ч -- около десяти лет от двух алкалиновых АА). Отростком от него идет STM8S + NRF24L01. В принципе, код несложно перебросить и под STM8L. С последним тоже дело имел, но для других проектов. Свою реализацию 1-wire для STM8S я писал когда-то давно, но вот RS-485 не занимался никогда. Теоретически, все можно сделать, просто нужно как следует интерес возбудить. :)

И еще совет -- для микропотребляющих устройств 1-wire очень плохо подходит. Мне хоть и нравятся даллосовские температурные датчики, но я был вынуждени от них отказаться в пользу I2C-датчиков как раз из-за потребления. Энергии на один датчик уходило больше, чем на все остальные датчики и устройство целиком.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

a5021 пишет:

И еще совет -- для микропотребляющих устройств 1-wire очень плохо подходит. 

Строго говоря, мне 1-Wire нужон только для регистрации модуля в системе, всякие DS18B20 можно и не вешать для опроса к самому модулю, хотя прошивка (та, что сейчас под Atmega328) поддерживает работу и с ними, и со всякими Si7021 на I2C. Строго говоря, если про 1-Wire - там нужен больше протокол работы как клиент, он тоже реализован уже под мегу, нужен порт, в будущем.

Вот с энергосбережением - тема для меня новая, а хочется датчики влажности почвы посадить на автоном. Сейчас уже реализованы настройки через 1-Wire - интервал опроса, вкл/выкл передатчик и т.п., т.е. модулю всего-то и надо, что проснуться по истечению нужного интервала, замерить показания и выплюнуть их в эфир.

Вся цуко несправедливость в том, что в любой момент такой датчик может быть жёстко выдран из грядки и присунут на линию 1-Wire - либо для настройки, либо - чтобы там жил и отдавал показания. А потом - может быть жестоко изнасилован путём перемещения на шину RS-485. И вот прошивка должна корректно отрабатывать просыпание по приходу данных с любого моста, в общем. Секас.

Вы гляньте говонокодец по ссылке, хоть мельком - там видно, что сама прошивка может настраиваться под разные комбинации датчиков, можно вообще выпилить либо радио, либо RS-485, либо - и то и другое. Но в максимальной, так сказать, комплектации - этот зоопарк хотелось бы иметь не слишком прожорливым. Да, я там допилю ещё со временем, типа отсыл радиомодуля в сон, но основной проблемы энергопотребления это не решит, имхо - я тупо молочу в loop, проверяя - "а не свалился ли байтик в UART, а не настало ли время опросить?".

Если бы реально вот щас мог и умел - сделал бы сам, но пока ресурсов не хватает, любых: и времени, и полноты знаний. Именно поэтому и вывалил тему, в надежде на то, что грамотный чел сможет дописать туда пару десятков строк с комментариями, чего он там химичит. Цена? Конечно, хочется чтоб не космос - не Рокфеллер, да и спецом не требую всё перепиливать: так - взять совочек и смести в угол, чтоб не отсвечивало и не так сильно пованивало (ненавижу некрасивый код! а наколбасил - это бздец.).

Green
Offline
Зарегистрирован: 01.10.2015

Имею представление. Делал датчик влажности почвы на Pro Mini, nRf24l01+, CR2032. htpicc@gmail.com

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Green пишет:

Имею представление. Делал датчик влажности почвы на Pro Mini, nRf24l01+, CR2032. htpicc@gmail.com

Рисунок у мну не открывается, сорри. Раз имеете представление - все вводные я дал в стартовом сообщении. Гляньте плз вполглаза и скажите свою цену, дальше уже посмотрим, потяну я или нет.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Значит, так: пока отбиваюсь от потока желающих реализовать и заработать пару тыщ рублей за несколько десятков строчек кода - дописываю сам: сделал отрубание подсистемы I2C: power_twi_enable и power_twi_disable, т.е. третья часть работы уже сделана. Осталось отправлять мегу в сон на некоторое время периодически, но так, чтобы во сне millis() тикал, и просыпание было по приходу байта в UART или по смене уровня на пине номер 2.

Под прошивку сейчас разводим плату, где дополнительно будет отрубание питания от линий DS18B20, I2C, аналогового входа под датчик влажности почвы.

Если кто всё-таки желает заработать небольшую денежку: 1500 рублей за посыл меги в сон в loop, с гарантированным просыпанием по указанным хотелкам.

Если это важно, то на разрабатываемой плате кварца не будет, мега будет тактироваться от внутреннего, на 8МГц. 

strarbit
Offline
Зарегистрирован: 12.06.2016

Все-таки кварц лишним не будет

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

strarbit пишет:

Все-таки кварц лишним не будет

Мотивируйте, плз. Из-за большого разброса внутреннего?

strarbit
Offline
Зарегистрирован: 12.06.2016

Встроенный RC-генератор вырабатывает частоту 8 MHz при напряжении 3V и температуре 25 гр.  Каждый раз при сбросе микроконтроллера в регистр OSCCAL загружается байт калибровки. Эта калибровка компенсирует изменение частоты в пределах плюс, минус 10 % . В Atmel  описывается специальный метод калибровки, при котором можно достигнуть точности  плюс, минус 2%. По умолчанию мк работает на частоте 1 MHz.  
с запрограммированным битом CKDIV8 – бит делит частоту на 8. Протокол one-wire основан на временных интервалах, uart – тоже, но его допуск  ошибки до 2% от скорости передачи. Думаю, с кварцем у Вас будет меньше мороки. Еще можно установить программно режим понижения частоты. 

Onkel
Offline
Зарегистрирован: 22.02.2016

Да, еще в фьюзах можно выставить пониженную амплитуду колебаний кварца, тогда энергопотребление кварцевого генератора будет практически как у rc генератора.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Спасибо, будем думать, информация более чем ценная.

__Alexander
Offline
Зарегистрирован: 24.10.2012

DIYMan пишет:

 Осталось отправлять мегу в сон на некоторое время периодически, но так, чтобы во сне millis() тикал, и просыпание было по приходу байта в UART или по смене уровня на пине номер 2.

Режим Idle (самый жрущий) - но будут работать и таймер и прерывание по уарт.

Режим Power-Down - тут либо по внешнему прерыванию, либо по TWI. Уарт отключен. 

Для вас первый вариант получается, но это всё равно мА. 

Кстати, компаратор по умолчанию включен. выключайте записью единицы ACD в ACSR.

Если уарт таки не нужен - подходит режим ADC Noise Reduction. Но отличие по потреблению от Idle надо замерять, вроде дофига чего отключается, но поможет ли в общем.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

__Alexander пишет:

DIYMan пишет:

 Осталось отправлять мегу в сон на некоторое время периодически, но так, чтобы во сне millis() тикал, и просыпание было по приходу байта в UART или по смене уровня на пине номер 2.

Режим Idle (самый жрущий) - но будут работать и таймер и прерывание по уарт.

Для вас первый вариант получается, но это всё равно мА. 

Кстати, компаратор по умолчанию включен. выключайте записью единицы ACD в ACSR.

Пойдёт и Idle, на безрыбье. Вопросец: а имеет смысл выключать компаратор? Не ткнёте, сколько он жрёт? В power.h нашёл такие функции:

power_aca_disable()
power_adc_disable()
power_adca_disable()

Чего из них реально можно поюзать - все три?

Правка: так, насколько понял, правильно выключить компаратор можно так:

ACSR &= ~ (1 << ACIE);
ACSR |= 1 << ACD ;

Включить, соответственно, так:

ACSR &= ~ (1 << ACD);
ACSR |= 1 << ACIE ;

Всё верно?

__Alexander
Offline
Зарегистрирован: 24.10.2012

Всё ненужное надо отключать. Не знаю за компаратор, но тут приводять цифры по отключению АЦП.

http://inet-deal.mpa.ru/articles/arduino-003.html

А в общем вот рекомендации что выключать.

http://we.easyelectronics.ru/AVR/avr-power-management-ili-kak-pravilno-s...

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

__Alexander пишет:

Всё ненужное надо отключать. Не знаю за компаратор, но тут приводять цифры по отключению АЦП.

http://inet-deal.mpa.ru/articles/arduino-003.html

А в общем вот рекомендации что выключать.

http://we.easyelectronics.ru/AVR/avr-power-management-ili-kak-pravilno-s...

Ок, спасибо, почитаю. Плюсанул.