Режим сна

Artyom_roboti

✩✩✩✩✩✩✩
22 Мар 2020
28
0
Подкиньте, пожалуйста, кто знает хорошую статью или видео урок по режиму сна для Arduino , а то столько всего перерыл в интернете и нормального объяснения не нашёл. Заранее спасибо.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Кажется вот эту смотрел. Делал спящий режим на голой аттини85
 

Artyom_roboti

✩✩✩✩✩✩✩
22 Мар 2020
28
0
Кажется вот эту смотрел. Делал спящий режим на голой аттини85
я это изучил, ясностей больше не стало
 

Artyom_roboti

✩✩✩✩✩✩✩
22 Мар 2020
28
0

Artyom_roboti

✩✩✩✩✩✩✩
22 Мар 2020
28
0

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
тогда тебе нужен режим POWERDOWN_SLEEP – отключается всё, кроме WDT и внешних прерываний, относительно долгий выход из сна
потом прилепить прерывание на вывод, куда там у тебя этот дальномер прилеплен
смотри функцию attachinterrupt и там еще отдельно функция идет для перевода вывода в режим прерывания, не пропусти ее
типа такого attachInterrupt(digitalPinToInterrupt(isr_pin[my_isr]), ISR_1, CHANGE);
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Если ультразвуковой дальномер типа HC-SR04 , то у него не отдельного выхода для прерываний, по которому можно пробудить ардуину. Тут подойдет алгоритм, когда ардуина будет засыпать и просыпаться по WDT, к примеру ,каждые 60 мс и проверять расстояние. При нужном уже не засыпать.
Если использовать ИР датчик линии, типа того что в наливаторы пытаются вкрячить, то там вполне возможно выход прицепить к пину 2 или 3 и сделать пробуждение по прерыванию.
Это на вскидку. Может кто чего интереснее подскажет

Вот есть такой датчик HY-SRF05 у него есть выход OUT , возможно его как то можно использовать в качестве активации ардуины
 
Изменено:

AndrySmart

✩✩✩✩✩✩✩
12 Дек 2018
38
2
Киев
Помогите решить задачу.
библиотека GyverPower взял из примера
просыпаемся по нажатию кнопки.
кнопка подключена на пин 3

все работает каак надо но у меня возникла задачка использовать два прерывания.
одно должно срабатывать когда пин 3 стал ноликов а второе когда пин 2 стал единичкой.
и обрабатываться они должны разными функциями.

это реально как то реализовать?

из примеров GyverPower:
// просыпаемся по аппаратному прерыванию из sleep
#include "GyverPower.h"
void setup() {
  Serial.begin(9600);
  // кнопка подключена к GND и D3
  pinMode(3, INPUT_PULLUP);
  // подключаем прерывание на пин D3 (Arduino NANO)
  attachInterrupt(1, isr, FALLING);
  // глубокий сон
  power.setSleepMode(POWERDOWN_SLEEP);
}
// обработчик аппаратного прерывания
void isr() {
  // в отличие от sleepDelay, ничего вызывать не нужно!
}
void loop() {
  Serial.println("go sleep");
  delay(300);
  // спим ~8 секунд, но можем проснуться по кнопке
  power.sleep(SLEEP_8192MS);
  // тут проснулись, по кнопке или через указанный период
  Serial.println("wake up!");
  delay(300);
}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
attachInterrupt(1, isr, FALLING); - это вызов прерывания при изменении значения на 0 на пине 3, от которого будет просыпаться ардуина
attachInterrupt(0, isr, RISING);- это вызов прерывания при изменении значения на 1 на пине 2, от которого будет просыпаться ардуина
 

AndrySmart

✩✩✩✩✩✩✩
12 Дек 2018
38
2
Киев
вот тут я и не понял. в описании написано что isr это функция вызываемая при наступлении прерывания. но в примере она пустая.
я так понял мне достаточно добавить после attachInterrupt(1, isr, FALLING);
строчку attachInterrupt(0, isr, RISING); и у меня будет просыпаться от любого из этих двух прерываний?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
да, тут функция в виде заглушки для функции attachInterrupt.
а пробуждение идет от любого внешнего прерывания. Внешних прерываний 2, на 2-ом и 3-ем пине. аттач как раз разрешает эти прерывания по условию
 

AndrySmart

✩✩✩✩✩✩✩
12 Дек 2018
38
2
Киев
ооо чпасибо. теперь все понятно. а уж откуда поступило прерывание можно узнать прочитав состояние пинов.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Можно, но не нужно.
если сделать не одну функцию isr , а скажем две, isr1 и isr2, и в каждый аттачинтеррапт свою isr впихнуть, то при срабатывании пина сначала будет вызвана функция заглущка - isr1 или isr2. В них можно сразу написать что то типа flag=1 или flag=2 и уже в цикле loop распохнавать от чего проснулась плата
 
  • Лойс +1
Реакции: kostyamat

hans-zemmer

✩✩✩✩✩✩✩
16 Дек 2020
1
0
Есть вопрос по работе millis() в библиотеке GyverPower.
Суть вот в чем: при использовании делителя частоты, отличного от единицы, неправильно корректируется millis().
Есть датчик давления воздуха, который опрашивается раз в полчаса и есть кнопка, по нажатию на которую плата просыпается и что-то там делает, потом засыпает на оставшееся до следующего замера время. Если в течение времени от замера до замера кнопка не нажималась, millis корректируется верно, если же кнопка была нажата, плата просыпается и millis корректируется на прошедшее количество миллисекунд, умноженное на величину делителя.
Хочу запитать плату Nano напрямую от литиевой батареи, для чего хочу снизить частоту вдвое до 8 МГц. Но есть описанная выше проблема с таймером. Если кнопка будет нажата через 10 минут после засыпания платы, то при просыпании millis скорректируется на 20 минут, соответственно период замеров "уплывает". Как это решить?