Режим сна Arduino

Ivan00qq00
Ivan00qq00 аватар
Offline
Зарегистрирован: 17.02.2017

Здравствуйте, помогите разобраться с режимом сна Arduino ! Я начинающий в этом деле, в интернете на эту тему ни чего нет !

Как усыпить и разбудить Arduino ? При этом должны работать прерывания и сон должен быть по таймеру.

Такое возможно реализовать ?

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016
Ivan00qq00
Ivan00qq00 аватар
Offline
Зарегистрирован: 17.02.2017

А что за аргумент в функции "powerDown();" - "SLEEP_8S" ? Таймер сна что ль ?

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Да. Спать бесконечно SLEEP_FOREVER.

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

Ivan00qq00 пишет:

в интернете на эту тему ни чего нет !

Да. неужели? В итернете этого добра почти как порнухи - на каждом заборе написано.

Изучайте самое полное руководство: https://www.gammon.com.au/power

Tony-Fox
Offline
Зарегистрирован: 24.02.2017

Хмм... а если мне нужно обновлять данные каждую минуту, по циклу гонять ардуино придётся, или есть другой выход ? Я новичок, камнями особо не кидайте

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Обновление данных займет в худшем случае десяток миллисекунд, остальное время пусть спит.
Если напрягает, что МК будет для этого просыпаться дважды в секунду - не парься, в итоге все равно получается что 90% времени он в спячке, т.е. экономия энергии.

Волшебник
Offline
Зарегистрирован: 22.12.2016

На ардуино (Уно) стоят две микросхемы, атмега328-я - основная и атмега8 (или сн340 китайский вариант). Если 328-ю спать отправить то больше чем на 50% экономии не расчитывайте, 43мА снизится до 20мА или около того. Если надо совсем мало потребление, нужна ардуина без юсб-сериал, мини кажется называется.

Волшебник
Offline
Зарегистрирован: 22.12.2016

 

Волшебник
Offline
Зарегистрирован: 22.12.2016

А, пусть тогда схема повисит, а вопрос сотру.  СН340 жрёт 30mA когда работает, а без юсб вроде 0.2мА. Пойду померяю.

 Обновлено

Кажись не врут, обычная Уно 43 мА, а СН340 23 мА - с отключеной юсб. Тогда имеет смысл в спячку отправлять китаянку.

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

Волшебник пишет:

Тогда имеет смысл в спячку отправлять китаянку.

Тогда имеет смысл обойтись без USB

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Для начала имеет смысл выпаять светодиод.

Потом - линейный стабилизатор.

Ivan00qq00
Ivan00qq00 аватар
Offline
Зарегистрирован: 17.02.2017

А если на ардуинку подовать сразу 5v, потребление стабилизатора должно уменьшиться. Не так ли ?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Если мы будем подавать на стабилизатор 5 В, то с него можно будет снять не более 3.5. Да и функции стабилизатора он при этом выполнять не будет.

И вообще, если Вас заботит именно уменьшение энерглпотребления, а не просто вгонять в сон ради того, чтобы вогнать, то питание должно быть в точности такое, как нужно, т.е. либо 3.3, либо 5 В. Ну, либо что-то в этом диапазоне при условии, что Ардуинке этого хватит (3.3 В для 16 МГц Ардуины может не хватить). 

И в таких условиях стабилизатор вообще не нужен, а потому подлежит выпаиванию.

Tony-Fox
Offline
Зарегистрирован: 24.02.2017

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

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Внешние прерывания ардуинка во сне обрабатывает только на пинах D2 и D3, вы невнимательно читали ссылку выше.

Ivan00qq00
Ivan00qq00 аватар
Offline
Зарегистрирован: 17.02.2017

Ну я к d2 и прицепил...

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Ты фильм, "Иван Васильевич меняет профессию видел? Позволь его процитировать ...

Ivan00qq00 пишет:

в интернете на эту тему ни чего нет !

"Врёшь, собака!"

Информации в сети некуда девать (в т.ч. и на этом форуме). "Ищите и обрящете".

кудрявый
Offline
Зарегистрирован: 14.12.2017

Есть ардуина с эзернет шилдом. Отправляет раз в 10 мин значение на сервер. Испытываю желание отправлять адруину в сон в перерывах.

Но тут вопрос - как поведет себя эзернет шилд после пробуждения ардуины - от не потеряется за время спячки?

Или при пробуждении каждый раз инициализировать эзернет заново ?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

кудрявый пишет:

Но тут вопрос - как поведет себя эзернет шилд после пробуждения ардуины - от не потеряется за время спячки?

Потеряться не может, спереть могут. Шилд жрет столько, что нет особого смысла в погружении МК в сон.

Georgiy2004
Offline
Зарегистрирован: 22.06.2019

