#include "DHT.h"
// Configuração do sensor DHT11
#define DHTPIN 2
#define DHTTYPE DHT2
DHT dht(DHTPIN, DHTTYPE);
// Pinos PWM para as 4 Peltiers (via MOSFETs)
const int PIN_PELTIER_1 = 3;
const int PIN_PELTIER_2 = 5;
const int PIN_PELTIER_3 = 6;
const int PIN_PELTIER_4 = 9;
// Pino de controle da Bomba de Circulação (Relé ou MOSFET)
const int PIN_BOMBA = 8;
// Parâmetros de Temperatura (°C)
const float TEMP_SETPOINT = 25.0; // Inicia resfriamento a partir desta temperatura
const float TEMP_PASSO = 2.0; // Degrau entre estágios (+2°C por nível)
// Parâmetro de Segurança contra Condensação
const float UMIDADE_MAX_SEGURANCA = 85.0; // Limite de umidade (%) para desarmar o sistema
void setup() {
Serial.begin(9600);
Serial.println(F("--- Sistema de Refrigeração Progressiva Sumry 10.2kW ---"));
// Configuração dos pinos das Peltiers
pinMode(PIN_PELTIER_1, OUTPUT);
pinMode(PIN_PELTIER_2, OUTPUT);
pinMode(PIN_PELTIER_3, OUTPUT);
pinMode(PIN_PELTIER_4, OUTPUT);
// Configuração do pino da Bomba
pinMode(PIN_BOMBA, OUTPUT);
// Inicializa tudo desligado por segurança
desarmarSistema();
dht.begin();
}
void loop() {
delay(2000); // Leitura a cada 2 segundos (DHT11)
float umidade = dht.readHumidity();
float temp = dht.readTemperature();
// 1. VERIFICAÇÃO DE ERRO DE LEITURA
if (isnan(umidade) || isnan(temp)) {
Serial.println(F("[ALER2TA] Falha no sensor DHT11! Desarmando sistema por segurança."));
desarmarSistema();
return;
}
// Exibição dos dados de telemetria
Serial.print(F("Temp: "));
Serial.print(temp, 1);
Serial.print(F(" °C | Umidade: "));
Serial.print(umidade, 1);
Serial.print(F(" % | "));
// 2. VERIFICAÇÃO DE SEGURANÇA POR ALTA UMIDADE (PREVENÇÃO DE CONDENSAÇÃO)
if (umidade >= UMIDADE_MAX_SEGURANCA) {
Serial.println(F("[BLOQUEIO] Umidade alta (risco de orvalho)! Peltiers e Bomba DESLIGADAS."));
desarmarSistema();
return;
}
// 3. LÓGICA DE FUNCIONAMENTO NORMAL (Umidade dentro do limite seguro)
if (temp < TEMP_SETPOINT) {
// Temperatura baixa: Não precisa de refrigeração ativa
desarmarSistema();
Serial.println(F("Status: Temp Normal -> Sistema em Standby"));
}
else {
// Temperatura acima do setpoint: LIGA A BOMBA DE CIRCULAÇÃO
ligarBomba();
// Acionamento progressivo dos estágios Peltier
if (temp >= TEMP_SETPOINT && temp < (TEMP_SETPOINT + TEMP_PASSO)) {
// Estágio 1: Peltier 1 modulando; P2, P3 e P4 OFF
float erro = temp - TEMP_SETPOINT;
int pwm = mapFloat(erro, 0.0, TEMP_PASSO, 50, 255);
analogWrite(PIN_PELTIER_1, pwm);
analogWrite(PIN_PELTIER_2, 0);
analogWrite(PIN_PELTIER_3, 0);
analogWrite(PIN_PELTIER_4, 0);
Serial.print(F("Bomba: LIGADA | P1: "));
Serial.print(map(pwm, 0, 255, 0, 100));
Serial.println(F("% | P2,P3,P4: OFF"));
}
else if (temp >= (TEMP_SETPOINT + TEMP_PASSO) && temp < (TEMP_SETPOINT + 2 * TEMP_PASSO)) {
// Estágio 2: Peltier 1 em 100%; Peltier 2 modulando; P3 e P4 OFF
float erro = temp - (TEMP_SETPOINT + TEMP_PASSO);
int pwm = mapFloat(erro, 0.0, TEMP_PASSO, 50, 255);
analogWrite(PIN_PELTIER_1, 255);
analogWrite(PIN_PELTIER_2, pwm);
analogWrite(PIN_PELTIER_3, 0);
analogWrite(PIN_PELTIER_4, 0);
Serial.print(F("Bomba: LIGADA | P1: 100% | P2: "));
Serial.print(map(pwm, 0, 255, 0, 100));
Serial.println(F("% | P3,P4: OFF"));
}
else if (temp >= (TEMP_SETPOINT + 2 * TEMP_PASSO) && temp < (TEMP_SETPOINT + 3 * TEMP_PASSO)) {
// Estágio 3: P1 e P2 em 100%; Peltier 3 modulando; P4 OFF
float erro = temp - (TEMP_SETPOINT + 2 * TEMP_PASSO);
int pwm = mapFloat(erro, 0.0, TEMP_PASSO, 50, 255);
analogWrite(PIN_PELTIER_1, 255);
analogWrite(PIN_PELTIER_2, 255);
analogWrite(PIN_PELTIER_3, pwm);
analogWrite(PIN_PELTIER_4, 0);
Serial.print(F("Bomba: LIGADA | P1,P2: 100% | P3: "));
Serial.print(map(pwm, 0, 255, 0, 100));
Serial.println(F("% | P4: OFF"));
}
else {
// Estágio 4: P1, P2 e P3 em 100%; Peltier 4 modulando até 100%
float erro = temp - (TEMP_SETPOINT + 3 * TEMP_PASSO);
int pwm = mapFloat(erro, 0.0, TEMP_PASSO, 50, 255);
analogWrite(PIN_PELTIER_1, 255);
analogWrite(PIN_PELTIER_2, 255);
analogWrite(PIN_PELTIER_3, 255);
analogWrite(PIN_PELTIER_4, pwm);
Serial.print(F("Bomba: LIGADA | P1,P2,P3: 100% | P4: "));
Serial.print(map(pwm, 0, 255, 0, 100));
Serial.println(F("%"));
}
}
}
// Desliga todas as Peltiers e a Bomba
void desarmarSistema() {
analogWrite(PIN_PELTIER_1, 0);
analogWrite(PIN_PELTIER_2, 0);
analogWrite(PIN_PELTIER_3, 0);
analogWrite(PIN_PELTIER_4, 0);
digitalWrite(PIN_BOMBA, LOW); // Se usar relé com acionamento em nível alto (HIGH-active)
}
// Ativa a bomba de circulação d'água
void ligarBomba() {
digitalWrite(PIN_BOMBA, HIGH);
}
// Função auxiliar para conversão de valores decimais para o intervalo PWM (0-255)
int mapFloat(float x, float in_min, float in_max, int out_min, int out_max) {
float resultado = (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
return constrain((int)resultado, out_min, out_max);
}