Watchdog на час
- Войдите на сайт для отправки комментариев
Всем доброго времени суток. Начал работу над датчиком влажности для комнатных растений, и для снижения энергопотребления решил отправлять ардуинку в сон, потому как замерять влажность чаще 5-10 раз в день не нужно. Все здорово, ардуинка уснула, но как уу будить? Первое что подвернулось под руку - watchdog, но максимальное время для работы вотчдога 8с, далее он перезагружает всю программу. Мне хотелось бы увеличить это время раз в 450. Логично подумать что просыпаясь программа должна считывать состояние некой переменной, и если она не достигла 450, то снова спать. Но ведь вотчдог резетит всю программу, переменные стираются, или нет?
#include <avr/wdt.h> // здесь организована работа с ватчдогом #include <avr/sleep.h> // здесь описаны режимы сна int a; void setup() { //инициализация ватчдога wdt_reset(); // сбрасываем wdt_enable(WDTO_8S); // разрешаем ватчдог 8 сек set_sleep_mode(SLEEP_MODE_PWR_DOWN); // если спать - то на полную } void loop() { if (a > 5) { основная программа } a = a + 1; sleep_enable(); // разрешаем сон sleep_cpu(); // спать! }
Вот так я вижу этот алгоритм в виде кода, но он не работает. При старте программы вотч дог теоретически должен сбросить контролллер 5 раз, затем дать программе выполнить свою работу и снова 5 сбросов. Но каждый раз после резета переменная "a" забывается, и резет идет постоянно.
Подскажите, возможно ли вообще организовать такой алгоритм, и если да, то в чем я сделал ошибку?
Я вроде бы нигде и не писал что watchdog для засыпания. Watchdog для просыпания. Мне нужно будить контроллер по внутреннему таймеру.
Я вроде бы нигде и не писал что watchdog для засыпания. Watchdog для просыпания. Мне нужно будить контроллер по внутреннему таймеру.
ок. давай узнаем, насколько физически актуальна твоя проблема - узнаем длительность цикла loop твоей программы и посчитаем, сколько микроампер мы тратим, если:
а) включаем контроллер раз в 8 секунд и совершаем один loop
б) включаем контроллер раз в 4 часа и совершаем один loop
Длительность цикла loop программы около 5 секунд, в него входит считывание влажности с датчика и вывод его на дисплей. Повторный замер влажности будет необходим только через час, или более, все остальное время контроллер не нужен.
вотчдог можно сделать двухступенчатым. Сначала он может генерить прерывание, а потом перезагружать систему.
вотчдог можно сделать двухступенчатым. Сначала он может генерить прерывание, а потом перезагружать систему.
Можно подробнее? Не совсем понимаю пока
Можно подробнее? Не совсем понимаю пока
Можно и подробнее. http://avrprog.blogspot.ru/2013/03/watchdog.html
и там же, с примерами http://avrprog.blogspot.ru/2013/03/watchdogc.html
Длительность цикла loop программы около 5 секунд
ты не предположения делай, а замерь и опубликуй реальный результат, потому как, если у тебя loop длится 5 секунд, то остаётся убиться ап стену.
Спасибо DetSimen. Вроде бы разобрался, все получилось. Усыпил мк на пол часа.
Объявил функцию для вотчдога
Ещё можно применить RC цепочку с большой постоянной времени и по прерыванию на выводе будить МК.
Пытаюсь так-же как и ТС увеличить время ожидания watchdog'a, но так и не понял каким образом удалось усыпить МК на пол часа, если предложенная ТС функция просто перезапускает watchdog и устанавливает ей таймер на 8с. Где эта функция вызываться должна? В основном цикле программы? По подробнее расскажите пожалуйста.
Каждые 8 секунд МК просыпается, счётчик /переменная увеличивается, если сумма секунд превысит нужное количество минут, то включается нужный код, если нет - опять засыпать. В теме attiny есть конкретные примеры реальных устройств, если не найдёте - в пн скину ссылку.
Я именно так у себя и сделал, (код отсюда) но тут я подумал, МК ведь все равно просыпается каждые 8 сек. Да при этом он не моргет светодиодом, не опрашивает датчики и т.д., но он ведь просыпаеться и проверяет переменную, а значит жрет энергию?
тоже есть такая задача, только бутлоадер на нано никак не перешью (((
Те доли секунды которые работает МК ни в какое сравнение не идёт по потреблению, когда вы включаете и работаете с периферией. Проверено.
Главное правильно выключайте пины и внешние устройства, в идеале вся железка должна потреблять в спящем режиме меньше миллиампера.
Хорошо, спасибо за подсказки. К сожалению мой мультиметр отказываеться показывать токи меньше 200мА, проверить не могу.
тоже есть такая задача, только бутлоадер на нано никак не перешью (((
У меня Attiny13, если разберетесь, то дайте знать, тоже интересно
тоже есть такая задача, только бутлоадер на нано никак не перешью (((
в чем сложность?? На нано прекрасно заливается бут от уно. С догом. Плюс освобождается лишних 1.5 кило памяти.
тоже есть такая задача, только бутлоадер на нано никак не перешью (((
Почитайте интернет /форумы, качественно усыпить можно голые МК, для например Nano необходимо отрывать светодиоды, стабилизатор, usb конвертер....нафига это если можно просто взять atmega328p например.
тоже есть такая задача, только бутлоадер на нано никак не перешью (((
Получилось!
Теперь жду Ваш пример как усыплять ардуину на час
Теперь жду Ваш пример как усыплять ардуину на час
так вроде в #12 andriano все уже рассказал? или что-то не понятно?
у меня таким образом аттини спит минуту - но разницы с часом никакой, любой сон дольше 8сек делается одинаково
Теперь жду Ваш пример как усыплять ардуину на час
так вроде в #12 andriano все уже рассказал? или что-то не понятно?
у меня таким образом аттини спит минуту - но разницы с часом никакой, любой сон дольше 8сек делается одинаково
Лично мне лучше пальцем (кодом) показать )))
Лично мне лучше пальцем (кодом) показать )))
обленились, щас найду.
Лично мне лучше пальцем (кодом) показать )))
играете с огнем %) - новичков за такие пассажи мордой в грязь :)
На работе кода нет, а на паямть не помню
если до того пример не найдете - поздно ночью выложу
http://arduino.ru/forum/programmirovanie/attiny13a-101-primenenie?page=2...
http://arduino.ru/forum/programmirovanie/attiny13a-101-primenenie?page=27#comment-335373
Отличный исходник, почему я раньше его не находил, спасибо!
P.S. С каким датчик производится работа, DS12B20?
P.S. С каким датчик производится работа, DS12B20?
Да.
ЗЫ. Ничего в нем отличного нет, переписать получение температуры надо с использованием библиотеки и с контролем CRC, вместо самодельной отправки воткнуть библиотеку RCswitch. но как обычно некогда....и лень тестировать.
Ничего в нем отличного нет
Как минимум то, что он уже готов(код). А я неделю сидел и разбирал разные примеры, переделывал и палил контроллеры xD
P.S. Какую вы ногу в датчике отывали? из той темы. У меня тоже модули по супергетеродинной схеме WL102-341
P.S. Какую вы ногу в датчике отывали? из той темы. У меня тоже модули по супергетеродинной схеме WL102-341
с трудом :(
откопал маркировку микросхемы, по даташиту нашел пин, своими кривыми руками огромным ножиком с трудом подцепил крощечный пин, китайским паяльником припаял проводок, залил все лаком, т.к. все на улице должно стоять, ну вроде почти год уже работает.
Upd:
Вот последний вариант от 17.01.2018, т.к. проверки на корректность температуры не было, тупо проверяется подряд три раза и если нули - просто ничего не оправляет.
а вот вариант правильного получения температуры на Attiny85 и DS18B20 с последующей отправкой по Software UART, соотвественно достаточно дорисовать отправку по радиоканалу и протестировать...никак руки не дойдут.
Сейчас замерил потребление своего утсройства)
Режим глубокого сна: 0.0056 мА
Режим работы: 0.1254 мА
При срабатывании раз в минуту, и длительностью работы 500мс, устройство проживет 1288.86 дня, или 3.53 года. от батарейки CR2032
Невероятно!
Калькулятор
А если морозы учесть ;)?
У меня на совсем китайской cr2032 за 12 рублей отработало на улице 9 месяцев. Поставил в октябре varta батарейки, посмотрим...на сколько хватит.
Я правильно понял, обычная часовая батарейка на 3В?
А как питание организовано? Можно схему посмотреть?
И как организован спящий режим?
А как питание организовано? Можно схему посмотреть?
плюс батарейки на VCC контроллера, минус - на GND
А если тему почитать? - там же все ответы есть. Совсем уже обленились