2014-11-24 107 views
1

我嘗試使用SD卡構建數據記錄器以保存傳感器數據。一旦電路進入休眠狀態,我需要降低功耗。問題是SD卡模塊的功耗約爲3mA。我讀了很多關於節電的文章,其中許多人在喚醒時重新初始化卡時會切換到SD卡模塊的電源。我無法做到這一點。一旦SD卡模塊切換,只會引發錯誤消息。任何人都可以給我一個提示讓我走上正軌嗎?如何重新初始化SD卡模塊?Arduino:如何關閉SD卡模塊

感謝

1.編輯 一切工作正常,直到第一個醒來。比代碼錯誤消息「卡失敗或不存在」被拋出,循環將重新開始而不寫入SD卡。 這裏是我走到這一步:

// DHT sensor library 
#include "DHT.h" 
// SD card library 
#include <SD.h> 
// for sleep modes 
#include <avr/interrupt.h> 
#include <avr/power.h> 
#include <avr/sleep.h> 

#define DHTPIN 9  
#define DHTTYPE DHT22 //DHT11, DHT21, DHT22 

DHT dht(DHTPIN, DHTTYPE); 

// make sure that the default chip select pin is set 
const int chipSelect = 4; 
int counter = 0; 
int sdPower = 8; 
volatile int sleepcounter = 0; // count sleep cycles 

void setup() { 
pinMode(sdPower, OUTPUT); 
// output, even if you don't use it to ensure proper SD library working: 
pinMode(10, OUTPUT); 
digitalWrite(sdPower, LOW); 
watchdogOn();    // switch on Watchdog timer 
ADCSRA = ADCSRA & B01111111; // switch off ADC, ADEN bit7 zu 0 
ACSR = B10000000;   // switch off analog Comparator, ACD bit7 to 1 
DIDR0 = DIDR0 | B00111111; // switch off digital input buffer, analog input pins 0-5 to 1 

dht.begin(); 
} 

// -------------------------------------- LOOP --------------------------------- 
void loop() { 
Serial.begin(9600); 
// ------------------------- initialize SD card ------------------------- 
digitalWrite(sdPower, HIGH); 
Serial.println("Start of recording"); 
delay(500); 
// see if the card is present and can be initialized: 
if (!SD.begin(chipSelect)) { 
    Serial.println("Card failed, or not present"); 
    delay(100); 
    // don't do anything more: 
    return; 
} 
Serial.println("card initialized."); 

// -------------------------------------------------------------------------- 
float humidity = dht.readHumidity();  //measure humidity 
float temp = dht.readTemperature();  //measure temp 

// make a string for assembling the data to log: 
String dataString = ""; 
// ------------------------- read sensor and store in string ----------------------------- 
// check for valid number, throw error for NaN (not a number) 
if (isnan(temp) || isnan(humidity)) { 
    Serial.println("no read for DHT22"); 
} 
else { 
    dataString += "MP-"; 
    dataString += String(counter); 
    dataString += ","; 
    dataString += String(temp); 
    dataString += ","; 
    dataString += String(humidity); 
    // ------------------------- open SD card and write values ----------------------------- 
    // open the file. note that only one file can be open at a time, 
    // so you have to close this one before opening another. 
    delay(1000); 
    File dataFile = SD.open("datalog.txt", FILE_WRITE); 

    // if the file is available, write to it: 
    if (dataFile) { 
     dataFile.println(dataString); 
     dataFile.close(); //dataFile.sync() doesn't change something 
     delay(500); 
     // print to the serial port too: 
     Serial.println(dataString); 
     delay(500); 
     counter = counter + 1; 
    } 
    // if the file isn't open, pop up an error: 
    else { 
     Serial.println("error opening datalog.txt"); 
    } 
    //-------------------------------------- sleep mode activation ---------------------------- 
    // Stay awake for 0.5 second, then sleep. 
    delay(500); 
    digitalWrite(sdPower, LOW); 
    delay(500); 
    pwrDown(5);   // go to sleep for (x) sec. 
} 
} 

// some methods for sleep mode are not shown 
+0

你現在在做什麼?可能有助於顯示一些代碼或詳細說明您正在設置的任何保險絲 – djUniversal 2014-11-25 03:12:09

+0

您需要提供代碼和日誌的示例。試着將其歸結爲這個問題,沒有別的。 – mpflaga 2014-11-25 15:23:57

+0

關閉文件後,您不清楚是什麼給了您錯誤。應該沒有更多的電話來拋出錯誤。直到它被重新初始化。 – mpflaga 2014-11-25 15:25:26

回答

1

經常使用的SD.h庫是無法管理斷電SD卡模塊。在電源被拿走後,代碼會發出錯誤。該卡無法重新初始化。

我改用SdFat.h,它的工作原理非常完美。 SD卡吸取了大量電流。要切換SD卡模塊,建議使用MOSFet。