The current code is used to gather the state of 12 infrared beams and log them to an SD card using the real time clock to mark the time. The code uses a switch to turn the device on and off and an LED to indicate if data is being written to the SD. When we later looked at the data on the SD card the refresh rate was slowly decreasing and we ended up with only 10 logs a second after a few hours. Why is this happening and how is it fixed?
#include <SD.h> //For talking to SD Card
#include <Wire.h> //For RTC
#include "RTClib.h" //For RTC
//Define pins
//SD card is on standard SPI pins
//RTC is on Standard I2C Pins
const int CS_PIN = 53;
//Default rate of 25ms
int refresh_rate = 25;
//Define RTC object
RTC_DS1307 RTC;
//Initialize variables
String year, month, day, hour, minute, second, time, date;
#define SENSOR1 22
#define SENSOR2 23
#define SENSOR3 24
#define SENSOR4 25
#define SENSOR5 26
#define SENSOR6 27
#define SENSOR7 32
#define SENSOR8 33
#define SENSOR9 34
#define SENSOR10 35
#define SENSOR11 36
#define SENSOR12 37
#define LEDPIN 6
#define SWITCH 10
// variables will change:
int sensorState1 = 0, lastState1 = 0;
int sensorState2 = 0, lastState2 = 0;
int sensorState3 = 0, lastState3 = 0;
int sensorState4 = 0, lastState4 = 0;
int sensorState5 = 0, lastState5 = 0;
int sensorState6 = 0, lastState6 = 0;
int sensorState7 = 0, lastState7 = 0;
int sensorState8 = 0, lastState8 = 0;
int sensorState9 = 0, lastState9 = 0;
int sensorState10 = 0, lastState10 = 0;
int sensorState11 = 0, lastState11 = 0;
int sensorState12 = 0, lastState12 = 0;
//Variable for reading the Switch Status
int SWITCHSTATE ;
//define integers for sensor change
int SensorChange1 = 0;
int SensorChange2 = 0;
int SensorChange3 = 0;
int SensorChange4 = 0;
int SensorChange5 = 0;
int SensorChange6 = 0;
int SensorChange7 = 0;
int SensorChange8 = 0;
int SensorChange9 = 0;
int SensorChange10 = 0;
int SensorChange11 = 0;
int SensorChange12 = 0;
void setup()
{
// initialize the sensor pin 24 as an input:
pinMode(SENSOR1, INPUT);
digitalWrite(SENSOR1, HIGH); // turn on the pullup // initialize the sensor pin 25 as an input:
pinMode(SENSOR2, INPUT);
digitalWrite(SENSOR2, HIGH); // initialize the sensor pin 26 as an input:
pinMode(SENSOR3, INPUT);
digitalWrite(SENSOR3, HIGH); // initialize the sensor pin 27 as an input:
pinMode(SENSOR4, INPUT);
digitalWrite(SENSOR4, HIGH); // initialize the sensor pin 28 as an input:
pinMode(SENSOR5, INPUT);
digitalWrite(SENSOR5, HIGH); // initialize the sensor pin 29 as an input:
pinMode(SENSOR6, INPUT);
digitalWrite(SENSOR6, HIGH); // initialize the sensor pin 30 as an input:
pinMode(SENSOR7, INPUT);
digitalWrite(SENSOR7, HIGH); // initialize the sensor pin 31 as an input:
pinMode(SENSOR8, INPUT);
digitalWrite(SENSOR8, HIGH); // initialize the sensor pin 32 as an input:
pinMode(SENSOR9, INPUT);
digitalWrite(SENSOR9, HIGH); // initialize the sensor pin 33 as an input:
pinMode(SENSOR10, INPUT);
digitalWrite(SENSOR10, HIGH); // initialize the sensor pin 34 as an input:
pinMode(SENSOR11, INPUT);
digitalWrite(SENSOR11, HIGH); // initialize the sensor pin 35 as an input:
pinMode(SENSOR12, INPUT);
digitalWrite(SENSOR12, HIGH); // initialize the LED pin as an output:
// initialize the LED pin as an output:
pinMode (LEDPIN, OUTPUT);
// initialize the SWITCH pin as an output:
pinMode (SWITCH, INPUT);
// setpin 19 as high (5V) and 18 as low
pinMode(19, OUTPUT);
pinMode(18, OUTPUT);
digitalWrite(19, HIGH);
digitalWrite(18, LOW);
Serial.begin(9600);
Serial.println(F("Initializing Card"));
//CS pin, and pwr/gnd pins are outputs
pinMode(CS_PIN, OUTPUT);
//Initiate the I2C bus and the RTC library
Wire.begin();
RTC.begin();
//If RTC is not running, set it to the computer's compile time
if (! RTC.isrunning())
{
Serial.println(F("RTC is NOT running!"));
RTC.adjust(DateTime(DATE, TIME));
}
//Initialize SD card
if (!SD.begin(CS_PIN))
{
Serial.println(F("Card Failure"));
return;
}
Serial.println(F("Card Ready"));
//Read the configuration information (speed.txt)
File commandFile = SD.open("speed.txt");
if (commandFile)
{
Serial.println(F("Reading Command File"));
while(commandFile.available())
{
refresh_rate = commandFile.parseInt();
}
Serial.print(F("Refresh Rate = "));
Serial.print(refresh_rate);
Serial.println(F("ms"));
commandFile.close();
}
else
{
Serial.println(F("Could not read command file."));
return;
}
}
void loop()
{
SWITCHSTATE = digitalRead(SWITCH); //read input value
if (SWITCHSTATE == LOW)
{
digitalWrite(LEDPIN, LOW);
}
else
{
digitalWrite(LEDPIN, HIGH);
// read the state of the sensor value:
sensorState1 = digitalRead(SENSOR1);
sensorState2 = digitalRead(SENSOR2);
sensorState3 = digitalRead(SENSOR3);
sensorState4 = digitalRead(SENSOR4);
sensorState5 = digitalRead(SENSOR5);
sensorState6 = digitalRead(SENSOR6);
sensorState7 = digitalRead(SENSOR7);
sensorState8 = digitalRead(SENSOR8);
sensorState9 = digitalRead(SENSOR9);
sensorState10 = digitalRead(SENSOR10);
sensorState11 = digitalRead(SENSOR11);
sensorState12 = digitalRead(SENSOR12);
//Get the current date and time info and store in strings
DateTime datetime = RTC.now();
year = String(datetime.year(), DEC);
month = String(datetime.month(), DEC);
day = String(datetime.day(), DEC);
hour = String(datetime.hour(), DEC);
minute = String(datetime.minute(), DEC);
second = String(datetime.second(), DEC);
//Concatenate the strings into date and time
date = year + "/" + month + "/" + day;
time = hour + ":" + minute + ":" + second;
if (sensorState1 == HIGH)
{
SensorChange1 = 1;
}
else
{
SensorChange1 = 0;
}
if (sensorState2 == HIGH)
{
SensorChange2 = 1;
}
else
{
SensorChange2 = 0;
}
if (sensorState3 == HIGH)
{
SensorChange3 = 1;
}
else
{
SensorChange3 = 0;
}
if (sensorState4 == HIGH)
{
SensorChange4 = 1;
}
else
{
SensorChange4 = 0;
}
if (sensorState5 == HIGH)
{
SensorChange5 = 1;
}
else
{
SensorChange5 = 0;
}
if (sensorState6 == HIGH)
{
SensorChange6 = 1;
}
else
{
SensorChange6 = 0;
}
if (sensorState7 == HIGH)
{
SensorChange7 = 1;
}
else
{
SensorChange7 = 0;
}
if (sensorState8 == HIGH)
{
SensorChange8 = 1;
}
else
{
SensorChange8 = 0;
}
if (sensorState9 == HIGH)
{
SensorChange9 = 1;
}
else
{
SensorChange9 = 0;
}
if (sensorState10 == HIGH)
{
SensorChange10 = 1;
}
else
{
SensorChange10 = 0;
}
if (sensorState11 == HIGH)
{
SensorChange11 = 1;
}
else
{
SensorChange11 = 0;
}
if (sensorState12 == HIGH)
{
SensorChange12 = 1;
}
else
{
SensorChange12 = 0;
}
File dataFile ;
dataFile = SD.open("log1.csv", FILE_WRITE);
if (dataFile)
{
dataFile.print(date);
dataFile.print(F(","));
dataFile.print(time);
dataFile.print(F(","));
dataFile.print(SensorChange1);
dataFile.print(F(","));
dataFile.print(SensorChange2);
dataFile.print(F(","));
dataFile.print(SensorChange3);
dataFile.print(F(","));
dataFile.print(SensorChange4);
dataFile.print(F(","));
dataFile.print(SensorChange5);
dataFile.print(F(","));
dataFile.print(SensorChange6);
dataFile.print(F(","));
dataFile.print(SensorChange7);
dataFile.print(F(","));
dataFile.print(SensorChange8);
dataFile.print(F(","));
dataFile.print(SensorChange9);
dataFile.print(F(","));
dataFile.print(SensorChange10);
dataFile.print(F(","));
dataFile.print(SensorChange11);
dataFile.print(F(","));
dataFile.print(SensorChange12);
dataFile.println( );
dataFile.close(); //Data isn't actually written until we close the connection!
//Print same thing to the screen for debugging
Serial.println();
Serial.print(date);
Serial.print(F(","));
Serial.print(time);
Serial.print(F(","));
Serial.print(SensorChange1);
Serial.print(F(","));
Serial.print(SensorChange2);
Serial.print(F(","));
Serial.print(SensorChange3);
Serial.print(F(","));
Serial.print(SensorChange4);
Serial.print(F(","));
Serial.print(SensorChange5);
Serial.print(F(","));
Serial.print(SensorChange6);
Serial.print(F(","));
Serial.print(SensorChange7);
Serial.print(F(","));
Serial.print(SensorChange8);
Serial.print(F(","));
Serial.print(SensorChange9);
Serial.print(F(","));
Serial.print(SensorChange10);
Serial.print(F(","));
Serial.print(SensorChange11);
Serial.print(F(","));
Serial.print(SensorChange12);
}
else
{
Serial.println(F("Couldn't open log file"));
}
lastState1 = sensorState1;
lastState2 = sensorState2;
lastState3 = sensorState3;
lastState4 = sensorState4;
lastState5 = sensorState5;
lastState6 = sensorState6;
lastState7 = sensorState7;
lastState8 = sensorState8;
lastState9 = sensorState9;
lastState10 = sensorState10;
lastState11 = sensorState11;
lastState12 = sensorState12;
delay(refresh_rate);
}
}

