#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <EEPROM.h>
#include "DHT.h"
#include <Wire.h>
#define LOG_OPTION 1 // Ativar a leitura do log
#define SERIAL_OPTION 1 // Ativar comunicação serial
#define UTC_OFFSET -3 // Ajuste de fuso horário para UTC-3
// Configurações do DHT11
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
RTC_DS1307 RTC;
// Define a logo "VS"
byte vsLogo[8] = {
0b00000,
0b01110,
0b10001,
0b10001,
0b01010,
0b00100,
0b01010,
0b00000
};
// Define uma taça com base
byte cup[8] = {
0b00110,
0b01111,
0b10001,
0b10001,
0b01110,
0b00100,
0b11111, // Base do copo
0b00000
};
int cupPosition = 0; // Posição inicial da taça
bool movingRight = true; // Direção do movimento
// Configurações da EEPROM
const int maxRecords = 100; // Máximo de registros
const int recordSize = 8; // Tamanho de cada registro em bytes
int startAddress = 0; // Endereço inicial
int endAddress = maxRecords * recordSize; // Endereço final
int currentAddress = 0; // Endereço atual para escrita
// Pinos dos LEDs e do Buzzer
int ledGreen = 13; // LED verde
int ledYellow = 9; // LED amarelo
int ledRed = 8; // LED vermelho
int buzzer = 7; // Buzzer
float intensidadeLuz; // Variável para intensidade da luz
int ledGreen2 = 4; // LED verde2
int ledYellow2 = 11; // LED amarelo2
int ledRed2 = 10; // LED vermelho2
int ledRed3 = 3;
int ledYellow3 = 5;
int ledGreen3 = 6;
// Controle slideshow
unsigned long currentMillis;
unsigned long lastSlideshowUpdate = 0;
const unsigned long slideshowInterval = 5000;
int displayMode = 0; // 0: Data/Hora, 1: Umidade, 2: Temperatura, 3: Luminosidade
String alertMessage;
unsigned long millisAnterior = 0;
int lastLoggedMinute = -1;
unsigned long previousMillis = 0; // Tempo anterior
const long updateInterval = 1000; // Intervalo de atualização
// Controle do buzzer
unsigned long buzzerMillis = 100; // Tempo do buzzer
bool buzzerState = false; // Estado do buzzer
const long buzzerOnDuration = 100; // Tempo ligado
const long buzzerOffDuration = 150; // Tempo desligado
// Constantes de temperatura e umidade
const float TEMP_MIN = 16;
const float TEMP_MAX = 30;
const float HUM_MIN = 60;
const float HUM_MAX = 80;
void setup() {
// Iniciar lcd e backlight
lcd.init();
lcd.backlight();
// Carrega os caracteres personalizados
lcd.createChar(0, vsLogo);
lcd.createChar(1, cup);
lcd.setCursor(0, 0); // Primeira linha, primeira coluna
lcd.write(byte(0)); // Mostra a logo "VS"
// LEDs
pinMode(ledGreen, OUTPUT);
pinMode(ledYellow, OUTPUT);
pinMode(ledRed, OUTPUT);
pinMode(ledGreen2, OUTPUT);
pinMode(ledYellow2, OUTPUT);
pinMode(ledRed2, OUTPUT);
pinMode(ledRed3, OUTPUT);
pinMode(ledYellow3, OUTPUT);
pinMode(ledGreen3, OUTPUT);
pinMode(buzzer, OUTPUT);
dht.begin();
Serial.begin(9600);
RTC.begin();
// Ajustar o RTC apenas uma vez, se necessário
// RTC.adjust(DateTime(2024, 10, 26, 22, 22, 30)); // Comentar após a primeira execução
EEPROM.begin();
// Limpar EEPROM
for (int i = startAddress; i < endAddress; i++) {
EEPROM.write(i, 0xFF);
}
}
void get_log() {
Serial.println("Log dos dados:");
for (int i = startAddress; i < currentAddress; i += recordSize) {
unsigned long timestamp;
int tempInt, humiInt;
EEPROM.get(i, timestamp);
EEPROM.get(i + 4, tempInt);
EEPROM.get(i + 6, humiInt);
Serial.print("Timestamp: ");
Serial.print(timestamp);
Serial.print(" | Temp: ");
Serial.print(tempInt / 100.0);
Serial.print(" C | Humi: ");
Serial.println(humiInt / 100.0);
}
}
void getNextAddress() {
currentAddress += recordSize;
if (currentAddress >= endAddress) {
currentAddress = startAddress; // Reinicia quando chega ao final
}
}
void loop() {
int LDR = analogRead(A0);
intensidadeLuz = map(LDR, 0, 705, 0, 100);
float humidity = dht.readHumidity();
unsigned long currentMillis = millis();
float temperature = dht.readTemperature();
if (currentMillis - lastSlideshowUpdate >= slideshowInterval) {
lastSlideshowUpdate = currentMillis;
displayMode = (displayMode + 1) % 5; // Corrigido para 5 para incluir todos os modos
}
// Atualiza a hora a cada segundo
if (currentMillis - previousMillis >= updateInterval) {
previousMillis = currentMillis; // Atualiza o tempo
DateTime now = RTC.now(); // Lê a hora atual do RTC
DateTime adjustedTime = DateTime(now.unixtime() + UTC_OFFSET * 3600); // Ajuste de fuso horário
// Atualiza o display com base no modo de exibição
lcd.clear();
if (displayMode == 0) {
// Mostrar Data e Hora
lcd.setCursor(0, 0);
lcd.print("DATA: ");
lcd.print(adjustedTime.day() < 10 ? "0" : ""); // Zero à esquerda
lcd.print(adjustedTime.day());
lcd.print("/");
lcd.print(adjustedTime.month() < 10 ? "0" : ""); // Zero à esquerda
lcd.print(adjustedTime.month());
lcd.print("/");
lcd.print(adjustedTime.year());
lcd.setCursor(0, 1);
lcd.print("HORA: ");
lcd.print(adjustedTime.hour() < 10 ? "0" : ""); // Zero à esquerda
lcd.print(adjustedTime.hour());
lcd.print(":");
lcd.print(adjustedTime.minute() < 10 ? "0" : ""); // Zero à esquerda
lcd.print(adjustedTime.minute());
lcd.print(":");
lcd.print(adjustedTime.second() < 10 ? "0" : ""); // Zero à esquerda
lcd.print(adjustedTime.second());
} else if (displayMode == 1) {
lcd.setCursor(cupPosition + 4, 0); // Quarta coluna + posição da taça
lcd.write(' '); // Limpa a taça
// Atualiza a posição da taça
if (movingRight) {
cupPosition++;
if (cupPosition > 10) { // Alcança o limite direito
movingRight = false;
}
} else {
cupPosition--;
if (cupPosition < 0) { // Alcança o limite esquerdo
movingRight = true;
}
}
// Exibe a taça na nova posição
lcd.setCursor(cupPosition + 4, 0); // Quarta coluna + nova posição da taça
lcd.write(byte(1)); // Mostra a taça
// Exibe "VINHARIA"
lcd.setCursor(0, 1);
lcd.print("VINHARIA FIAP");
} else if (displayMode == 2) {
lcd.setCursor(0, 0);
lcd.print("Temperatura:");
lcd.setCursor(0, 1);
lcd.print(temperature);
lcd.print(" C");
} else if (displayMode == 3) {
lcd.setCursor(0, 0);
lcd.print("Umidade:");
lcd.setCursor(0, 1);
lcd.print(humidity);
lcd.print(" %");
} else if (displayMode == 4) {
lcd.setCursor(0, 0);
lcd.print("Luz:");
lcd.setCursor(0, 1);
lcd.print(intensidadeLuz);
lcd.print(" %");
}
// Mostra mensagens de alerta no LCD
if (alertMessage.length() > 0) {
lcd.setCursor(0, 1);
lcd.print(alertMessage);
}
int LDR = analogRead(A0);
intensidadeLuz = map(LDR, 0, 855, 0, 100);
if (intensidadeLuz < 20) {
digitalWrite(ledGreen, HIGH); // Acende o LED verde
digitalWrite(ledYellow, LOW); // Apaga o LED amarelo
digitalWrite(ledRed, LOW); // Apaga o LED vermelho
digitalWrite(buzzer, LOW); // Apaga o buzzer
}
else if (intensidadeLuz >= 21 && intensidadeLuz < 45) {
digitalWrite(ledGreen, LOW); // Apaga o LED verde
digitalWrite(ledYellow, HIGH); // Acende o LED amarelo
digitalWrite(ledRed, LOW); // Apaga o LED vermelho
digitalWrite(buzzer, LOW);
}
else {
digitalWrite(ledGreen, LOW); // Apaga o LED verde
digitalWrite(ledYellow, LOW); // Apaga o LED amarelo
digitalWrite(ledRed, HIGH); // Acende o LED vermelho
digitalWrite(buzzer, HIGH); // Acende o buzzer
}
// float trigger_t_min = 20.0; // Exemplo: valor mínimo de temperatura
// float trigger_t_max = 30.0; // Exemplo: valor máximo de temperatura
// float trigger_u_min = 30.0; // Exemplo: valor mínimo de umidade
// float trigger_u_max = 60.0; // Exemplo: valor máximo de umidade
if (temperature > 20 && temperature < 30) {
digitalWrite(ledGreen2, HIGH);
digitalWrite(ledYellow2, LOW);
digitalWrite(ledRed2, LOW);
digitalWrite(buzzer, LOW);
}
else if (temperature > 19 && temperature < 31) {
digitalWrite(ledGreen2, LOW);
digitalWrite(ledYellow2, HIGH);
digitalWrite(ledRed2, LOW);
digitalWrite(buzzer, LOW);
}
else {
digitalWrite(ledGreen2, LOW);
digitalWrite(ledYellow2, LOW);
digitalWrite(ledRed2, HIGH);
digitalWrite(buzzer, HIGH);
}
// float trigger_t_min = 20.0; // Exemplo: valor mínimo de temperatura
// float trigger_t_max = 30.0; // Exemplo: valor máximo de temperatura
// float trigger_u_min = 30.0; // Exemplo: valor mínimo de umidade
// float trigger_u_max = 60.0; // Exemplo: valor máximo de umidade
if (humidity > 65 && humidity < 80) {
digitalWrite(ledGreen3, HIGH);
digitalWrite(ledYellow3, LOW);
digitalWrite(ledRed3, LOW);
digitalWrite(buzzer, LOW);
}
else if (humidity > 60 && humidity < 85) {
digitalWrite(ledGreen3, LOW);
digitalWrite(ledYellow3, HIGH);
digitalWrite(ledRed3, LOW);
digitalWrite(buzzer, LOW);
}
else {
digitalWrite(ledGreen3, LOW);
digitalWrite(ledYellow3, LOW);
digitalWrite(ledRed3, HIGH);
digitalWrite(buzzer, HIGH);
}
// Salva os dados na EEPROM
if (now.minute() != lastLoggedMinute) {
lastLoggedMinute = now.minute();
EEPROM.put(currentAddress, now.unixtime());
EEPROM.put(currentAddress + 4, (int)(temperature * 100)); // Multiplica por 100 para armazenar como inteiro
EEPROM.put(currentAddress + 6, (int)(humidity * 100)); // Multiplica por 100 para armazenar como inteiro
getNextAddress(); // Move para o próximo endereço
}
}
}