PROGMEMは変数の修飾子で、データをSRAMではなく、ROMエリア(フラッシュメモリ,プログラムメモリ)に配置します。
RAMの残りの容量が少なくなった時には、ROMにエリアに移せる変数がないか検討してみてください。
ESP32では、const や constexpr 指定子 を付けても、ROMエリアに配置されるようです。
ESP32 上の PROGMEM は、実際にはコードの互換性のために保持されている単なるダミーとの事です。
On an ESP32: Is using the F()Macro as pointless as using PROGMEM?
書式
PROGMEMは変数の修飾子なので、どこに記述するかの明確な規則はないようです。
コンパイラやそのバージョンによっては、正常に動作しない事もあるようですので、その場合は、記述する場所を変えてみてください。
const dataType variableName[] PROGMEM = {}; // use this form
const PROGMEM dataType variableName[] = {}; // or this one
const dataType PROGMEM variableName[] = {}; // not this one
- dataType 任意の変数のデータ型。
- variableName データの配列の名前。
参考URL
以下のURLも参考にしてください。