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

#define DHTPIN 15        // Pino do sensor DHT22
#define DHTTYPE DHT22   // Tipo do sensor DHT22
#define BUTTON_PIN 3    // Pino do botão
#define SD_CS 5        // Pino CS do SD

DHT dht(DHTPIN, DHTTYPE); // Instância do sensor DHT
RTC_DS3231 rtc;           // Instância do RTC
File myFile;              // Objeto de arquivo

unsigned long previousMillis = 0; // Armazena o último tempo de leitura
int interval = 60000;              // Intervalo padrão de 1 minuto (60000 ms)
bool monitoring = false;           // Flag para verificar se está monitorando
bool buttonPressed = false;        // Flag para verificar se o botão foi pressionado

void setup() {
  Serial.begin(9600);
  
  // Inicializa o sensor DHT
  dht.begin();
  
  // Inicializa o RTC
  if (!rtc.begin()) {
    Serial.println("RTC não encontrado!");
    while (1);
  }

  // Inicializa o SD
  if (!SD.begin(SD_CS)) {
    Serial.println("Erro ao inicializar o SD!");
    while (1);
  }

  // Configura o botão
  pinMode(BUTTON_PIN, INPUT_PULLUP);

  // Inicia o monitoramento
  startMonitoring();
}

void loop() {
  // Verifica se o botão foi pressionado
  if (digitalRead(BUTTON_PIN) == LOW) {
    buttonPressed = true;
  }

  // Se estiver monitorando, grava os dados
  if (monitoring) {
    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= interval) {
      previousMillis = currentMillis;
      recordData();
    }
  }
}

void startMonitoring() {
  monitoring = true;
  Serial.println("Iniciando Monitoramento...");
  
  myFile = SD.open("monitoramento.txt", FILE_WRITE);
  if (myFile) {
    myFile.println("Iniciando Monitoramento");
    myFile.flush();
  }
}

void recordData() {
  DateTime now = rtc.now();
  float temperature = dht.readTemperature();

  // Verifica se a leitura da temperatura foi bem-sucedida
  if (isnan(temperature)) {
    Serial.println("Falha na leitura da temperatura!");
    return;
  }

  // Formata a string de dados
  String data = "Tempo: " + String(now.day()) + "/" + String(now.month()) + "/" + String(now.year()) + 
                "\tTemperatura: " + String(temperature) + "°C";
  
  // Escreve no arquivo
  if (myFile) {
    myFile.println(data);
    myFile.flush();
    Serial.println(data);
  }

  // Verifica se o botão foi pressionado para finalizar a gravação
  if (buttonPressed) {
    endMonitoring();
  }
}

void endMonitoring() {
  monitoring = false;
  buttonPressed = false; // Reinicia a flag do botão

  // Escreve no arquivo de que a gravação foi finalizada
  if (myFile) {
    myFile.println("Monitoramento Finalizado");
    myFile.close(); // Fecha o arquivo
    Serial.println("Monitoramento Finalizado");
  }
  
  // Imprime no Serial o conteúdo do arquivo
  printFileContents();
}

void printFileContents() {
  // Abre o arquivo para leitura
  myFile = SD.open("monitoramento.txt");
  if (myFile) {
    Serial.println("Conteúdo do arquivo:");
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    myFile.close(); // Fecha o arquivo
  } else {
    Serial.println("Erro ao abrir o arquivo para leitura.");
  }
}
GND5VSDASCLSQWRTCDS1307+