Сегодня предлагаю рассмотреть возможность ардуинки уходить в режим сна и выходить из него по таймеру в целях экономии энергопотребления.
Для тех, кто не знает, в ардуине есть возможность настроить прерывания. Например поставить кнопку на прерывание и выполнять определенную задачу по нажатию в независимости от того, какая операция в данный момент.
Детальнее о прерываниях и о том, какие входа можно использовать под прерывания можно прочитать здесь https://www.arduino.cc/en/Reference/AttachInterrupt
Если будут вопросы по этому, могу ответить в комментариях или сделать дополнительный пост.
Следующая возможность ардуинки - уходить в сон для сбережения энергопотребления. Детальнее о режимах сна и потреблениях тока в разных режимах можно прочитать здесь https://www.gammon.com.au/forum/?id=11497
Самый экономный режим - это SLEEP_MODE_PWR_DOWN : 0.36 mA
Теперь рассмотрим каким образом можно выйти из сна.
Выход из может осуществлятся двумя методами:
1) WatchDog Timer - грубо говоря внутренний таймер. Максимальное время сна от 7-9 секунд. Можно использовать и его, как таймер. Например если вам надо, чтобы ардуинка выполняла какое-то деуствие каждый час, а между этим спала, то можно просыпаться каждые 7-9 секунд, суммировать время сна и если набежал час, то выполнять действие. Недостатком этого метода является то, что нужно часто просыпаться и время сна 7-9 секунд не является константой, а колебается постоянно в этих пределах, соответственно на большом отрезке времени будет большая ошибка суммарного времени.
2) по внешнему прерыванию (нажатие кнопки, геркон и т.д.)
Об этих методах вы также можете прочитать здесь https://www.gammon.com.au/forum/?id=11497
В методе рассмотреном в данном посте мы будем использовать внешнее прерывания и модуль часов (RTC DS3231), который будет выполнять функцию будильника.
Собираем схемку как показано на картинке
Модуль RTC DS3231 работает по I2C и на нем можно запрограммировать будильники (возможно установить 2 будильника). В обычном режиме на выходе SQW сигнал HIGH, при срабатывании будильника сигнал будет LOW - это мы и будем использовать на прерывании.
Стоит еще сказать, что будильник устанавливается на конкретное время, поэтому, чтобы использовать его как таймер, мы будем отсчитывать определенное количество минут и добавлять к исходному времени.
Для работы с будильниками нужно скачать библиотеку https://github.com/jarzebski/Arduino-DS3231
И пример моего кода я выложил тут http://paste.ofcode.org/7DPT3ZmdjEe5NjqS2jrEX2
Вот то, что вы должны видеть в мониторе последовательного порта
21-02-2000 00:58:52 - Wednesday
Sleep
Wake UP
21-02-2000 00:59:52 - Wednesday
Sleep
таймер выставляется в минутах тут
setSleepTimer(1); - в данном случае стоит 1 минута
также, если вам нужно, чтобы платка перезагружалась после выхода из сна и заново выполнялся бы setup(), вы можете раскомментировать строку resetFunc();
В данном посте я не рассматривал примеры работы с модулем RTC DS3231, для этого есть примеры в библиотеке. Но если нужно, могу ответить на вопросы или сделать пост.
В следующем посте собираюсь описать возможности прошивки WiFi модуля ESP8266