Подскажите пожалуйста как отправить ардуино в сон через 10 мин после подачи на неё питания?

bwn
Offline
Зарегистрирован: 25.08.2014

Georgiy2004 пишет:

Подскажите пожалуйста как отправить ардуино в сон через 10 мин после подачи на неё питания?

Читайте "Блинк без делей" и погружайте.

Georgiy2004
Offline
Зарегистрирован: 22.06.2019

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

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014
MacSim
Offline
Зарегистрирован: 28.11.2012

Смысл вгонять в сон поясните...а то мне кажеться что вам это и не надо, может когда будете объяснять поймете почему оно вам не надо...

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Georgiy2004 пишет:
Можете написать пример скетча ухода в сон

Могу.

#include <avr/sleep.h>
#include <avr/power.h>

volatile bool onflag=false,      // going on state
              onflagdone=false;  // went in on state
int           seconds=0;
byte          old_adcsr=0;       // prev ADC stat register contents

unsigned long    last_on=millis();

void waking(void){               // ISR
  onflag=true;
}

void sleeping(void){
  byte i;
  onflag=false;
  onflagdone=false;
  old_adcsr=ADCSRA;
  ADCSRA=0;
  seconds=0;
  for(i=0;i<20;i++){             // hi-z state
    digitalWrite(i,0);
    pinMode(i,INPUT);
  }
  delay(100);
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  sleep_mode();
  sleep_disable(); 
  ADCSRA=old_adcsr;
}

void setup(){
  pinMode(3,INPUT_PULLUP);       // on btn
  attachInterrupt(1,waking,LOW);
  sleeping();
}

void loop(){
  if(onflag){
    if(millis()-last_on>=1000){
      seconds++;
      last_on=millis();
    }
    if(!onflagdone){
      delay(2000);
      if(digitalRead(3)==LOW) onflagdone=true;
      else sleeping();
    }else{

      // working here

      if((digitalRead(3)==LOW && seconds>=5)||(seconds>=600)){   // switch off if onswitch pressed again,
        digitalWrite(5,LOW);                                     // or if on for more than 600 sec
        delay(500);
        sleeping();
      }
    }
  }
}

Georgiy2004 пишет:
пожалуйста

Платить сюда: https://money.yandex.ru/to/410011919696337

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Заплатил?

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Ворота пишет:
Заплатил?

Посмотрим. Я не знаю, кто или что их так приучило, что можно "памагити, сами мы не местные" и всё чпок и сразу будет. Как по волшебству, блеать. Хз, поколение такое. А так может осознает что "памагите" и всё готовенькое денег стоит.

Кстати, на форумах типа античата, фрикера, кардерпланеты и т. п. околокриминальных площадок, любой продавец, вендор, заказчик и вообще кто-то кому надо что-то, за деньги, работает через гаранта (участника форума со 100% репой, который выступает промежуточным пунктом между контрагентами). За процент. Кто не согласен - рискуют, но если кого-то кидают, представить доказательства достаточно просто. И любой кидала в профиле получает зачёркнутый ник, и напротив надпись - "deer". То бишь по-русски - олень.

Навсегда.

Полезный опыт, так сказать. Перенять не лишне. Людей, которые бывают здесь регулярно и имеют авторитет, тот же ЕвгенийП, то есть подходящих на должность гаранта, больше трёх человек тут точно найдётся. Бонусом и копейка от сделок между форумянами.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП на это не подпишется! :-)

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Провальная идея. Заказал, кинул, зарегистрировался под новым ником, заказал, кинул... Да и тут редко можно сходу трудозатраты определить - корректировка случается. Вот "гаранту" придётся херней страдать вместо занятием хобби.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ua6em пишет:

ЕвгенийП на это не подпишется! :-)

Само собой. Это уже не хобби, а работа и обязательства. 

SergRnD
Offline
Зарегистрирован: 10.02.2019

Добрый день всем. Я новичок в теме ардуино, да и в программировании не очень силен. Увлекла идея использования ардуино для самоделок. Сейчас пытаюсь разобраться с режимами сна и прерывания ардуино.

#include <avr/sleep.h>
#include <avr/wdt.h> 
bool sl=false;
bool pr=false;
void setup()
  {
     Serial.begin(9600);
     pinMode(10, INPUT_PULLUP);
     pinMode(11, INPUT_PULLUP);
     pinMode(LED_BUILTIN, OUTPUT);
     set_sleep_mode(SLEEP_MODE_PWR_DOWN); //выбираем в качестве режима энергосбережения Power-Down mode
     digitalWrite(LED_BUILTIN, HIGH);
     Serial.println(sl);
  }
