I have created a display based datalogger which will take logging interval from user in INT and then log the data according to the logging interval in the sd card.
There are 2 files on sd card.
- Log file(in which data is going to get logged)
- Settings file(it stored various settings ex. high range, low range, log time, etc)
In my code, settings file is successfully read and written and everything works perfect.
The problem lies in the logging code, it creates the blank file but doesnt write anything in it. My logic is :
- Open settings file.
- Read the log time value from it.
- Convert INT logtime to UNSIGNED LONG interval. Typecasting.
- Compare the last time and millis with interval and write the data in file.
Kindly guide me.
Code :
unsigned long lastLogWriteTimeMs = 0 ;
int logtime = 0;
void setup()
{
Wire.begin();//needed in code
RTC.begin();//needed in code
lcd.begin(16, 2);
initializeSD();
}
void loop()
{
btn_push = ReadKeypad();
MainMenuBtn();
if(btn_push == 'S')//enter selected menu
{
WaitBtnRelease();
switch (mainMenuPage)
{
case 1:
MenuA();//sd card logging in this loop
break;
case 2:
MenuB();
break;
case 3:
MenuC();
break;
case 4:
MenuD();
break;
case 5:
MenuE();
break;
case 6:
MenuF();
break;
case 7:
MenuG();
break;
case 8:
MenuH();//log time selection in this loop.
break;
}
MainMenuDisplay();
WaitBtnRelease();
}
delay(10);
}
void MenuA()
{
while(ReadKeypad()!= 'L')
{
//Insert Task for Menu A here
String temperature;
String dateEntry;
pinMode(relaypin, OUTPUT);
pinMode(compressorPin, OUTPUT);
temperature = String(temp,1);
entryId = String(id);
dateEntry = DateLogEntry();
String entry = dateEntry+":00; "+temperature+"; ";
lcd.setCursor(0, 0);
lcd.print(dateEntry);
livereading();
relay(); //normal relay on/off
compress(); //compressor settings
readSDSettings();
unsigned long interval = (unsigned long)logtime;
interval = interval*60000;
if ( millis() - lastLogWriteTimeMs > interval )
{
writeEntryToFile(entry);// Write to data logger here
lastLogWriteTimeMs = millis() ;
}
}
}
void MenuH()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Set Log Time");
readSDSettings();
logtimenew = logtime;
while(ReadKeypad()!= 'L')
{
//
WaitBtnRelease();
if(keypad_value < 200 && keypad_value > 100)//Up
{
logtimenew++;
}
if(keypad_value < 400 && keypad_value > 200)//Down
{
logtimenew--;
}
delay(50);
lcd.setCursor(0,1);
lcd.print(logtimenew);
lcd.print(" ");
if(keypad_value < 800 & keypad_value > 600)//Select/Enter
{
logtime = logtimenew;
writeSDSettings();
lcd.setCursor(0,1);
lcd.print("Logtime Set");
delay(1000);
}
}
}
int openFileToWrite(char filename[])
{
myFile = SD.open(filename, FILE_WRITE);
}
int writeToFile(String text)
{
if (myFile)
{
myFile.println(text);
return 1;
} else
{
return 0;
}
}
void closeFile()
{
if (myFile)
{
myFile.close();
}
}
void writeEntryToFile(String entry)
{
openFileToWrite("log.txt");
writeToFile(entry);
closeFile();
}
This code was working previously when i state 60000( for 1 min log time) instead of interval in if statement.