Работа с памятью (microSD)

Цель — записать строку на microSD-карту и прочитать её обратно. Если этот тест прошёл, значит SPI-шина и SD-модуль исправны и можно переходить к более сложным сценариям (логирование GPS, телеметрия).

Распиновка — см. Подготовка среды разработки. Ключевое:

  • CS SD-карты: D4;

  • общая SPI-шина: MOSI=D11, MISO=D12, SCK=D13;

  • CSN nRF24L01+ (D10) сидит на той же SPI-шине, но в этом тесте мы его не трогаем — модуль остаётся в idle и линию не держит.

Тестовый скетч

examples/sd_card_test/sd_card_test.ino
#include <SPI.h>
#include <SD.h>

const uint8_t SD_CS = 4;               // CS SD карты в main_full
const char* LOG_FILE = "TEST.CSV";

void printFile(const char* path) {
  File f = SD.open(path, FILE_READ);
  if (!f) {
    Serial.println("Read fail: cannot open file");
    return;
  }

  Serial.println("--- File content start ---");
  while (f.available()) {
    Serial.write(f.read());
  }
  Serial.println();
  Serial.println("--- File content end ---");
  f.close();
}

void setup() {
  Serial.begin(115200);
  delay(300);

  Serial.println("microSD test start");
  Serial.println("SPI: D11(MOSI), D12(MISO), D13(SCK), CS=D4");

  if (!SD.begin(SD_CS)) {
    Serial.println("SD init failed");
    Serial.println("Check power, GND, CS=D4, and SPI wires");
    while (true) delay(1000);
  }
  Serial.println("SD init OK");

  File f = SD.open(LOG_FILE, FILE_WRITE);
  if (!f) {
    Serial.println("Create/write failed");
    while (true) delay(1000);
  }

  // Простая строка телеметрии (пример)
  f.println("ms,temp_c,hum_%,co2_ppm");
  f.println("12345,24.7,38.5,420");
  f.close();
  Serial.println("Write OK");

  printFile(LOG_FILE);
  Serial.println("microSD test done");
}

void loop() {
  // Ничего не делаем, тест выполнен в setup()
}

Скетч инициализирует карту, создаёт файл TEST.CSV, пишет в него заголовок и одну строку, потом читает файл обратно и печатает в Serial. Весь тест выполняется один раз в setup(), loop() пуст.

Подготовка карты

  • Карта должна быть отформатирована в FAT32 (не exFAT, не NTFS).

  • Размер до 32 ГБ работает гарантированно. 64+ ГБ карты могут не опознаться библиотекой SD — встроенная Arduino-библиотека старая.

  • На карте не должно быть файла TEST.CSV от предыдущих тестов — иначе скетч просто допишет ещё одну строку (это тоже нормально).

Как запустить

  1. Вставьте карту в модуль.

  2. Залейте скетч.

  3. Откройте Serial Monitor на скорости 115200.

Что должно быть видно

microSD test start
SPI: D11(MOSI), D12(MISO), D13(SCK), CS=D4
SD init OK
Write OK
--- File content start ---
ms,temp_c,hum_%,co2_ppm
12345,24.7,38.5,420
--- File content end ---
microSD test done

После этого можно:

  • Извлечь карту, вставить в ноутбук — TEST.CSV должен открыться в любом редакторе или Excel.

  • Залить полную миссию (main_full) — она будет писать свой лог TBOY.CSV рядом с TEST.CSV.

Если SD init failed

  • Карта вставлена не до щелчка.

  • Карта не FAT32 — переформатируйте через штатные средства ОС или SD Memory Card Formatter от sdcard.org.

  • Карта > 32 ГБ — попробуйте меньшую.

  • Контакт SPI: пошевелите провода D11/D12/D13, особенно у разъёма Nano.

  • Карта живая, но не отвечает — попробуйте другую карту (механически изношенные SD это частая причина).