如何正确关闭SD卡模块

问题描述 投票:0回答:2

我尝试构建一个带有SD卡的数据记录器来保存传感器数据。我需要在电路进入睡眠状态后立即降低功耗。问题是SD卡模块的功耗约为3mA。我读了很多关于省电的文章,很多人都在唤醒时将电源切换到 SD 卡模块并重新初始化卡。我无法实现这一点。一旦 SD 卡模块关闭,只会抛出错误消息。有人能给我一个提示,让我走上正轨吗?如何正确重新初始化SD卡模块?

第一次醒来之前一切都正常。然后抛出代码错误消息“卡失败或不存在”并且循环将再次开始而不写入 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
arduino sleep sd-card
2个回答
1
投票

常用的

SD.h
库无法管理断电的SD卡模块。断电后,代码将抛出错误。该卡无法重新初始化。

我用

SdFat.h
代替,效果非常完美。 SD 卡消耗大量电流。如需切换 SD 卡模块,建议使用 MOSFET。


0
投票

当然,您需要在关闭 SD 文件之前关闭它,否则该文件将处于不确定状态,后续读取将仅显示一个空文件。

© www.soinside.com 2019 - 2024. All rights reserved.