#include <WiFi.h>
#include <PubSubClient.h>
// Configurações
const char* default_SSID = "Wokwi-GUEST";
const char* default_PASSWORD = "";
const char* default_BROKER_MQTT = "98.88.35.221";
const int default_BROKER_PORT = 1883;
// 🔴 ALTERADO PARA lamp002
const char* default_TOPICO_SUBSCRIBE = "/TEF/lamp002/cmd";
const char* default_TOPICO_PUBLISH_1 = "/TEF/lamp002/attrs";
const char* default_TOPICO_PUBLISH_2 = "/TEF/lamp002/attrs/l";
const char* default_ID_MQTT = "fiware_002";
const int default_D4 = 2;
// Prefixo
const char* topicPrefix = "lamp002";
// RGB
const int PIN_R = 25;
const int PIN_G = 26;
const int PIN_B = 27;
// Variáveis
char* SSID = const_cast<char*>(default_SSID);
char* PASSWORD = const_cast<char*>(default_PASSWORD);
char* BROKER_MQTT = const_cast<char*>(default_BROKER_MQTT);
int BROKER_PORT = default_BROKER_PORT;
char* TOPICO_SUBSCRIBE = const_cast<char*>(default_TOPICO_SUBSCRIBE);
char* TOPICO_PUBLISH_1 = const_cast<char*>(default_TOPICO_PUBLISH_1);
char* TOPICO_PUBLISH_2 = const_cast<char*>(default_TOPICO_PUBLISH_2);
char* ID_MQTT = const_cast<char*>(default_ID_MQTT);
int D4 = default_D4;
WiFiClient espClient;
PubSubClient MQTT(espClient);
char EstadoSaida = '0';
// ======================= RGB =======================
void setColor(int r, int g, int b) {
ledcWrite(PIN_R, r);
ledcWrite(PIN_G, g);
ledcWrite(PIN_B, b);
}
void initWiFi() {
delay(10);
Serial.println("------Conexao WI-FI------");
Serial.print("Conectando-se na rede: ");
Serial.println(SSID);
reconectWiFi();
}
void initMQTT() {
MQTT.setServer(BROKER_MQTT, BROKER_PORT);
MQTT.setCallback(mqtt_callback);
}
// ======================= SETUP =======================
void setup() {
Serial.begin(115200); // Any baud rate should work
Serial.println("Hello Arduino\n");
InitOutput();
// PWM (Wokwi)
ledcAttach(PIN_R, 5000, 8);
ledcAttach(PIN_G, 5000, 8);
ledcAttach(PIN_B, 5000, 8);
//initSerial();
initWiFi();
initMQTT();
delay(5000);
MQTT.publish(TOPICO_PUBLISH_1, "s|on");
}
// ======================= LOOP =======================
void loop() {
VerificaConexoesWiFIEMQTT();
EnviaEstadoOutputMQTT();
handleLuminosity();
MQTT.loop();
}
// ======================= WIFI =======================
void reconectWiFi() {
if (WiFi.status() == WL_CONNECTED) return;
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println("\nWiFi conectado");
digitalWrite(D4, LOW);
}
// ======================= MQTT CALLBACK =======================
void mqtt_callback(char* topic, byte* payload, unsigned int length) {
String msg;
for (int i = 0; i < length; i++) {
msg += (char)payload[i];
}
Serial.print("Mensagem recebida: ");
Serial.println(msg);
String onTopic = String(topicPrefix) + "@on|";
String offTopic = String(topicPrefix) + "@off|";
String rgbTopic = String(topicPrefix) + "@rgb|";
// ON/OFF
if (msg.equals(onTopic)) {
digitalWrite(D4, HIGH);
setColor(255,255,255);
EstadoSaida = '1';
}
else if (msg.equals(offTopic)) {
digitalWrite(D4, LOW);
setColor(0,0,0);
EstadoSaida = '0';
}
// RGB DINÂMICO
else if (msg.equals(rgbTopic)) {
String valores = msg.substring(msg.indexOf("|") + 1);
int r, g, b;
sscanf(valores.c_str(), "%d,%d,%d", &r, &g, &b);
r = constrain(r, 0, 255);
g = constrain(g, 0, 255);
b = constrain(b, 0, 255);
Serial.printf("RGB: %d %d %d\n", r, g, b);
setColor(r, g, b);
}
}
// ======================= CONEXÕES =======================
void VerificaConexoesWiFIEMQTT() {
if (!MQTT.connected()) reconnectMQTT();
reconectWiFi();
}
void reconnectMQTT() {
while (!MQTT.connected()) {
Serial.println("Conectando MQTT...");
if (MQTT.connect(ID_MQTT)) {
MQTT.subscribe(TOPICO_SUBSCRIBE);
} else {
delay(2000);
}
}
}
// ======================= STATUS =======================
void EnviaEstadoOutputMQTT() {
if (EstadoSaida == '1') {
MQTT.publish(TOPICO_PUBLISH_1, "s|on");
} else {
MQTT.publish(TOPICO_PUBLISH_1, "s|off");
}
delay(1000);
}
// ======================= LED =======================
void InitOutput() {
pinMode(D4, OUTPUT);
}
// ======================= LDR =======================
void handleLuminosity() {
int sensorValue = analogRead(34);
int luminosity = map(sensorValue, 0, 4095, 0, 100);
String msg = String(luminosity);
Serial.print("Luminosidade: ");
Serial.println(msg);
MQTT.publish(TOPICO_PUBLISH_2, msg.c_str());
}