Problems with DS3231 and SD card module .

Hello all i am new to the forum but have been coding for about 3 years so i know my way around stuff a little just can't get past this problem I'm facing at all. been scrolling through the internet and cannot find the problem.

The project is a kind of home automation system that logs the temperature using a TMP36, light with an LDR, and distance with a HC-SR04. i am also using a DS3231 to create a timestamp and using a microSD card module to save the data. I'm also using an LCD screen to show some findings.

when using the circuit and just programming it so that the ds3231 findings print to the serial and the temperature and light reads to the sd card aswel as the serial, it works. but when it works it says sd card failed but still writes to the file.

When i programme the code to print the ds3231 findings and the sensor readings to the sd card it will say card initialised at the start but will not open the file. its although it acts the complete wrong way around?

//HOME AUTOMATION ARDUINO CODE

// Including of libraries
#include <SD.h> //SD card library
#include <SPI.h> //SD card library
#include "Wire.h" // RTC library
#include "RTClib.h" // RTC library
#include <LiquidCrystal.h> // LCD library
#define DS3231_I2C_ADDRESS 0x68 // defining real time clock module

// Arduino component pins
int LDRValue = 0; // Light Sensor Value
int tmp36Pin = A0; // TMP36 Pin
int LDR = A1; // LDR pin
int buzzerPin = A2; // Buzzer for Intrusion detection system
int redLED = A3; // Red LED pin
// Real time clock module - A4, A5 
int echoFrontDoorPing = 7; // Front door echo pin
const int trigFrontDoorPing = 8; // Front door trig pin
const int sdCardCS = 10; // SD card module Pins
//SD MOSI = 11
//SD MISO = 12
//SD SCK = 13
LiquidCrystal lcdscreen(9, 6, 5, 4, 3, 2); // LCD screen pins
RTC_DS3231 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup() 
{
  
 #ifndef ESP8266
  while (!Serial); // for Leonardo/Micro/Zero
#endif
 
  Serial.begin(9600);
  
  pinMode(redLED, OUTPUT);
  pinMode(buzzerPin, OUTPUT);
  
  Wire.begin();
  lcdscreen.begin(16, 2);
  
  delay(1000); // wait for console opening
  Serial.print("SD CARD STARTUP.....");
  
  pinMode(10, OUTPUT);
  delay(2000);
  if (SD.begin(sdCardCS)) {
    Serial.println("SD CARD FAILED!");
    return;
  }
  Serial.println("SD CARD INITIALIZED!");
 
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2016, 7, 17, 12, 19, 0));
    
   
  
delay(1000);
}
}


void loop()
{
     DateTime now = rtc.now();
    
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    

    Serial.println();
  //  delay(1000);
  
  // Getting temperature reading from TMP36
  int reading = analogRead(tmp36Pin);
  float voltage = reading *5.0;
  voltage /= 1024.0;
  
  float tempC = (voltage - 0.5)*100;
  
  // print temperature reading to seriel
  //Serial.println(tempC);
  Serial.println("");
  Serial.print("Temperature C - ");
  Serial.print(    tempC    );
  
  // IF STATEMENT used to define when the heating will be coming on. eg. 21C or below
  if (tempC<21)
   {
     // Print on LCD
   lcdscreen.setCursor(0,1);
   lcdscreen.print(tempC);
   lcdscreen.print("C - HEAT ON");
  Serial.println("  -  HEATING ON    ");
}

// ELSE anything above 21C will not trigger the heating
else {
  Serial.println("  -  HEATING OFF    ");
  lcdscreen.setCursor(0,1);
  lcdscreen.print(tempC);
  lcdscreen.print("C -HEAT OFF");
  
}

 // Getting light readings from LDR
LDRValue = analogRead(LDR);
 Serial.println ("");
 Serial.print ("The Light Reading is  -  ");
 Serial.print (LDRValue);
 
 // IF STATEMENT USED to define when the lights will come on e.g anyhting below 900
 if (LDRValue <900)
  {
   Serial.println(" - LIGHTS ON ");
    lcdscreen.setCursor(0, 0);
    lcdscreen.print(LDRValue);
    lcdscreen.print(" - LIGHTS  ON");

 }
 // ELSE anything above the 900 reading will not trigger the lights to come on
 else {
   Serial.println(" - LIGHTS OFF ");
   lcdscreen.setCursor(0, 0);
    lcdscreen.print(LDRValue);
    lcdscreen.print(" - LIGHTS OFF");
 }
 

long duration, cm ;
  delay(1000);
  
  //Initializing the pin states
  pinMode(trigFrontDoorPing, OUTPUT);
  
  // FRONT DOOR PING
  //Sending PING signal, starting with LOW for a clean signal
  digitalWrite(trigFrontDoorPing, LOW);
  delayMicroseconds(2);
  digitalWrite(trigFrontDoorPing, HIGH);
  delayMicroseconds(5);
  digitalWrite(trigFrontDoorPing, LOW);
  
  pinMode(echoFrontDoorPing, INPUT);
  duration = pulseIn(echoFrontDoorPing, HIGH);
  
  // convert the time into a distance - Microseconds to centimeters
  cm = MsToCm(duration);
    Serial.println("");
    Serial.print("Front Door -  ");
    Serial.print(cm);
    Serial.print("cm  -  ");
    
  // IF STATEMENT used to define when alarm system will be active e.g anything detected over 50cm
  if(cm > 50)
  
  {
    Serial.print("Intrusion Detection System enabled");
    Serial.println("");
    digitalWrite(redLED, HIGH);
    delay(1000);
    digitalWrite(redLED, LOW);
    noTone(buzzerPin);
    
  // ELSE STATEMENT used if anything is detected before 50cm the buzzer will go off and the LED
 // will stay red constant  
  }
  else
  {
    Serial.print("Alarm is going off!!");
    Serial.println("");
    digitalWrite(redLED, HIGH);
    tone(buzzerPin, 400);
    delay(1000);
    tone(buzzerPin, 400);
    delay(1000);
  }

  File dFile = SD.open("datalog.txt", FILE_WRITE);

  // if available, write the file:
  if (dFile) {
    dFile.println("");
    dFile.println("Temperature is - ");
    dFile.print(tempC);
    dFile.print(",");
    dFile.print("The Light Reading is -");
    dFile.print(LDRValue);
    dFile.println("");
    dFile.close();
    // print to the serial port too:
    Serial.println(tempC);
    Serial.println(LDRValue);
    
    delay(1000);
  }
  // if the file isn't open, show error:
  else {
    Serial.println("error opening datalog.txt");
  }
}
 
