Не используйте Arduino IDE! Всё замечательно, пока не нужно ничего
особенного. Всё работает, сразу, очень удобно, библиотеки готовы.
Но только шаг в сторону - микропотребление, например, - всё! Жопа! Вот, спрашивал у меня сын, как работают беспроводные замки, автосигнализации и ключи. Спрашивал, какие уязвимости, как можно вскрыть систему по радио, зачем брелоки делают с двухсторонней связью? Что такое мастер-ключ?
И решили сделать свой ключ (ну и замок, соответственно). Чип контроллера, atMega328P, определился наличием модулей Arduino Nano. В качестве инструментов, было предложено на выбор: MPLAB X IDE и Arduino IDE.
Сын выбрал Arduino, так как я не смог ему показать, как быстро начать работу с NRF24L01+ в MPLAB, зато он сам смог мне показать, как работать с NRF24L01+ из Arduino IDE на C++.
Ладно, с инструментарием определились. Было составлено предварительное ТЗ на работу замка:
- 11 лет работы без повтора кода в эфире. Текуший код хранится в EEPROM.
- Цифровая подпись команды ключом с уникальным кодом по алгоритму SHA256.
- Условия отработки команды:
Успешная проверка нормера кода (номер может быть только выше предыдущего, исполненного); Успешная проверка цифровой подписи команды и текущего кода закрытым ключом.
- Самосинхронизация нормера кода замка и ключа на случай замены ключа (закрытый ключ только в прошивке).
- Срок жизни аккумулятора в режиме ожидания не менее 2 месяцев.
Замечательно. Программы ключа и замка написаны в Arduino IDE. Отладочная информация с обоих устройств выводится по UART. Всё готово для переноса "в железо", кроме оптимизации энергопотребления и спящего режима МК. Решили отлаживать потребление уже на готовом железе.
Наступили выходные. Решено было построить "конструкцию выходного дня". См. фото ключа. Замок пока в виде россыпи модулей Arduino, пока отлаживаем ключ. Изготовил наплевательски, классической ЛУТ. На удивление, спаялось, замыкания и обрывы удалось устранить без нервотрёпки, легко и непринуждённо.
Питание - аккумулятор LIR2466 (нашёл во дворе промзоны, где налаживали дозаторы отечественных РБУ).
Не без сложностей, добились потребления Mega328P 110нА в спящем режиме. Стабилизатор SEPIC порадовал - в режиме покоя (EN низкий уровень) +40нА к микроконтроллеру. Итого, спячка 150нА. Работа - до 25мА@2.75В на излёте заряда аккумулятора.
Так вот, проблемы начались с Arduino IDE и её библиотеками при попытке внедрить спящий режим.
Оказалось, само ядро к этому не приспособлено. Нашли, как восстановить работу таймера. Вроде разобрались с восстановлением работы SPI. Но, после сна, виснет код библиотеки NRF24. Всё объектно-ориентированное, концов - не найти.
Предложил переписать полностью на свой код, и собрать в MPLAB X. Благо, SPI у Mega328P примитивный. Сын пока не согласился. Копает Arduino, отлаживает с выводом UART. Посмотрим, чем закончится.


https://www.eemb.com/public/image/download/LIR2466.pdf