2014-11-24 6 views
1

센서 데이터를 저장하는 SD 카드가있는 데이터 로거를 만들려고합니다. 회로가 잠자기하자마자 전력 소비를 줄여야합니다. 문제는 약 3mA의 SD 카드 모듈의 전력 소비입니다. 저는 절전에 대해 많은 것을 읽었으며 많은 경우 깨어날 때 카드를 다시 초기화하여 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

+0

코드 및 로그의 예를 제공해야합니다. 그것을 단지이 이슈로 끓여 내려고하십시오. – mpflaga

+0

파일을 닫은 후에 무엇이 오류를 일으키는 지 불분명합니다. 오류가 발생하면 더 이상 호출 할 필요가 없습니다. 그것이 다시 초기화 될 때까지. – mpflaga

답변

1

자주 사용 SD.h 라이브러리의 전원이 꺼져 SD 카드 모듈을 관리 할 수 ​​없습니다. 전원이 꺼지면 코드가 오류를 발생시킵니다. 카드를 다시 초기화 할 수 없습니다.

대신 SdFat.h을 사용했으며 완벽하게 작동합니다. SD 카드는 많은 전류를 소모합니다. SD 카드 모듈을 전환하려면 MOSFet을 권장합니다.