Оперативная память ценный ресурс, а Flash память программ не часто используется на 100%. Строковые литералы засоряют оперативную память даже если они используются для объявления переменных и констант локально.

Строковые литералы можно хранить в Flash памяти. На плате Arduino UNO, NANO и им подобных установлен микроконтроллер ATmega328 / P. М-к ATmega328 содержит 32 Кбайт Flash-памяти программ, 1 Кбайт энергонезависимой памяти (EEPROM), 2 Кбайт оперативной памяти (SRAM).

Пример, сохраняем строку вFlash памяти и восстанавливаем в строковый массив:

PROGMEM const char msgSendRemoteXY[] = "Подключите смартфон к Wi-Fi RemoteXY, запустите APP RemoteXY.";
PROGMEM const char msgSSIDpwd[] =      "В приложении RemoteXY введите SSID и пароль вашей Wi-Fi сети.";

void setup() {
  Serial.begin(115200);
  delay(1000);
}

void loop() {
  printMsg(msgSendRemoteXY);
  printMsg(msgSSIDpwd);
  delay(500);
}

void printMsg(int msg) {
  char buf [128];
  int i = 0;
  while (pgm_read_byte_near(msg + i) != 0) {
    buf[i] = pgm_read_byte_near(msg + i);
    i++;
  }
  buf[i] = 0;
  Serial.println(buf);
}

Скетч использует 1968 байт (6%) памяти устройства. Глобальные переменные используют 188 байт (9%) динамической памяти.

Сравните наш результат с более простой программой, без оптимизации:

void setup() {
  Serial.begin(115200);
  delay(1000);
}

void loop() {
Serial.println("Подключите смартфон к Wi-Fi RemoteXY, запустите APP RemoteXY.");
Serial.println("В приложении RemoteXY введите SSID и пароль вашей Wi-Fi сети.");
  delay(500);
}

Скетч использует 1884 байт (5%) памяти устройства. Глобальные переменные используют 374 байт (18%) динамической памяти.

Вывод, мы смогли сэкономить 50% (динамической) оперативной памяти.

Ещё один вариант программы оптимизированный по использованию памяти:

PROGMEM const char msgSendRemoteXY[] = "Подключите смартфон к Wi-Fi RemoteXY, запустите APP RemoteXY.";
PROGMEM const char msgSSIDpwd[] =      "В приложении RemoteXY введите SSID и пароль вашей Wi-Fi сети.";

void setup() {
  Serial.begin(115200);
  delay(1000);
}

void loop() {
  Serial.println(flashString(msgSendRemoteXY));
  Serial.println(flashString(msgSSIDpwd));
  delay(500);
}

String flashString(int msg) {
  String str;
  int i = 0;
  while (pgm_read_byte_near(msg + i) != 0) {
    str += char(pgm_read_byte_near(msg + i));
    i++;
  }
  return str;
}

Скетч использует 3424 байт (10%) памяти устройства. Глобальные переменные используют 198 байт (9%)