#include <DHT.h>
// ====== Pinos (ESP32 DevKit C V4) ======
#define DHTPIN 4 // Dado do DHT22
#define DHTTYPE DHT22
#define LDRPIN 34 // Saída analógica do módulo LDR
// ====== Tempo de leitura ======
unsigned long lastSensorRead = 0;
const unsigned long sensorInterval = 5000; // 5 segundos - melhor para DevKit C V4
// ====== Tópicos "MQTT" (simulados) ======
String baseTopic = "Fiap/iot/3esor/VinheriaAgnello/";
String tempTopic = baseTopic + "temperatura";
String humTopic = baseTopic + "umidade";
String ldrTopic = baseTopic + "luminosidade";
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
Serial.println("=== SISTEMA VINHERIA AGNELLO (ESP32 DevKit C V4) ===");
// *** FIX ESPECÍFICO PARA DEVKIT C V4 ***
delay(1000); // Aguardar boot completo
Serial.println("Inicializando sensores (DHT22 + LDR)...");
// Configurar pino antes de inicializar DHT
pinMode(DHTPIN, INPUT_PULLUP);
delay(500);
dht.begin();
// Delay LONGO para DevKit C V4 estabilizar
delay(3000);
Serial.println("WiFi simulado conectado!");
Serial.println("MQTT simulado conectado!");
Serial.println("Sistema inicializado. Iniciando monitoramento...");
Serial.println("===============================================");
// Leitura inicial após tudo configurado
delay(2000);
readAndPublishSensors();
}
void loop() {
unsigned long now = millis();
if (now - lastSensorRead >= sensorInterval) {
readAndPublishSensors();
lastSensorRead = now;
}
delay(100);
}
void readAndPublishSensors() {
Serial.println(">>> Iniciando nova leitura...");
// *** LEITURA DHT22 COM RETRY ESPECÍFICO PARA DEVKIT C V4 ***
float temperature = NAN;
float humidity = NAN;
// Tentar até 5 vezes (DevKit C V4 pode precisar de mais tentativas)
for (int attempt = 1; attempt <= 5; attempt++) {
Serial.print("Tentativa "); Serial.print(attempt); Serial.print("/5... ");
temperature = dht.readTemperature();
humidity = dht.readHumidity();
if (!isnan(temperature) && !isnan(humidity)) {
Serial.println("SUCESSO!");
break;
}
Serial.println("FALHA");
if (attempt < 5) {
delay(1500); // Delay entre tentativas
}
}
if (isnan(temperature) || isnan(humidity)) {
Serial.println("*** ERRO: DHT22 não respondeu após 5 tentativas ***");
Serial.println(">>> Pulando para próxima leitura...");
return;
}
// ----- LDR (ESP32: 0..4095 @ 0..3.3V) -----
int ldrRaw = analogRead(LDRPIN);
float luminosityPct = map(ldrRaw, 0, 4095, 0, 100);
luminosityPct = constrain(luminosityPct, 0, 100);
// ----- Timestamp -----
Serial.print("Timestamp: "); Serial.print(millis()); Serial.println(" ms");
// ----- Debug bruto -----
Serial.println("--- LEITURAS BRUTAS ---");
Serial.print("DHT22 Temp (°C): "); Serial.println(temperature, 1);
Serial.print("DHT22 Umid (%): "); Serial.println(humidity, 1);
Serial.print("LDR RAW (0-4095): "); Serial.println(ldrRaw);
// ----- JSONs individuais (como se fossem por tópico) -----
String tempJson = "{\"sensor1\": " + String(temperature, 1) + "}";
String humJson = "{\"sensor1\": " + String(humidity, 1) + "}";
String ldrJson = "{\"sensor2\": " + String(luminosityPct, 0) + "}";
Serial.println("--- SIMULACAO MQTT ---");
Serial.print("Topico: "); Serial.println(tempTopic);
Serial.print("Payload: "); Serial.println(tempJson);
Serial.print("Topico: "); Serial.println(humTopic);
Serial.print("Payload: "); Serial.println(humJson);
Serial.print("Topico: "); Serial.println(ldrTopic);
Serial.print("Payload: "); Serial.println(ldrJson);
// ----- JSON combinado para Node-RED -----
String combinedJson = String("{\"temperatura\": ") + String(temperature, 1) +
", \"umidade\": " + String(humidity, 1) +
", \"luminosidade\": " + String(luminosityPct, 0) + "}";
Serial.println("--- DEBUG NODE-RED ---");
Serial.println(combinedJson);
// ----- Avaliação das condições da vinheria -----
evaluateWineStorageConditions(temperature, luminosityPct);
Serial.println("===============================================");
}
void evaluateWineStorageConditions(float tempC, float lightPct) {
Serial.println("--- AVALIACAO CONDICOES VINHERIA ---");
// Temperatura ideal: 10–15°C (aceitável até 18°C)
// Luminosidade ideal: baixa (0–30%)
bool tempOK = false, lightOK = false;
if (tempC >= 10 && tempC <= 15) {
Serial.println("Temperatura IDEAL para vinhos");
tempOK = true;
} else if (tempC > 15 && tempC <= 18) {
Serial.println("Temperatura ACEITAVEL para vinhos");
tempOK = true;
} else if (tempC > 18) {
Serial.println("Temperatura ALTA - risco para vinhos!");
} else {
Serial.println("Temperatura BAIXA - verificar aquecimento");
}
if (lightPct <= 30) {
Serial.println("Luminosidade IDEAL para vinhos");
lightOK = true;
} else if (lightPct <= 50) {
Serial.println("Luminosidade MODERADA - atencao necessaria");
} else {
Serial.println("Luminosidade ALTA - risco para vinhos!");
}
Serial.println((tempOK && lightOK) ?
"STATUS GERAL: CONDICOES IDEAIS" :
"STATUS GERAL: NECESSITA ATENCAO");
}