Всем доброго времени суток. скажу сразу, не силен в программировании, так что строго прошу не судить. Меня очень заинтересовала платформа ардуино своей функциональностью и относительной простотой реализации проектов. Задача стоит следующим образом: ардуино что-то делает, затем по команде от внешнего устройства(кнопка) уходит в сон, и просыпается тоже по команде от внешнего источника(звонок на GSM-модуль). Во время сна необходимо контролировать заряд батареи, и при низком заряде отправлять смс. Логика работы представленного скетча(на мой взгляд приемлима): при подаче сигнала на пин 11 ардуино засыпает, просыпаться должна от аппаратного прерывания(до него еще не дошел), во время сна просыпается по watchdog каждые 8 секунд, проверяет пин 11(импровизация заряда батареи) и при 1 выполнет некую функцию и засыпает, а при 0 засыпает дальше. Прошу Вас посмотреть и прокомментировать, той ли дорогой иду или нет? Или что-то нужно сделать иначе? Буду очень благодарен за советы и помощь. Код (C++): #include <avr/sleep.h> #include <avr/wdt.h> bool sl=false; volatile bool pr=0; bool slip=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); //digitalWrite(10, LOW); 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(); } ///-------------------- lable: if(slip==true) { pr=!digitalRead(11); if(pr==true) { digitalWrite(LED_BUILTIN, HIGH); logos(); slip=false; slp(); } else { slp(); goto lable; } } } void slp() { digitalWrite(LED_BUILTIN, LOW); wdt_enable(WDTO_8S); WDTCSR |= (1 << WDIE); //разрешаем прерывание sleep_mode(); //переходим в режим сна, через 8 секунд попадаем в функцию обработчика прерывания ISR (WDT_vect) sleep_cpu(); } ISR (WDT_vect) { wdt_disable(); //прерывание сработало, отключаем таймер, после чего продолжается выполнение основной программы slip=true; } void logos() { }
"Обычные" ардуины типа Уно, Мега, Нано итд устроены так, что усыпление контроллера не приводит к существенной экономии в потреблении. Так что заморачиваться со сном имеет смысл только при переделке схемы.
Если рядом стоит GSM-модуль, то во сне крошечного МК никакого смысла нет. Можно просто перевести в IDLE состояние, если уж так хочется. Ну и не забывать про регистр PRR, необходимость полного отключения АЦП и перевода всех ног на выход или вход с подтяжкой.
Добры день. Я хотел перевести ардуино в режим сна, по большей степени, для того, чтобы отключать OLED дисплей и датчики, которые планирую использовать, и не гонять попусту целиком цикл loop. Экономия энергии не столь важна, для этого и хочу сделать контроль уровня заряда, чтоб вовремя подключить источник питания. Да и заодно разобраться с режимами сна и прерываниями. В общем случае код имеет право на существование или все же не правильный?
для этого нет нужды загонять ардуину в сон, достаточно просто "отключать OLED дисплей и датчики" . бессмысленно, потребление энергии от этого не меняется
Дело не в потреблении энергии, думал что если просто отключить датчики, и продолжить работу с ними в цикле loop это может привести к ошибкам или сбоям. А на счет OLED дисплея: если его просто очистить командой clrScr() это ли не тоже самое что и отключить его программно?
Ну, можно вводить, а можно и не вводить, есть 100500 способов это организовать. Какой выберешь, так и сделаешь.
Использование режима сна, и особенно отладка в таком режеме, требует более высокой квалификаци, чем просто испльзовании дополнительного условия. И ошибок и сбоев можно словить гораздо больше. Со сном связыватьс имеет смысл только если требуется экономия энергии (но в случае обычной ардуины это не имеет смысла) или если надо померять аналоговый сигнал с минимально возможными шумами
Спасибо. То есть стоит опрос датчиков и вывод на экран реализовать в виде отдельных функций, а в loop организовать условия когда нужно их вызывать а когда нет?
Подскажите пожалуйста еще такой момент: приобрел самый дешевый GSM-шилд с модулем neoway n590, нашел описание модуля "https://radiolaba.ru/microcotrollers/gsm-modul-neoway-m590-opisanie-i-komandyi-upravleniya.html" там сказано что данный модуль умеет спать, для этого необходимо установить низкий логический уровень на линии SLEEP. Но прозвонка тестером контакта 9 модуля показала, что он замкнут на землю. Сталкивался ли кто с таким модулем? Умеет ли он спать? И если да, то как этого добиться?
Спасибо. Уже рассматриваю этот вариант. Neoway брал по причине цены так как только начинаю осваивать ардуино, и брал дл обучения, теперь выбросить жалко, работает ведь
Ну, так всегда стоит поступать. Пихать все-все-все (ну кроме самих библиотек) в loop это плохой стиль. Желательно что бы каждая функция (и loop в том числе) не занимала больше одного экрана.
Написано умеет, но как я понял чтобы отправить его в сон нужно разрешить программно режим сна и подать низкий уровень на 9 ногу модуля, но у меня она звонится на землю. Вот я и интересуюсь, может кто с этим сталкивался? Это шилд такой или у меня косяк в монтаже?