#include <Wire.h> // must be included here so that Arduino library object file references work
#include <RtcDS3231.h>
RtcDS3231<TwoWire> Rtc(Wire);
RtcDateTime dt, now, from, to;
//#define SPI_SPEED SPI_HALF_SPEED
#define SPI_SPEED SD_SCK_MHZ(4)
#define CS_PIN SS
#include <SdFat.h>
SdFat sd;
File file;
float sensor1_avg;
float sensor2_avg;
float sensor3_avg;
float sensor4_avg;
unsigned long counter_avg;
unsigned long calc_ms_avg;
bool average_sms;
bool sdmodul_err;
bool rtclock_err;
bool datalog_err;
void setup(void) {
Serial.begin(9600);
while (!Serial)
;
;
sdmodul_err = !sd.begin(CS_PIN, SPI_SPEED);
;
Rtc.Begin();
// RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
// Rtc.SetDateTime(compiled + 1 * 8 * 60 * 60);
// Rtc.SetDateTime(RtcDateTime(2023, 1, 3, 7, 53, 00));
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
}
void loop(void) {
digitalWrite(8, bitRead(millis(), 8));
now = Rtc.GetDateTime();
rtclock_err = !Rtc.IsDateTimeValid();
average();
digitalWrite(7, average_sms);
}
int simulation(int *days) {
static int DAYS = 1;
static int simulate = 0;
unsigned long timer = millis();
static unsigned long buttonpress = timer;
bool pin2 = !digitalRead(2);
bool pin3 = !digitalRead(3);
if (!simulate & !pin2 & !pin3) buttonpress = timer;
if (timer - buttonpress > 10000) {
if (!simulate) {
if (pin2)DAYS = 31;
else DAYS = 1;
simulate = 1;
} else simulate = 2;
if (rtclock_err )simulate = 1;
}
if (timer - buttonpress > 99999) simulate = 0;
if (simulate) *days = DAYS;
return simulate;
}
void average() {
int days = 1;
int simulate = simulation(&days);
if (simulate == 1) goto m1;
if (simulate == 2) goto m2;
if (rtclock_err | now.Hour() != 12) {
m1:
average_sms = false;
return;
}
if (now.Day() == 1)days = 31;
m2:
if (sdmodul_err | datalog_err)return;
if (average_sms) return;
else average_sms = true;
counter_avg = 0;
sensor1_avg = 0.0f;
sensor2_avg = 0.0f;
sensor3_avg = 0.0f;
sensor4_avg = 0.0f;
static char date[11];
static char FILE[15];
static char data[48];
static char col1[9], col2[9], col3[9], col4[9];
from = now;
calc_ms_avg = millis();
for (int i = 1; i <= days; i++) {
int j = from.Day();
from = from - 86400;
int k = from.Day();
if (i == 1) to = from;
if (k > j) i += abs(31 - k);
snprintf(date, 11, "%04u-%02u-%02u", from.Year(), from.Month(), from.Day());
snprintf(FILE, 15, "%s.txt", date);
file = sd.open(FILE, O_READ);
if (file) {
file.seek(47);
while (file.available()) {
memset(data, 0, sizeof(data));
file.readBytes(data, 47);
if (data[ 2] != ':')continue;
if (data[ 5] != ':')continue;
if (data[ 8] != ',')continue;
if (data[17] != ',')continue;
if (data[26] != ',')continue;
if (data[35] != ',')continue;
if (data[44] != ',')continue;
counter_avg ++;
memcpy(col1, data + 9, 8);
memcpy(col2, data + 18, 8);
memcpy(col3, data + 27, 8);
memcpy(col4, data + 36, 8);
sensor1_avg += atof(col1);
sensor2_avg += atof(col2);
sensor3_avg += atof(col3);
sensor4_avg += atof(col4);
}
file.close();
}
}
calc_ms_avg = millis() - calc_ms_avg;
if (counter_avg) {
sensor1_avg /= counter_avg;
sensor2_avg /= counter_avg;
sensor3_avg /= counter_avg;
sensor4_avg /= counter_avg;
}
Serial.println(F("averages"));
Serial.println(sensor1_avg);
Serial.println(sensor2_avg);
Serial.println(sensor3_avg);
Serial.println(sensor4_avg);
Serial.print(counter_avg);
Serial.println(F(" counts"));
Serial.print(calc_ms_avg);
Serial.println(F(" ms"));
Serial.println();
}