void loop() {

  sl=!digitalRead(10);
  Serial.print("sl     ");
  Serial.println(sl);
  Serial.print("pr    ");
  Serial.println(pr);
 // delay(1000);
  if(sl==true)
  {
    slp();
  }


 }

 void slp()
 {
  
  digitalWrite(LED_BUILTIN, LOW);
  wdt_enable(WDTO_1S); //устанавливаем таймер на 1 секунду
  WDTCSR |= (1 << WDIE); //разрешаем прерывание
  sleep_mode(); //переходим в режим сна, через секунду попадаем в  функцию обработчика прерывания ISR (WDT_vect)
  
  } 

 ISR (WDT_vect) 
 {
  wdt_disable(); //прерывание сработало, отключаем таймер, после чего продолжается выполнение основной программы
  pr=!digitalRead(11);
  if(pr==true)
  {
    digitalWrite(LED_BUILTIN, HIGH);
  }
  else 
  {
   slp(); 
  }
  }

Набросал простой скетч, но работаете он не так как мне хотелось бы.
По моей задумке после просыпания ардуино должен проверить состояние пина 11, и если там 1 то проснуться и зажечь диод, а если 0 то лечь спать дальше.
Но.
на практике такая картина: результат выполнения программы зависит от состояния пина перед засыпанием, т.е. если перед сном на 11 пине 1, то ардуина просыпается, а если 0 то не просыпается. Если во врем сна изменить состояние пина 11, то ничего не изменится.
Подскажите пожалуйста в чем я не прав? Почему так?

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Рекурсия сна через прерывание - это сильно!

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

опишите pr как volatile

rkit
Онлайн
Зарегистрирован: 23.11.2016

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

TIMSK0 &= ~(1<<TOIE0)

Также вся структура кода неправильная. Весь код из прерывания нужно перенести в программу за sleep_cpu();

Ну и кстати говоря sleep_cpu() в коде вообще нету, так что и сна нету.

SergRnD
Offline
Зарегистрирован: 10.02.2019

Что значит сна нет? Ведь выполнение цикла loop останавливается.

SergRnD
Offline
Зарегистрирован: 10.02.2019

Попробовал описать как volatile, рушается:"'pr' does not name a type". 

SergRnD
Offline
Зарегистрирован: 10.02.2019

"Рекурсия сна через прерывание - это сильно!"

 

Что вы имеете ввиду?

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

Думаю, что он имел в виду рекурсию в строке №51 из-которой у Вас и останавливается loop, а потом и вообще вся программа рушится при определённых условиях.

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

SergRnD пишет:

Попробовал описать как volatile, рушается:"'pr' does not name a type". 

Значит неправильно пробовал. Мы ж не можем догадаться чего Вы там написали.

SergRnD
Offline
Зарегистрирован: 10.02.2019

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

SergRnD пишет:

Попробовал описать как volatile, рушается:"'pr' does not name a type". 

Значит неправильно пробовал. Мы ж не можем догадаться чего Вы там написали.

А разве "volatile" это не тип переменной?  Я просто поменял тип bool на  volatile.  Или нужно было сделать по другому? Я же говорю что новичок, только учусь, многого не знаю.

SergRnD
Offline
Зарегистрирован: 10.02.2019

Вообще желание сделать следующее: по команде некого устройства (например кнопка, возможно без фиксации) ардуино засыпает, периодически просыпается для проверки уровня заряда АКБ и опять засыпает если АКБ в норме, если уровень АКБ менее желаемого ардуино через смс сообщает об этом и опять засыпает, а по команде какого-то устройства (скорее всего по звонку на GSM-модуль или опять же кнопка) просыпается. 
Может у кого есть похожие проекты? Буду благодарен за советы и помощь.   

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

SergRnD пишет:

А разве "volatile" это не тип переменной?  Я просто поменял тип bool на  volatile.  Или нужно было сделать по другому? Я же говорю что новичок, только учусь, многого не знаю.

простите, если вы учитесь - так учитесь, а не ждите пока вам все разжуют да в рот положат.

Можно же набрать слово "volatile" в гугле и почитать статьи. что это такое. где и как используется

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

SergRnD пишет:

А разве "volatile" это не тип переменной?

Нет

SergRnD пишет:

Я же говорю что новичок, только учусь, многого не знаю.

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

Zea
Offline
Зарегистрирован: 18.04.2020

Подскажи пожалуйста оператор для выхода из сна

 

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

Из какого сна? Сны бывают разными (у ATmega328 их шесть видов)  и просыпаются, соответственно, от разных причин. Таблица всех видов сна и от чего в каждом из них просыпаются, приведена в разделе 10.1 даташита.

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

Zea пишет:

Подскажи пожалуйста оператор для выхода из сна

Zea, вы со времени своей прошлой темы 4 дня назад так и "ничего не нашли в гугле"?? :)

Тогда значит это занятие не для вас, бросайте его...