Как сохранить данные на SD-карту с помощью модуля защиты памяти SPI

Я пытаюсь сохранить некоторые данные на SD-карту с помощью модуля защиты памяти, который я прочитал с ультразвукового модуля HC-SR04. Данные, которые выводятся на печать, указывают на ошибку. Вот как подключен мой модуль SD-карты.

SD-карта, подключенная к шине SPI, как
VCC -Arduino 5 В
GND - Arduino GND
MOSI - штифт 11
МИСО - штифт 12
CLK - вывод 13
CS - вывод 4

Тем не менее, Arduino жалуется, что произошла ошибка при открытии файла на SD-карте. Мой скетч таков:

#include <SPI.h>
#include <SD.h>
#define echoPin 6 // Echo Pin
#define trigPin 7 // Trigger Pin

int maximumRange = 250; // Необходимый максимальный диапазон
int minimumRange = 1; // Необходимый минимальный диапазон
long duration, distance; // Длительность, используемая для вычисления
const int chipSelect = 4;

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  Serial.print("Инициализация SD-карты...");
  // посмотрите, присутствует ли карта и может ли она быть инициализирована:
  if (!SD.begin(chipSelect)) {
    Serial.println("Карта вышла из строя или отсутствует");
    // больше ничего не делать:
    return;
  }
  Serial.println("card initialized.");
}

void loop() {
  readDistance();
  if(distance>minimumRange && distance < maximumRange){
    String string = "distance is" + distance;
    // откройте файл. обратите внимание, что одновременно можно открывать только один файл,
    // поэтому вы должны закрыть этот, прежде чем открывать другой.
    File dataFile = SD.open("datalog.txt", FILE_WRITE);
    // если файл доступен, напишите в него:
    if( dataFile ){
      dataFile.println(string);
      dataFile.close();
      Serial.println( string );
    }else{
      //  если файл не открыт, появится сообщение об ошибке:
      Serial.println("ошибка открытия datalog.txt");
      dataFile.close();
    }
  }else{
    Serial.println("Out of range...");
  }
  delay(50);
}

int readDistance(){
  digitalWrite(trigPin, LOW); 
  delayMicroseconds(2); 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); 
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = duration/58.2;
}  

Вывод:

rror opening datalog.txt
rror opening datalog.txt
error opening datalog.txt
rror opening datalog.txt
error opening datalog.txt
error opening datalog.txt
error opening datalog.txt
error opening datalog.txt
error opening datalog.txt

Как мне решить эту проблему, чтобы сохранить показания на SD-карту?

, 👍3

Обсуждение

Повторное открытие файла каждый раз в цикле кажется плохой идеей. К сожалению, абстракции файловой системы не очень хорошо соответствуют тому, что вы хотите сделать. Возможно, вам захочется записать несколько показаний, а затем повторно открыть файл, возможно, с другим именем в увеличивающемся шаблоне. Или вы можете пропустить файловую систему и записать в необработанные блоки. Наиболее практично, взгляните на код, обычно используемый с регистраторами данных uSD на базе Arduino, и посмотрите, что вы можете узнать из того, как они с этим справляются., @Chris Stratton

Я думаю, что вы поджарили свою SD-карту. Эти карты работают при напряжении 3,3 В и могут не выдерживать напряжение 5 вольт., @Maxthon Chan


1 ответ


2

Есть ли какая-либо распечатка на основе этого;

Serial.print("Initializing SD card...");
// посмотрите, присутствует ли карта и может ли она быть инициализирована:
if (!SD.begin(chipSelect)) {
  Serial.println("Карта вышла из строя или отсутствует");
  // больше ничего не делать:
  return;
}
Serial.println("card initialized.");

Решение;

Попробуйте изменить

const int chipSelect = 4; // измените значение на 10

Если нет, попробуйте изменить приведенный выше код на;

Serial.print("Initializing SD card...");
if (!SD.begin(10)) {
  Serial.println("Initialization failed!");
  while (1);
}
Serial.println("Initialization done.");
,