У меня есть Arduino на Адафрут перо мо. Я пытаюсь сохранить данные на adalogger. Идея проста. У меня есть потенциометр, и я хочу записать данные с этого потенциометра на SD-карту. Я могу создать, открыть и закрыть файл CSV, но не могу записать данные с потенциометра в файл CSV на SD-карте.
Очень редко я могу получить данные от датчика для записи в файл CSV. Тем не менее, я не уверен, что это аппаратная проблема, потому что я могу видеть все данные в COM, используя Serial.println()
как я хочу от потенциометра. Он просто не будет записывать на SD-карту. Может кто-то указать, что я могу пойти не так?
Этот код работает:
**Initalize Stuff**
//Project Dependencies
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <string.h>
#include "RTClib.h"
// the setup function runs once when you press reset or power the board
//Global variables, usually associated with physical assets on the board
Sd2Card card;
SdVolume volume;
SdFile root;
char filename[13] = "";
File logfile;
int potPin = 2; //select the input pin for the potentiometer
const int chipSelect = 10;//chip select for SPID
File dataFile;
File sensorData;
bool fileOpen = false;
void setup() {
//Step 1: Initialize Serial
//================================================================
Serial.begin(57600);
//Step 1: Initialize the SD Card
//================================================================
//Step 1: Initialize the SD Card
//================================================================
Serial.println("Initializing SD card...");
while (!SD.begin(chipSelect)) {
// see if the card is present and can be initialized:
Serial.println("...Card failed, or not present");
delay(2000);
}
Serial.println("...Success.");
if (card.init(SPI_HALF_SPEED, chipSelect))
Serial.println("...Card initialized.");
//// print the type of card
Serial.print("\n...Card type: ");
switch (card.type()) {
case SD_CARD_TYPE_SD1:
Serial.println("SD1");
break;
case SD_CARD_TYPE_SD2:
Serial.println("SD2");
break;
case SD_CARD_TYPE_SDHC:
Serial.println("SDHC");
break;
default:
Serial.println("Unknown");
}
sprintf(filename, "%02d%02d%02d%02d.csv", now.month(), now.day(), now.hour(), now.minute());
Serial.print("Initializing date file: ");
Serial.println(filename);
//Step 2: Create and open new logfile
if (SD.exists(filename)) {
Serial.print("...file ");
Serial.print(filename);
Serial.println(" already created before...Success.");
} else {
//File not found, so create it.
dataFile = SD.open(filename, FILE_WRITE);
if (!dataFile) {
Serial.print("...Couldn't create ");
Serial.println(filename);
} else {
Serial.print("...Success opening ");
Serial.println(filename);
Serial.print("...Starting size: ");
Serial.print(dataFile.size());
Serial.print(" bytes");
}
dataFile.close();
}
}
петля
Этот код не работает:
// the loop function runs over and over again until power down or reset
void loop() {
int WriteEnabled = digitalRead(5); //This is when I turn a switch on to record, this works
if (WriteEnabled) {
sensorData = SD.open(filename, FILE_WRITE);
if (sensorData) {
uint32_t value = analogRead(potPin);
//char line[27] = ""; //Define my input line
//sprintf(line, "%04d/%02d/%02d, %02d:%02d:%02d, %04d", now.year(), now.month(), now.day(), now.hour(), now.minute(), now.second(), value); //Doesn't work either, why?
String dataString = String(value);
sensorData.println(dataString);//This doesn't work
Serial.println(dataString);
}
}
if (!WriteEnabled && sensorData) {
sensorData.close();
}
}
Я попытался решить проблему, посоветовавшись с несколькими источниками. Подобные вопросы о переполнении стека не отвечают моей проблеме.
String
а также sprint
, Должен ли я попробовать flush
? Но это не соответствует документации для библиотеки SD. Разочарование. sensorData.flush()
после println()
команда. Не сработало Я изменил запись на SD-карту с помощью String()
а также sprint
чтобы помочь определить данные. Ничего не работает Я не думаю, что это аппаратная проблема, потому что я могу открывать и закрывать файл, но просто не записывать данные. Может кто-нибудь помочь мне? Если кто-то подозревает аппаратное обеспечение, пожалуйста, дайте мне знать, почему. Я действительно сомневаюсь в этом, потому что почему я могу создать файл на SD-карте и увидеть значения потенциометра в COM, но не сохранить их?
Попробуйте изменить код так, чтобы вызов open происходил только тогда, когда флаг WriteEnable изменяется с false на true. Сделайте обратное для близкого разговора.
Для более точного соответствия Arduino Reference переместите вызов close сразу после записи.
Других решений пока нет …