#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.");
}
}