1

アナログ電圧を 10 回測定pin0してログ ファイルに出力するプログラムを作成しています。私が直面している問題は、ファイルが空白であることを確認しようとしたときに発生します。SD.remove()以前のログファイルを削除するために使用しています。これを行うと、新しいログ ファイルが実際に書き込まれることはありません。への呼び出しを削除するとSD.remove()、プログラムは正しく動作します。これは SD ライブラリの既知のバグですか、それともこっそり回避する方法はありますか?

コードは以下です。

#include <SD.h>
#define OUTPUT_PIN 9 //Using SparkFun MP3 shield
#define DEFAULT_OUTPUT 10
#define VOLTAGE_REF (5)

//Reads a voltage on pin0. by default, the reference voltage is set to 5 V, but
//it can be changed by changing VOLTAGE_REF.

void setup() {
    Serial.begin(9600);
    Serial.println("Program Initialized");

    pinMode(DEFAULT_OUTPUT ,OUTPUT); //Needs to be on to use the library
    pinMode(0, INPUT);

    if (!SD.begin(OUTPUT_PIN)) {
        //init error
        Serial.println("Error initializing SD card. Reset the Arduino and try again");
        return;
    }

    Serial.println("Card sucessfully initialized");

    if (SD.exists("LOGFILE.LOG") {
        SD.remove("LOGFILE.LOG"); //We don't want to use the same file <<THIS IS THE BUG?
    }

    delay(10); //Make sure changes are applied

    File logFile = SD.open("ANALOG.LOG", FILE_WRITE); //Create a new one every time
    if (!SD.exists("LOGFILE.LOG")) {
        Serial.println("There was some error making a new instance of the logfile?");
        delay(1000);
        SD.open("ANALOG.LOG", FILE_WRITE);
    }
    int i;

    if (logFile) {
        for(i=0;i<10;i++) {
            int j = 0;
            char str[64];

            Serial.print("Reading analog sensor value");
            for(j=0;j<=i;j++) {
                Serial.print(".");
            }
            Serial.println();

            logFile.print("Read #");
            logFile.print(i+1);
            logFile.print(" : ");
            logFile.print(doVoltageRead(0));
             unsigned char l = logFile.println(" V");
             if (!l)
                 Serial.println("No data written");
             delay(500);
        }
        Serial.println("Done.");
        logFile.close(); //Close the logfile
        Serial.println("Data sucessfully written");
    }
    else {
        //Couldn't create file
        Serial.println("There was an error creating the logfile");
    }
}

void loop() {
    //We don't really need to do anything here
}

float doVoltageRead(int pin) {
    int voltageRead = analogRead(pin);
    double divisor = (voltageRead * 0.00097752);
    float finalVoltage =(VOLTAGE_REF * divisor);
    Serial.println(finalVoltage);
    return finalVoltage;
}
4

2 に答える 2

0

エラーの原因を見つけました。新しいログファイルを開いた後に電話をかけたときif(SD.exists())、ライブラリはそれを気に入らなかった。SD.exists()openから返されたアドレスまたはオブジェクトがNULLかどうかをチェックするだけだと思います。ただし、ファイルがすでに開いているときに呼び出すと、奇妙な動作が発生します。open内のその呼び出しを削除した後、すべてが順調です。すべての提案をありがとう!

于 2012-11-04T20:12:31.017 に答える
0

そう..まず、LOGFILE.LOG が存在するかどうかを確認します。存在する場合は、ANALOG.LOG を削除します。次に、ANALOG.LOG を作成します。その後、LOGFILE.LOG が存在するかどうかを確認します。そうでない場合は、エラーを出力して ANALOG.LOG を開きます。

LOGFILE.LOG の目的は何ですか? LOGFILE を ANALOG に変更するべきではありませんか?

于 2012-11-01T08:52:28.850 に答える