센서 데이터를 저장하는 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
지금 무엇을 시도하고 계십니까? 설정하고있는 퓨즈에 대한 코드 또는 세부 사항을 표시하는 데 도움이 될 수 있습니다. – djUniversal
코드 및 로그의 예를 제공해야합니다. 그것을 단지이 이슈로 끓여 내려고하십시오. – mpflaga
파일을 닫은 후에 무엇이 오류를 일으키는 지 불분명합니다. 오류가 발생하면 더 이상 호출 할 필요가 없습니다. 그것이 다시 초기화 될 때까지. – mpflaga