#include <EEPROM.h>
#include <DHT.h>
#include <Servo.h>
#include "AlarmTone.h"
#include <Wire.h>
#include <LiquidCrystal.h>
#define DHTPIN 2
#define DHTTYPE DHT22
#define RELAY_HEAT 3
#define FAN_PIN 4
#define SERVO_PIN 5
#define UMIDIFICADOR_PIN 6 // Novo pino para o relé do umidificador
#define SPEAKER_PIN A3
DHT dht(DHTPIN, DHTTYPE);
Servo virador;
AlarmTone alarmTone;
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
int pos = 0;
float tempMin = 37.0;
float tempMax = 38.0;
float umidadeMin = 45.0;
float umidadeMax = 55.0;
unsigned long ultimaVirada = 0;
unsigned long ultimaDesvirada = 0;
unsigned long media = 0;
unsigned long umedia = 0;
unsigned long eclode = 0;
const unsigned long intervaloVirada = 1UL * 30UL * 1000UL; // 2 minutos (ajuste para 4h real)
const unsigned long intervaloDesvirada = 1UL * 45UL * 1000UL; // 2 minutos (ajuste para 4h real)
const unsigned long tempMedia = 1UL * 60UL * 1000UL; // 1 minuto
const unsigned long umiMedia = 1UL * 60UL * 1000UL; // 1 minuto
const unsigned long eclodido = 3UL * 60UL * 1000UL; // 3 minutos (ajuste para 21 dias real)
void setup() {
pinMode(2, INPUT_PULLUP);
// EEPROM limpa apenas se necessário
// for (int i = 0 ; i < EEPROM.length() ; i++) {
// EEPROM.write(i, 0);
// }
Serial.begin(9600);
lcd.begin(16, 2);
dht.begin();
pinMode(RELAY_HEAT, OUTPUT);
pinMode(FAN_PIN, OUTPUT);
pinMode(UMIDIFICADOR_PIN, OUTPUT); // Novo pino do umidificador
pinMode(13, OUTPUT);
virador.attach(SERVO_PIN);
virador.write(0);
alarmTone.begin(SPEAKER_PIN);
lcd.setCursor(0, 0);
lcd.print("Incubadora");
delay(2000);
lcd.clear();
}
void loop() {
float temperatura = dht.readTemperature();
float umidade = dht.readHumidity();
if (isnan(temperatura) || isnan(umidade)) {
Serial.println("Falha na leitura do sensor DHT!");
lcd.setCursor(0, 0);
lcd.print("Erro no sensor");
delay(2000);
return;
}
Serial.print("Temp: ");
Serial.print(temperatura);
Serial.print(" °C | Umidade: ");
Serial.print(umidade);
Serial.println(" %");
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperatura);
lcd.print("C ");
lcd.setCursor(0, 1);
lcd.print("Umid: ");
lcd.print(umidade);
lcd.print("% ");
// Controle de aquecimento
if (temperatura < tempMin) {
digitalWrite(RELAY_HEAT, HIGH);
lcd.setCursor(12, 0);
lcd.print("Aq");
} else if (temperatura > tempMax) {
digitalWrite(RELAY_HEAT, LOW);
lcd.setCursor(12, 0);
lcd.print(" ");
}
// Controle de ventilação
if (temperatura > tempMax || umidade > umidadeMax) {
digitalWrite(FAN_PIN, HIGH);
digitalWrite(UMIDIFICADOR_PIN, HIGH);
lcd.setCursor(12, 1);
lcd.print("Vent");
} else {
digitalWrite(FAN_PIN, LOW);
digitalWrite(UMIDIFICADOR_PIN, HIGH);
lcd.setCursor(12, 1);
lcd.print(" ");
}
// Alarme de temperatura fora da média
if (temperatura < tempMin || temperatura > tempMax) {
if (millis() - media > tempMedia) {
alarmTone.play();
}
} else {
media = millis();
alarmTone.stop();
}
// Alarme de umidade fora da média
if (umidade < umidadeMin) {
if (millis() - umedia > umiMedia) {
alarmTone.play();
digitalWrite(UMIDIFICADOR_PIN, HIGH);
}
} else{
if (umidade >= umidadeMax){
umedia = millis();
digitalWrite(UMIDIFICADOR_PIN, LOW);
alarmTone.stop();
}
}
// Alerta de eclosão
if (millis() - eclode > eclodido) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Eclodindo: pinto");
lcd.setCursor(0, 1);
lcd.print("Aguarde: Verifiq");
// Não atualiza eclode para manter a mensagem
}
// Viragem dos ovos
if (millis() - ultimaVirada > intervaloVirada) {
digitalWrite(13, HIGH);
for (pos = 0; pos <= 180; pos += 1) {
virador.write(pos);
delay(15);
}
digitalWrite(13, LOW);
ultimaVirada = millis();
}
if (millis() - ultimaDesvirada > intervaloDesvirada) {
digitalWrite(13, HIGH);
for (pos = 180; pos >= 0; pos -= 1) {
virador.write(pos);
delay(15);
}
digitalWrite(13, LOW);
ultimaDesvirada = millis();
}
delay(1000); // 1 segundo
}