#include <LiquidCrystal_I2C.h> // Biblioteca para LCD I2C
#include <RTClib.h> // Biblioteca para Relógio em Tempo Real
#include <Wire.h> // Biblioteca para comunicação I2C
#include <EEPROM.h>
#include "DHT.h"
#define LOG_OPTION 1 // Opção para ativar o registro
#define SERIAL_OPTION 1 // Opção de comunicação serial: 0 para desligado, 1 para ligado
#define UTC_OFFSET -3 // Ajuste de fuso horário para UTC-3
// Configurações do DHT22
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27,16,2); // Endereço de acesso: 0x3F ou 0x27
RTC_DS1307 RTC;
// Configurações da EEPROM
const int maxRecords = 100;
const int recordSize = 8; // Tamanho de cada registro em bytes
int startAddress = 0;
int endAddress = maxRecords * recordSize;
int currentAddress = 0;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
dht.begin();
Serial.begin(9600);
lcd.init(); // Inicialização do LCD
lcd.backlight(); // Ligando o backlight do LCD
RTC.begin(); // Inicialização do Relógio em Tempo Real
RTC.adjust(DateTime(F(__DATE__), F(__TIME__))); // Ajustar a data e hora uma vez inicialmente, depois comentar
EEPROM.begin();
}
void loop() {
DateTime now = RTC.now();
// Calculando o deslocamento do fuso horário
int offsetSeconds = UTC_OFFSET * 3600; // Convertendo horas para segundos
now = now.unixtime() + offsetSeconds; // Adicionando o deslocamento ao tempo atual
// Convertendo o novo tempo para DateTime
DateTime adjustedTime = DateTime(now);
if (LOG_OPTION) get_log();
if (adjustedTime.second() == 0) {
// Pisca o LED para indicar a gravação de dados
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
// Ler os valores de temperatura e umidade
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Converter valores para int para armazenamento
int tempInt = (int)(temperature * 100);
int humiInt = (int)(humidity * 100);
// Obter o timestamp Unix
unsigned long timestamp = adjustedTime.unixtime();
// Escrever dados na EEPROM
EEPROM.put(currentAddress, timestamp);
EEPROM.put(currentAddress + 4, tempInt);
EEPROM.put(currentAddress + 6, humiInt);
// Atualiza o endereço para o próximo registro
getNextAddress();
}
// Saída serial
if (SERIAL_OPTION) {
// Converter timestamp para formato legível
char buffer[20];
sprintf(buffer, "%02d-%02d-%04d %02d:%02d:%02d",
adjustedTime.day(), adjustedTime.month(), adjustedTime.year(),
adjustedTime.hour(), adjustedTime.minute(), adjustedTime.second());
Serial.print("Dados registrados em: ");
Serial.println(buffer);
// Imprimir temperatura e umidade
Serial.print("Temperatura: ");
Serial.print(dht.readTemperature());
Serial.println(" °C");
Serial.print("Umidade: ");
Serial.print(dht.readHumidity());
Serial.println(" %");
}
// Saída no LCD
lcd.setCursor(0,0);
lcd.print("DATA: ");
lcd.print(adjustedTime.day() < 10 ? "0" : ""); // Adiciona zero à esquerda se dia for menor que 10
lcd.print(adjustedTime.day());
lcd.print("-");
lcd.print(adjustedTime.month() < 10 ? "0" : ""); // Adiciona zero à esquerda se mês for menor que 10
lcd.print(adjustedTime.month());
lcd.print("-");
lcd.print(adjustedTime.year());
lcd.setCursor(0,1);
lcd.print("HORA: ");
lcd.print(adjustedTime.hour() < 10 ? "0" : ""); // Adiciona zero à esquerda se hora for menor que 10
lcd.print(adjustedTime.hour());
lcd.print(":");
lcd.print(adjustedTime.minute() < 10 ? "0" : ""); // Adiciona zero à esquerda se minuto for menor que 10
lcd.print(adjustedTime.minute());
lcd.print(":");
lcd.print(adjustedTime.second() < 10 ? "0" : ""); // Adiciona zero à esquerda se segundo for menor que 10
lcd.print(adjustedTime.second());
delay(1000);
}
void getNextAddress() {
currentAddress += recordSize;
if (currentAddress >= endAddress) {
currentAddress = 0; // Volta para o começo se atingir o limite
}
}
void get_log() {
Serial.println("Dados armazenados na EEPROM:");
Serial.println("Timestamp\tTemperatura\tUmidade");
for (int address = startAddress; address < endAddress; address += recordSize) {
unsigned long timeStamp;
int tempInt, humiInt;
// Ler dados da EEPROM
EEPROM.get(address, timeStamp);
EEPROM.get(address + 4, tempInt);
EEPROM.get(address + 6, humiInt);
// Converter valores
float temperature = tempInt / 100.0;
float humidity = humiInt / 100.0;
// Verificar se os dados são válidos antes de imprimir
if (timeStamp != 0xFFFFFFFF) { // 0xFFFFFFFF é o valor padrão de uma EEPROM não inicializada
// Converter timestamp para formato legível
DateTime timestampDT = DateTime(timeStamp);
char buffer[20];
sprintf(buffer, "%02d-%02d-%04d %02d:%02d:%02d",
timestampDT.day(), timestampDT.month(), timestampDT.year(),
timestampDT.hour(), timestampDT.minute(), timestampDT.second());
Serial.print(buffer);
Serial.print("\t");
Serial.print(temperature);
Serial.print(" C\t\t");
Serial.print(humidity);
Serial.println(" %");
}
}
}