#include <OneWire.h>
#include <DallasTemperature.h>
#include "RTClib.h"
#include <SPI.h>
#include <SD.h>
// ==== CONFIGURAÇÕES DE PINOS ====
#define ONE_WIRE_BUS 2
#define RELAY_PIN 5
#define VOLTAGE_PIN A0
#define SD_CS 10 // Chip Select do módulo SD
// ==== DIVISOR DE TENSÃO ====
const float R1 = 10000.0;
const float R2 = 10000.0;
// ==== LIMITES DE TROCA DE FONTE ====
const float LIMITE_LIGAR_SOLAR = 3.0;
const float LIMITE_DESLIGAR_SOLAR = 2.8;
// ==== OBJETOS ====
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
RTC_DS3231 rtc;
File arquivo;
bool usandoSolar = false;
void setup() {
Serial.begin(9600);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, HIGH); // Relé desligado (Active LOW)
sensors.begin();
// --- Inicializa RTC ---
if (!rtc.begin()) {
Serial.println("Erro ao iniciar o RTC! Verifique conexões.");
while (1);
}
// Ajusta o RTC para o horário de compilação
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// --- Inicializa o SD ---
Serial.println("Inicializando cartão SD...");
if (!SD.begin(SD_CS)) {
Serial.println("Falha ao inicializar o SD!");
} else {
Serial.println("Cartão SD inicializado com sucesso.");
}
// --- Cria o arquivo CSV se ainda não existir ---
if (!SD.exists("dados.csv")) {
arquivo = SD.open("dados.csv", FILE_WRITE);
if (arquivo) {
arquivo.println("DataHora,Temperatura_C,Tensao_V,FonteEnergia");
arquivo.close();
Serial.println("Arquivo CSV criado: dados.csv");
}
}
Serial.println("Sistema SORA inicializado (RTC + SD + Sensor + Relé).");
}
void loop() {
String fonteEnergia;
// --- Leitura da tensão ---
int leitura = analogRead(VOLTAGE_PIN);
float tensaoA0 = (leitura * 5.0) / 1023.0;
float tensaoReal = tensaoA0 * ((R1 + R2) / R2);
// --- Controle da fonte ---
if (!usandoSolar && tensaoReal >= LIMITE_LIGAR_SOLAR) {
digitalWrite(RELAY_PIN, LOW); // Liga relé → energia solar
usandoSolar = true;
fonteEnergia = "Placa Solar";
}
else if (usandoSolar && tensaoReal < LIMITE_DESLIGAR_SOLAR) {
digitalWrite(RELAY_PIN, HIGH); // Desliga relé → energia USB
usandoSolar = false;
fonteEnergia = "Notebook (USB)";
} else {
fonteEnergia = usandoSolar ? "Placa Solar" : "Notebook (USB)";
}
// --- Leitura da temperatura ---
sensors.requestTemperatures();
float temperatura = sensors.getTempCByIndex(0);
// --- Data e hora ---
DateTime agora = rtc.now();
// --- Monta a linha CSV ---
String linhaCSV = String(agora.timestamp()) + "," +
String(temperatura, 2) + "," +
String(tensaoReal, 2) + "," +
fonteEnergia;
// --- Exibe no Serial Monitor ---
Serial.println(linhaCSV);
// --- Grava no cartão SD ---
arquivo = SD.open("dados.csv", FILE_WRITE);
if (arquivo) {
arquivo.println(linhaCSV);
arquivo.close();
} else {
Serial.println("Erro ao gravar no SD!");
}
delay(3000);
}