#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.emqx.io";
const int mqtt_port = 1883;
const char* mqtt_client_id = "esp32_iluminacao";
WiFiClient espClient;
PubSubClient client(espClient);
#define TRIG 5
#define ECHO 18
#define LDR 34
#define LED 2
long duration;
float distance;
int ldrValue;
float lastDistance = 0;
int lastLdrValue = 0;
const float DISTANCE_THRESHOLD = 10.0;
const int LDR_THRESHOLD = 500;
unsigned long lastPublishTime = 0;
const unsigned long PUBLISH_INTERVAL = 2000;
String lastPresenca = "";
String lastLuminosidade = "";
void setup_wifi() {
delay(10);
Serial.println("\n\n=== INICIANDO CONEXAO WiFi ===");
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 20) {
delay(500);
Serial.print(".");
attempts++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\n[WiFi] Conectado com sucesso!");
Serial.print("[WiFi] IP: ");
Serial.println(WiFi.localIP());
} else {
Serial.println("\n[WiFi] Falha ao conectar!");
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("[MQTT] Mensagem recebida em: ");
Serial.println(topic);
}
void reconnect() {
if (client.connected()) {
return;
}
int attempts = 0;
while (!client.connected() && attempts < 3) {
Serial.print("[MQTT] Tentativa ");
Serial.print(attempts + 1);
Serial.print("/3...");
if (client.connect(mqtt_client_id)) {
Serial.println(" OK!");
return;
} else {
Serial.print(" ERRO (");
Serial.print(client.state());
Serial.println(")");
delay(2000);
attempts++;
}
}
}
void setup() {
Serial.begin(115200);
delay(2000);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
Serial.println("\n========================================");
Serial.println("SISTEMA IoT - ILUMINACAO INTELIGENTE");
Serial.println("HC-SR04 + LDR + MQTT + Node-RED");
Serial.println("========================================\n");
setup_wifi();
Serial.println("[MQTT] Configurando broker...");
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
delay(3000);
reconnect();
Serial.println("[Sistema] Setup concluido!\n");
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("[WiFi] Desconectado! Reconectando...");
setup_wifi();
}
if (!client.connected()) {
reconnect();
}
client.loop();
if (millis() - lastPublishTime >= PUBLISH_INTERVAL) {
lastPublishTime = millis();
// ============ HC-SR04 ============
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
duration = pulseIn(ECHO, HIGH, 30000);
distance = duration * 0.034 / 2;
if (distance > 400 || distance == 0) {
distance = 400;
}
// ============ LDR ============
ldrValue = analogRead(LDR);
// ============ PROCESSAMENTO ============
String presenca;
String luminosidade;
if (distance < 100) {
presenca = "detectado";
} else {
presenca = "sem_presenca";
}
if (ldrValue < 2000) {
luminosidade = "escuro";
} else {
luminosidade = "claro";
}
// ============ PUBLICAR MQTT - VALORES NUMERICOS ============
if (client.connected()) {
// Publica a distancia em cm (numero)
char distStr[8];
dtostrf(distance, 1, 2, distStr);
if (abs(distance - lastDistance) > DISTANCE_THRESHOLD) {
client.publish("esp32/sensor/distancia", distStr);
lastDistance = distance;
}
// Publica o LDR em ADC (numero)
char ldrStr[5];
snprintf(ldrStr, sizeof(ldrStr), "%d", ldrValue);
if (abs(ldrValue - lastLdrValue) > LDR_THRESHOLD) {
client.publish("esp32/sensor/ldr", ldrStr);
lastLdrValue = ldrValue;
}
// Publica o status (texto)
if (presenca != lastPresenca) {
client.publish("esp32/sensor/presenca", presenca.c_str());
lastPresenca = presenca;
}
if (luminosidade != lastLuminosidade) {
client.publish("esp32/sensor/luminosidade", luminosidade.c_str());
lastLuminosidade = luminosidade;
}
Serial.print("[MQTT] Distancia: ");
Serial.print(distance);
Serial.print(" cm | LDR: ");
Serial.println(ldrValue);
}
// ============ LOGICA DO LED ============
if (presenca == "detectado" && luminosidade == "escuro") {
digitalWrite(LED, HIGH);
} else {
digitalWrite(LED, LOW);
}
Serial.print("[Sensores] ");
Serial.print(distance);
Serial.print("cm | ");
Serial.print(ldrValue);
Serial.print(" | ");
Serial.print(presenca);
Serial.print(" | ");
Serial.println(luminosidade);
}
}