Режим сна Arduino
- Войдите на сайт для отправки комментариев
Чт, 23/02/2017 - 13:14
Здравствуйте, помогите разобраться с режимом сна Arduino ! Я начинающий в этом деле, в интернете на эту тему ни чего нет !
Как усыпить и разбудить Arduino ? При этом должны работать прерывания и сон должен быть по таймеру.
Такое возможно реализовать ?
https://github.com/rocketscream/Low-Power
А что за аргумент в функции "powerDown();" - "SLEEP_8S" ? Таймер сна что ль ?
Да. Спать бесконечно SLEEP_FOREVER.
в интернете на эту тему ни чего нет !
Да. неужели? В итернете этого добра почти как порнухи - на каждом заборе написано.
Изучайте самое полное руководство: https://www.gammon.com.au/power
Хмм... а если мне нужно обновлять данные каждую минуту, по циклу гонять ардуино придётся, или есть другой выход ? Я новичок, камнями особо не кидайте
Обновление данных займет в худшем случае десяток миллисекунд, остальное время пусть спит.
Если напрягает, что МК будет для этого просыпаться дважды в секунду - не парься, в итоге все равно получается что 90% времени он в спячке, т.е. экономия энергии.
На ардуино (Уно) стоят две микросхемы, атмега328-я - основная и атмега8 (или сн340 китайский вариант). Если 328-ю спать отправить то больше чем на 50% экономии не расчитывайте, 43мА снизится до 20мА или около того. Если надо совсем мало потребление, нужна ардуина без юсб-сериал, мини кажется называется.
А, пусть тогда схема повисит, а вопрос сотру. СН340 жрёт 30mA когда работает, а без юсб вроде 0.2мА. Пойду померяю.
Обновлено
Кажись не врут, обычная Уно 43 мА, а СН340 23 мА - с отключеной юсб. Тогда имеет смысл в спячку отправлять китаянку.
Тогда имеет смысл в спячку отправлять китаянку.
Тогда имеет смысл обойтись без USB
Для начала имеет смысл выпаять светодиод.
Потом - линейный стабилизатор.
А если на ардуинку подовать сразу 5v, потребление стабилизатора должно уменьшиться. Не так ли ?
Если мы будем подавать на стабилизатор 5 В, то с него можно будет снять не более 3.5. Да и функции стабилизатора он при этом выполнять не будет.
И вообще, если Вас заботит именно уменьшение энерглпотребления, а не просто вгонять в сон ради того, чтобы вогнать, то питание должно быть в точности такое, как нужно, т.е. либо 3.3, либо 5 В. Ну, либо что-то в этом диапазоне при условии, что Ардуинке этого хватит (3.3 В для 16 МГц Ардуины может не хватить).
И в таких условиях стабилизатор вообще не нужен, а потому подлежит выпаиванию.
Внешние прерывания ардуинка во сне не обрабатывает, все аргументы перепробовал, не помогает ! Может есть какой-нибудь необязательный, отвечающий за внешние прерывания ?
Внешние прерывания ардуинка во сне обрабатывает только на пинах D2 и D3, вы невнимательно читали ссылку выше.
Ну я к d2 и прицепил...
Ты фильм, "Иван Васильевич меняет профессию видел? Позволь его процитировать ...
в интернете на эту тему ни чего нет !
"Врёшь, собака!"
Информации в сети некуда девать (в т.ч. и на этом форуме). "Ищите и обрящете".
Есть ардуина с эзернет шилдом. Отправляет раз в 10 мин значение на сервер. Испытываю желание отправлять адруину в сон в перерывах.
Но тут вопрос - как поведет себя эзернет шилд после пробуждения ардуины - от не потеряется за время спячки?
Или при пробуждении каждый раз инициализировать эзернет заново ?
Но тут вопрос - как поведет себя эзернет шилд после пробуждения ардуины - от не потеряется за время спячки?
Потеряться не может, спереть могут. Шилд жрет столько, что нет особого смысла в погружении МК в сон.
Подскажите пожалуйста как отправить ардуино в сон через 10 мин после подачи на неё питания?
Подскажите пожалуйста как отправить ардуино в сон через 10 мин после подачи на неё питания?
Читайте "Блинк без делей" и погружайте.
Можете написать пример скетча ухода в сон или пример скинуть, пожалуйста
http://www.gammon.com.au/power
Смысл вгонять в сон поясните...а то мне кажеться что вам это и не надо, может когда будете объяснять поймете почему оно вам не надо...
Могу.
#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(); } } } }Платить сюда: https://money.yandex.ru/to/410011919696337
Заплатил?
Посмотрим. Я не знаю, кто или что их так приучило, что можно "памагити, сами мы не местные" и всё чпок и сразу будет. Как по волшебству, блеать. Хз, поколение такое. А так может осознает что "памагите" и всё готовенькое денег стоит.
Кстати, на форумах типа античата, фрикера, кардерпланеты и т. п. околокриминальных площадок, любой продавец, вендор, заказчик и вообще кто-то кому надо что-то, за деньги, работает через гаранта (участника форума со 100% репой, который выступает промежуточным пунктом между контрагентами). За процент. Кто не согласен - рискуют, но если кого-то кидают, представить доказательства достаточно просто. И любой кидала в профиле получает зачёркнутый ник, и напротив надпись - "deer". То бишь по-русски - олень.
Навсегда.
Полезный опыт, так сказать. Перенять не лишне. Людей, которые бывают здесь регулярно и имеют авторитет, тот же ЕвгенийП, то есть подходящих на должность гаранта, больше трёх человек тут точно найдётся. Бонусом и копейка от сделок между форумянами.
ЕвгенийП на это не подпишется! :-)
Провальная идея. Заказал, кинул, зарегистрировался под новым ником, заказал, кинул... Да и тут редко можно сходу трудозатраты определить - корректировка случается. Вот "гаранту" придётся херней страдать вместо занятием хобби.
ЕвгенийП на это не подпишется! :-)
Само собой. Это уже не хобби, а работа и обязательства.
Добрый день всем. Я новичок в теме ардуино, да и в программировании не очень силен. Увлекла идея использования ардуино для самоделок. Сейчас пытаюсь разобраться с режимами сна и прерывания ардуино.
#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, то ничего не изменится.
Подскажите пожалуйста в чем я не прав? Почему так?
Рекурсия сна через прерывание - это сильно!
опишите pr как volatile
Прерывание по миллисекундному таймеру нужно отключить, иначе никакого сна не будет.
TIMSK0 &= ~(1<<TOIE0)
Также вся структура кода неправильная. Весь код из прерывания нужно перенести в программу за sleep_cpu();
Ну и кстати говоря sleep_cpu() в коде вообще нету, так что и сна нету.
Что значит сна нет? Ведь выполнение цикла loop останавливается.
Попробовал описать как volatile, рушается:"'pr' does not name a type".
"Рекурсия сна через прерывание - это сильно!"
Что вы имеете ввиду?
Думаю, что он имел в виду рекурсию в строке №51 из-которой у Вас и останавливается loop, а потом и вообще вся программа рушится при определённых условиях.
Попробовал описать как volatile, рушается:"'pr' does not name a type".
Значит неправильно пробовал. Мы ж не можем догадаться чего Вы там написали.
Попробовал описать как volatile, рушается:"'pr' does not name a type".
Значит неправильно пробовал. Мы ж не можем догадаться чего Вы там написали.
А разве "volatile" это не тип переменной? Я просто поменял тип bool на volatile. Или нужно было сделать по другому? Я же говорю что новичок, только учусь, многого не знаю.
Вообще желание сделать следующее: по команде некого устройства (например кнопка, возможно без фиксации) ардуино засыпает, периодически просыпается для проверки уровня заряда АКБ и опять засыпает если АКБ в норме, если уровень АКБ менее желаемого ардуино через смс сообщает об этом и опять засыпает, а по команде какого-то устройства (скорее всего по звонку на GSM-модуль или опять же кнопка) просыпается.
Может у кого есть похожие проекты? Буду благодарен за советы и помощь.
А разве "volatile" это не тип переменной? Я просто поменял тип bool на volatile. Или нужно было сделать по другому? Я же говорю что новичок, только учусь, многого не знаю.
простите, если вы учитесь - так учитесь, а не ждите пока вам все разжуют да в рот положат.
Можно же набрать слово "volatile" в гугле и почитать статьи. что это такое. где и как используется
А разве "volatile" это не тип переменной?
Нет
Я же говорю что новичок, только учусь, многого не знаю.
Ничему Вы не учитесь, не обманывайте себя. Когда учатся - выкладывают свой код и просят посмотреть. Вы же с этим несчастным волатайлом уже полдня выносите всем мозг, так и не показав что Вы там написали.
Подскажи пожалуйста оператор для выхода из сна
Из какого сна? Сны бывают разными (у ATmega328 их шесть видов) и просыпаются, соответственно, от разных причин. Таблица всех видов сна и от чего в каждом из них просыпаются, приведена в разделе 10.1 даташита.
Подскажи пожалуйста оператор для выхода из сна
Zea, вы со времени своей прошлой темы 4 дня назад так и "ничего не нашли в гугле"?? :)
Тогда значит это занятие не для вас, бросайте его...