#include <Wire.h>
#include <RTClib.h>
#include <SPI.h>
#include <SD.h>

#define TEMPERATURE_PIN A0
#define LOG_INTERVAL 900
#define CHIP_SELECT 10

RTC_DS1307 rtc;
File logFile;
unsigned long lastLogTime;

float temperatureValues[96]; // Array to store temperature values for the last 24 hours
int numReadings = 0;         // Number of temperature readings in the array

void setup() {
  Serial.begin(9600);
  pinMode(TEMPERATURE_PIN, INPUT);
  if (!rtc.begin()) {
    Serial.println("RTC_DS1307 failed to initialize");
  }
  if (!SD.begin(CHIP_SELECT)) {
    Serial.println("MicroSD card failed to initialize");
  }
  lastLogTime = 0;
}

void loop() {
  DateTime now = rtc.now();
  float temperature = getTemperature();
  Serial.print("Temperature: ");
  Serial.print(temperature);
  Serial.print(" C, Time: ");
  Serial.print(now.year());
  Serial.print("/");
  Serial.print(now.month());
  Serial.print("/");
  Serial.print(now.day());
  Serial.print(" ");
  Serial.print(now.hour());
  Serial.print(":");
  Serial.print(now.minute());
  Serial.print(":");
  Serial.println(now.second());
  
  unsigned long currentTime = now.unixtime();
  if (currentTime - lastLogTime >= LOG_INTERVAL) {
    lastLogTime = currentTime;
    logTemperature(temperature, now);
    temperatureValues[numReadings] = temperature; // Store temperature value in the array
    numReadings++;
    if (numReadings == 96) { // If the array is full (24 hours have passed), start overwriting the oldest values
      numReadings = 0;
    }
  }
  delay(1000);
}

float getTemperature() {
  int reading = analogRead(TEMPERATURE_PIN);
  float voltage = reading * 5.0 / 1023.0;
  float resistance = (5.0 - voltage) * 10000.0 / voltage;
  float temperature = 1.0 / (log(resistance / 10000.0) / 3975.0 + 1.0 / 298.15) - 273.15;
  return temperature;
}

void logTemperature(float temperature, DateTime now) {
  String filename = String(now.year()) + String(now.month()) + String(now.day()) + ".txt";
  logFile = SD.open(filename, FILE_WRITE);
  if (logFile) {
    logFile.print(now.year());
    logFile.print("/");
    logFile.print(now.month());
    logFile.print("/");
    logFile.print(now.day());
    logFile.print(" ");
    logFile.print(now.hour());
    logFile.print(":");
    logFile.print(now.minute());
    logFile.print(":");
    logFile.print(now.second());
    logFile.print(",");
    logFile.println(temperature);
    logFile.close();
    Serial.println("Temperature logged to microSD card");
  } else {
    Serial.println("Error opening log file");
  }
}

uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
ntc1:GND
ntc1:VCC
ntc1:OUT
sd1:CD
sd1:DO
sd1:GND
sd1:SCK
sd1:VCC
sd1:DI
sd1:CS
GND5VSDASCLSQWRTCDS1307+
rtc1:GND
rtc1:5V
rtc1:SDA
rtc1:SCL
rtc1:SQW