Плата Arduino Nano ESP 32 (ABX00083) SD-библиотека не работает
Я работаю над простым кодом для записи данных на карту 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() {
// Здесь нечего делать
}
@Rekcoj, 👍0
Обсуждение2 ответа
Код работает на Arduino Uno, поскольку это API для библиотеки SD для Arduino Uno. Для Arduino Nano используется ESP32, поэтому вам следует использовать пример для библиотеки SD для ESP32, а не для Uno.
Есть небольшие различия:
- если вы не собираетесь переназначать порт SPI, вам не нужно передавать CS в SD.begin();
- В отличие от библиотеки Arduino Uno SD, которая ожидает передачи имени файла, ESP32
SD.open()унаследован от библиотеки ESP32 FS, которая ожидает путь вместо имени файла при вызовеSD.open(), поэтому вместо простоdta.txtдолжно бытьSD.open("/dta.txt", FILE_WRITE);.
У меня возникли некоторые трудности с запуском 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);
}
- avrdude ser_open() can't set com-state
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Какое максимальное энергопотребление Arduino Nano 3.0?
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?
- Arduino nano как клавиатура HID
- Питание светодиодной ленты - Сколько ампер?
- Самый компактный способ питания Arduino от розетки
- Как я могу запитать Arduino Nano от батареи LiPo, желательно 3,7 В
Сначала убедитесь, что контакт выбора чипа (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