please help, I created a datalogger project from a flowmeter with an RS485 output. Using the rs485 to TTL (max485) module.
My problem is that the data is written on the SDcard only once, it doesn't continue. It looks like the serial software is in conflict or doesn't work
this is my code
#include <ModbusMaster.h>
#include <SoftwareSerial.h>
#include <RTClib.h>
#include <SPI.h>
#include <SD.h>
/*
#define MAX485_RE_NEG 6
#define MAX485_DE 7
#define SSERIAL_RX_PIN 8
#define SSERIAL_TX_PIN 9
*/
RTC_DS1307 rtc;
//const int chipSelect = 10;
ModbusMaster node;
SoftwareSerial RS485Serial(8, 9);
File dataFile;
void preTransmission() {
digitalWrite(6, 1);
digitalWrite(7, 1);
}
void postTransmission() {
digitalWrite(6, 0);
digitalWrite(7, 0);
}
void setup() {
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
digitalWrite(6, 1);
digitalWrite(7, 1);
Serial.begin(9600);
RS485Serial.begin(9600);
node.begin(8, RS485Serial);
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
SD.begin(10);
if (! rtc.begin()) {
Serial.flush();
while (1) delay(10);
}
if (! rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
readSensor();
delay(10000); //read every 10 second
}
void writeToSD(DateTime vData,int vVol1, int vVol2, int Rate) {
File dataFile = SD.open("datalog.csv",FILE_WRITE);
if (dataFile) {
dataFile.println(print_data(vData,vVol1,vVol2,Rate));
}
else
{
Serial.println("error opening datalog.csv");
}
dataFile.close();
}
String print_data(DateTime timestamp, int vVolTot, int vVolDec, int Rate) {
char message[120];
int Year = timestamp.year();
int Month = timestamp.month();
int Day = timestamp.day();
int Hour = timestamp.twelveHour();
int Minute = timestamp.minute();
int Second= timestamp.second();
float VolDec = vVolTot+(float)vVolDec/1000;
char sVol[8];
dtostrf(VolDec, String(VolDec).length(), 3, sVol);
sprintf(message, "%02d-%02d-%d,%02d:%02d:%02d,%s,%d", Day,Month,Year,Hour,Minute,Second,sVol,Rate);
return message;
}
void readSensor() {
DateTime now = rtc.now();
uint8_t result = node.readHoldingRegisters(99,13);
if (result == node.ku8MBSuccess) {
writeToSD(now,node.getResponseBuffer(8),node.getResponseBuffer(10),node.getResponseBuffer(1));
Serial.println(print_data(now,node.getResponseBuffer(8),node.getResponseBuffer(10),node.getResponseBuffer(1)));
}
else {
Serial.println("Waiting");
}
}