// microseconds to centimeters conversion
long MsToCm( long microseconds) {
  return microseconds / 29 / 2;
}

the code above is the code that allows the sensor readings to write to the SD card but says at the start SD card failed?

The code below is where i have added the date and time to be added to the sd card and it says at the start SD card initialized but won't allow the data to read to the file.

 File dFile = SD.open("datalog.txt", FILE_WRITE);

  // if available, write the file:
  if (dFile) {
    dFile.println("");
    dFile.print(now.year(), DEC);
    dFile.print('/');
    dFile.print(now.month(), DEC);
    dFile.print('/');
    dFile.print(now.day(), DEC);
    dFile.print(" (");
    dFile.print(daysOfTheWeek[now.dayOfTheWeek()]);
    dFile.print(") ");
    dFile.print(now.hour(), DEC);
    dFile.print(':');
    dFile.print(now.minute(), DEC);
    dFile.print(':');
    dFile.print(now.second(), DEC);
    dFile.println("Temperature is - ");
    dFile.print(tempC);
    dFile.print(",");
    dFile.print("The Light Reading is -");
    dFile.print(LDRValue);
    dFile.println("");
    dFile.close();
    // print to the serial port too:
    Serial.println(tempC);
    Serial.println(LDRValue);
    
    delay(1000);
  }
  // if the file isn't open, show error:
  else {
    Serial.println("error opening datalog.txt");
  }
}
 
// microseconds to centimeters conversion
long MsToCm( long microseconds) {
  return microseconds / 29 / 2;
}

this is my result from the 2nd code when trying to read time on sd card aswel -

really am stuck and don't know what else to try. I have tried putting the date and time in a string to be converted to a csv instead but still will not work. I seem to think that it is something to do with the librarys and they won't work together?

Any help would be much appreciated.

Regards oldskoolbray!

These are my results from the first code when not reading the ds3231 time to the sd card -

SD CARD STARTUP.....SD CARD FAILED!
2016/7/18 (Monday) 13:21:24
Temperature C - 26.17 - HEATING OFF
The Light Reading is - 947 - LIGHTS OFF
Front Door - 3350cm - Intrusion Detection System enabled
26.17
947

and these are my results from 2nd code when trying to read date and time aswel -

SD CARD STARTUP.....SD CARD INITIALIZED!
2016/7/18 (Monday) 13:18:43
Temperature C - 27.15 - HEATING OFF
The Light Reading is - 975 - LIGHTS OFF
Front Door - 15cm - Alarm is going off!!
error opening datalog.txt

Are you certain you are not running out of SRAM? If you do not have 512 bytes of SRAM available, the SD open call will fail.

// add this function to your sketch
int freeRam() {
  extern int __heap_start,*__brkval;
  int v;
  return (int)&v - (__brkval == 0 ? (int)&__heap_start : (int) __brkval);  
}

// and call it like this just before attempting to open the file
Serial.print(F("SRAM left: "));
Serial.println(freeRam());

If you don't have enough, go through your sketch and use the F() macro with all your static strings like I did with "SRAM left".

i will try this and let you know . thanks for reply .

i did as you said . my results were..

SD CARD STARTUP.....SD CARD INITIALIZED!
2016/7/18 (Monday) 13:56:55

Temperature C - 25.68 - HEATING OFF

The Light Reading is - 973 - LIGHTS OFF

Front Door - 14cm - Alarm is going off!!
SRAM left: 345
error opening datalog.txt

it says that there is 345 SRAM left?

regards oldskoolbray

That isn't enough. That is why the file open isn't working. Use the F() macro with all your static strings to recover some of that SRAM.

Hello i have freed up some space but still it will not save to the sd card . my results were:

SD CARD STARTUP.....SD CARD INITIALIZED!

Temperature C - 25.68 - HEATING OFF

The Light Reading is - 993 - LIGHTS OFF

Front Door - 14cm - Alarm is going off!!
SRAM left: 723
error opening datalog.txt

regards oldskoolbray

the code above is the code that allows the sensor readings to write to the SD card but says at the start SD card failed?

delay(2000);
  if (SD.begin(sdCardCS)) {
    Serial.println("SD CARD FAILED!");
    return;
  }

SD.begin() returns true if initialization succeeds, false otherwise. You print the failure message when you are successful. Use the boolean not !.

delay(2000);
  if (!SD.begin(sdCardCS)) {
    Serial.println("SD CARD FAILED!");
    return;
  }

Can you post the complete code which does not write the RTC data.

hello thank you cattle dog all i needed was to provide the ! before SD.begin i cannot tell you how long i have been trying to complete the task. madness lol. thanks once again :wink:

regards oldskoolbray