Микроконтроллер ATmega328P на базе которого работают платы Arduino Nano и Arduino UNO обладает достаточно скромными характеристиками необходимой для реализации сложных проектов в плане оперативной (энергозависимой) памяти SRAM.
Можно поискать альтернативу на других мощных платформах, взять какой-нибудь 32-х битный STM - но цена вопроса будет уже другая ну и совсем не факт, что на другой платформе будут работать библиотеки предназначенные для Arduino. В каких ситуациях может не хватать оперативной памяти? - В первую очередь при работе с графическими дисплеями. Разберем пример:
У нас есть вот такой монохромный дисплей с разрешением 128х64.
Для работы с ним в оперативной памяти потребуется выделить буфер ( однобайтовый массив) размерностью
128х64/8 = 1024 байта
т.е. мы займем половину памяти Arduino - и в принципе Arduino с такой задачкой справится. А, что если взять вот такой дисплей, да еще и поработать с оттенками серого (4 цвета).
Нам уже потребуется
400х300/4 = 30000 байт оперативной памяти.
Разумеется, что такой объем данных не влезет в оперативную память
Arduino да и многих других Arduino подобных платформ.
Можно поискать подходящую платформу - а можно прикрутить внешнюю SRAM память. Для решения задачи я выбрал микросхему 23LC512 c интерфейсом SPI от производителя Microchip
Объем памяти 512K bit / 8 = 64кб
После подключения, мы получаем дополнительные 65535 однобайтовых ячеек где можем хранить наши переменные. Память это энергозависимая то есть данные хранятся только пока у нас есть питание - за то мы не ограничены в количестве циклов записи/чтения. Работать с этой памятью не намного сложнее чем с обычным массивом - я даже не буду использовать библиотеки.
Схема тестового стенда:
Вместо платы Arduino я буду использовать Российскую платформу Iskra Nano Pro на микроконтроллере ATmega328PB. В отличии от оригинальной платы Arduino у нее есть 2-й аппаратный SPI. Работа с памятью будет производится без Ардуиновских библиотек на языке С - но в среде ArduinoIDE. В памяти выделяется область адресов для буфера (куда мы будем подгружать картинки и рисовать графические примитивы) для двух дисплеев, а после создания картинки будем переписывать содержимое памяти на дисплеи через 1-й аппаратный SPI. Такое решение даст минимизацию трудозатрат при редактировании существующих библиотек и позволит работать с дисплеями с высоким разрешением.
Разумеется что можно использовать и оригинальную плату Arduino на микроконтроллере ATmega328P - повесив память на ту же шину, что и дисплеи - но писать код будет несколько сложнее.
Весь код для записи и чтения байтов из внешней SRAM уместился на одной страничке: