Плата Arduino Nano ESP 32 (ABX00083) SD-библиотека не работает

arduino-nano nano-esp32

Я работаю над простым кодом для записи данных на карту MicroSD с использованием Arduino nano ESP32 (ABX0083) и модуля Df robot SPI MicroSD (DFR0229). Не удаётся записать данные на SD-карту. Возникает ошибка «Ошибка открытия файла dta.txt для записи».

  • Все пины подключены правильно. Используется модуль SD.h. Пины подключены согласно распиновке Arduino Nano-ESP https://docs.arduino.cc/resources/pinouts/ABX00083-full-pinout.pdf

По умолчанию используется распиновка «Arduino». Код хорошо работает с Arduino UNO. Ниже приведён код.

#include <SPI.h>
#include <SD.h>

// Определить контакт выбора чипа для модуля SD-карты
const int chipSelect = 10;



void setup() {
  // Запустить последовательную связь
  Serial.begin(9600);
  //pinMode(chipSelect, OUTPUT);
  pinMode(chipSelect, OUTPUT);

  while (!Serial) {
    // Дождитесь подключения последовательного порта (необходимо для Leonardo и Micro)
  }

  Serial.println("Initializing SD card...");

  // Инициализируем SD-карту
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // Больше ничего не делай
    while (1);
  }
  Serial.println("Card initialized.");

  // Открыть существующий файл для записи
  File dataFile = SD.open("dta.txt", FILE_WRITE);

  // Проверяем, успешно ли открылся файл
  if (dataFile) {
    Serial.println("Writing to dta.txt...");

    // Запишите пример данных
    dataFile.println("Appending new data");

    // Закрыть файл
    dataFile.close();
    Serial.println("Data written to dta.txt successfully.");
  } else {
    // Если файл не открылся, вывести ошибку
    Serial.println("Error opening dta.txt for writing.");
  }
}

void loop() {
  // Здесь нечего делать
}

, 👍0

Обсуждение

Сначала убедитесь, что контакт выбора чипа (CS) правильно определён и подключён. Номера контактов могут отличаться для Arduino Nano ESP32., @tepalia

Код работает на Arduino Uno, поскольку это API для библиотеки SD для Arduino Uno. Для Arduino Nano используется ESP32, поэтому вам следует проверить пример для ESP32, а не для Uno. Есть небольшие различия: 1) если вы не собираетесь переназначать порт SPI, вам не нужно передавать CS в SD.begin(); 2) Для библиотеки SD для ESP32 при вызове SD.open() ожидается path вместо filename, поэтому вместо dta.txt должно быть SD.open("/dta.txt", FILE_WRITE);. См. библиотеку ESP32 [SD](https://github.com/espressif/arduino-esp32/tree/master/libraries/SD)., @hcheung

@hcheung, оказалось, проблема была в объявлении пути к файлу. Всё заработало после добавления "/", как вы и советовали. Спасибо., @Rekcoj


2 ответа


1

Код работает на Arduino Uno, поскольку это API для библиотеки SD для Arduino Uno. Для Arduino Nano используется ESP32, поэтому вам следует использовать пример для библиотеки SD для ESP32, а не для Uno.

Есть небольшие различия:

  1. если вы не собираетесь переназначать порт SPI, вам не нужно передавать CS в SD.begin();
  2. В отличие от библиотеки Arduino Uno SD, которая ожидает передачи имени файла, ESP32 SD.open() унаследован от библиотеки ESP32 FS, которая ожидает путь вместо имени файла при вызове SD.open(), поэтому вместо просто dta.txt должно быть SD.open("/dta.txt", FILE_WRITE);.
,

0

У меня возникли некоторые трудности с запуском SD-карты на моём Nano ESP32. Чтобы добиться желаемого результата, я отформатировал SD-карту в FAT32 и проверил её работу с Nano. После того, как всё заработало на Nano, я перенёс её на Nano ESP32, и всё заработало. Вот код, который я использовал:

#include "SPI.h"

#define SD_MOSI     11
#define SD_MISO     12
#define SD_SCLK     13
#define SD_CS       10

#include <SD.h>

File myFile;

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

  if (!SD.begin(SD_CS)) {
    while (1) {
      Serial.println(F("SD CARD FAILED, OR NOT PRESENT!"));
      delay(1000);
    }
  }

  Serial.println(F("SD CARD INITIALIZED."));

  if (!SD.exists("/esp32.txt")) {
    Serial.println(F("esp32.txt doesn't exist. Creating esp32.txt 
    file..."));
    // создаем новый файл, открывая новый файл и немедленно закрывая его
    myFile = SD.open("/esp32.txt", FILE_WRITE);
    myFile.close();
  }

}

void loop() {
  // перепроверить, создан ли файл или нет
  if (SD.exists("/esp32.txt"))
    Serial.println(F("esp32.txt exists on SD Card."));
  else
    Serial.println(F("esp32.txt doesn't exist on SD Card."));

  delay(3000);
}
,