#include <WiFi.h>
#include <PubSubClient.h>
#define TOPIC_STATUS "topic_STATUS_NIC"
#define TOPIC_MANUAL "topic_MANUAL_NIC"
#define PUBLISH_DELAY 1000
#define ID_MQTT "NICOLLAS-ISAAC-321432_"
#define LED_VERMELHO_PIN 18
#define LED_AZUL_PIN 5
#define LDR_PIN 32
#define BOTAO_VERDE_PIN 23
bool manual = false;
bool status = false;
unsigned long publishUpdate = 0;
const char *SSID = "Wokwi-GUEST";
const char *PASSWORD = "";
const char *BROKER_MQTT = "mqtt-dashboard.com";
int BROKER_PORT = 1883;
WiFiClient espClient;
PubSubClient MQTT(espClient);
void initWiFi();
void initMQTT();
void callbackMQTT(char *topic, byte *payload, unsigned int length);
void reconnectMQTT();
void reconnectWiFi();
void checkWiFiAndMQTT();
void Verificacao(int valorLdr);
void setup() {
Serial.begin(9600);
pinMode(LED_VERMELHO_PIN, OUTPUT);
pinMode(LED_AZUL_PIN, OUTPUT);
pinMode(BOTAO_VERDE_PIN, INPUT_PULLUP);
initWiFi();
initMQTT();
}
void loop() {
checkWiFiAndMQTT();
MQTT.loop();
int estadoBotaoVerde = digitalRead(BOTAO_VERDE_PIN);
delay(300);
if (estadoBotaoVerde == HIGH) {
Serial.println("Botão solto_ligado");
} else if (estadoBotaoVerde == LOW) {
Serial.println("Botão pressionado_desligado");
}
if (!manual) {
if ((millis() - publishUpdate) >= PUBLISH_DELAY) {
int valorLdr = analogRead(LDR_PIN);
String valorLdrStr = String(valorLdr);
char msg[50];
sprintf(msg, "Analog Value = %s", valorLdrStr.c_str());
MQTT.publish(TOPIC_STATUS, msg);
Verificacao(valorLdr);
publishUpdate = millis();
status = digitalRead(LDR_PIN);
}
}
}
void initWiFi() {
delay(10);
Serial.println("------Conexao WI-FI------");
Serial.print("Conectando-se na rede: ");
Serial.println(SSID);
Serial.println("Aguarde");
reconnectWiFi();
}
void initMQTT() {
MQTT.setServer(BROKER_MQTT, BROKER_PORT);
MQTT.setCallback(callbackMQTT);
}
void callbackMQTT(char *topic, byte *payload, unsigned int length) {
char msg[length + 1];
for (unsigned int i = 0; i < length; i++) {
msg[i] = (char)payload[i];
}
msg[length] = '\0';
Serial.printf(" %s do topico: %s\n", msg, topic);
String message = String(msg);
if (message.equals("manual_ON")) {
manual = true;
status = 0;
}
if (message.equals("manual_OFF")) {
manual = true;
status = 1;
}
if (message.equals("automatico")) {
manual = false;
status = 0;
}
}
void reconnectMQTT() {
while (!MQTT.connected()) {
Serial.print("* Tentando se conectar ao Broker MQTT: ");
Serial.println(BROKER_MQTT);
if (MQTT.connect(ID_MQTT)) {
Serial.println("Conectado com sucesso ao broker MQTT!");
MQTT.subscribe(TOPIC_STATUS);
MQTT.subscribe(TOPIC_MANUAL);
} else {
Serial.println("Falha ao reconectar no broker.");
Serial.println("Nova tentativa de conexao em 2 segundos.");
delay(2000);
}
}
}
void checkWiFiAndMQTT() {
if (!MQTT.connected())
reconnectMQTT();
reconnectWiFi();
}
void reconnectWiFi() {
if (WiFi.status() == WL_CONNECTED)
return;
WiFi.begin(SSID, PASSWORD, 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println();
Serial.print("Conectado com sucesso na rede ");
Serial.print(SSID);
Serial.println("IP obtido: ");
Serial.println(WiFi.localIP());
}
void Verificacao(int valorLdr) {
if (valorLdr < 2000) {
//digitalWrite(LED_VERMELHO_PIN, LOW);
// digitalWrite(LED_AZUL_PIN, HIGH);
//delay(500);
MQTT.publish(TOPIC_STATUS, "LEDAZUL_ACESO");
digitalWrite(LED_AZUL_PIN, HIGH);
digitalWrite(LED_VERMELHO_PIN,LOW);
delay(500);
} else {
digitalWrite(LED_VERMELHO_PIN, HIGH);
MQTT.publish(TOPIC_STATUS, "LEDVERMELHO_ACESO");
digitalWrite(LED_AZUL_PIN, LOW);
}
}