I've encountered this weird problem where the SD breakout board works on the dev-Board but not on barebone setup and can't seem to find the source of the problem:
Here's what not working on Barebone(PCB and Breadboard), when I try to turn on/off the SD board through MOSFET(N-Channel) the problem seems to exist.
CODE 1: (MOSFET/SD turned on/off)
#include <SPI.h>
#include <SD.h>
//Gate Pin for MOSFET IRF540N
int MOS_PIN = 8;
//Status LED
int LED = 4;
//SD Module CS
int CS_PIN = 10;
unsigned long previousMillis = 0;
const long interval = 10000;
void setup() {
Serial.begin(9600);
pinMode(MOS_PIN, OUTPUT);
pinMode(LED, OUTPUT);
pinMode(CS_PIN, OUTPUT);
digitalWrite(MOS_PIN, HIGH);
Serial.println("SD Initializing:");
if(!SD.begin(CS_PIN))
{
Serial.println("SD ERROR");
digitalWrite(LED, HIGH);
return;
}
Serial.println("SD READY");
FlashLED(2, 500);
} //end setup
void FlashLED (int rep, int delayTime)
{
for (int i = 0; i < rep; i++)
{
digitalWrite(LED, HIGH);
delay(delayTime);
digitalWrite(LED, LOW);
delay(delayTime);
}
} //end FlashLED
void loop() {
digitalWrite(MOS_PIN, LOW);
unsigned long timeStamp = millis();
String strData = "Hello World";
if (timeStamp-previousMillis >= interval)
{
SPI.begin();
digitalWrite(MOS_PIN, HIGH);
if(!SD.begin(CS_PIN))
{
Serial.println("SD ERROR _ LOOP");
digitalWrite(LED, HIGH);
previousMillis = timeStamp;
return;
}
File file = SD.open("LOGTST1.csv", FILE_WRITE);
if (file)
{
file.print(timeStamp);
file.print(",");
file.println(strData);
file.close();
Serial.print(timeStamp);
Serial.print(",");
Serial.println(strData);
FlashLED(4,250);
previousMillis = timeStamp;
}
else
{
previousMillis = timeStamp;
digitalWrite(LED, HIGH);
Serial.println("FILE ERROR");
}
SPI.end();
}
}//end loop
The program seems to restart on its own when it reaches this part of the code
void loop() {
digitalWrite(MOS_PIN, LOW);
unsigned long timeStamp = millis();
String strData = "Hello World";
if (timeStamp-previousMillis >= interval)
{
SPI.begin();
digitalWrite(MOS_PIN, HIGH);
if(!SD.begin(CS_PIN))
{
Serial.println("SD ERROR _ LOOP");
digitalWrite(LED, HIGH);
previousMillis = timeStamp;
return;
}
Working codes for the barebones:
CODE 2 (MOSFET/SD always ON):
#include <SPI.h>
#include <SD.h>
//Gate Pin for MOSFET IRF540N
int MOS_PIN = 8;
//Status LED
int LED = 4;
//SD Module CS
int CS_PIN = 10;
unsigned long previousMillis = 0;
const long interval = 10000;
void setup() {
Serial.begin(9600);
pinMode(MOS_PIN, OUTPUT);
pinMode(LED, OUTPUT);
pinMode(CS_PIN, OUTPUT);
digitalWrite(MOS_PIN, HIGH);
Serial.println("SD Initializing:");
if(!SD.begin(CS_PIN))
{
Serial.println("SD ERROR");
digitalWrite(LED, HIGH);
return;
}
Serial.println("SD READY");
FlashLED(2, 500);
} //end setup
void FlashLED (int rep, int delayTime)
{
for (int i = 0; i < rep; i++)
{
digitalWrite(LED, HIGH);
delay(delayTime);
digitalWrite(LED, LOW);
delay(delayTime);
}
} //end FlashLED
void loop() {
unsigned long timeStamp = millis();
String strData = "Hello World";
if (timeStamp-previousMillis >= interval)
{
SPI.begin();
if(!SD.begin(CS_PIN))
{
Serial.println("SD ERROR _ LOOP");
digitalWrite(LED, HIGH);
previousMillis = timeStamp;
return;
}
File file = SD.open("LOGTST1.csv", FILE_WRITE);
if (file)
{
file.print(timeStamp);
file.print(",");
file.println(strData);
file.close();
Serial.print(timeStamp);
Serial.print(",");
Serial.println(strData);
FlashLED(4,250);
previousMillis = timeStamp;
}
else
{
previousMillis = timeStamp;
digitalWrite(LED, HIGH);
Serial.println("FILE ERROR");
}
SPI.end();
}
}//end loop
But both codes work on the Dev. board
I've attached some files (BRD Layout, Breadboard, etc) related to the project: