#include <WiFi.h>
#include <PubSubClient.h>
// --------------------------------------------------
// CONFIG Wi-Fi
// --------------------------------------------------
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// --------------------------------------------------
// CONFIG MQTT
// --------------------------------------------------
const char* mqtt_server = "44.223.43.74";
const int mqtt_port = 1883;
// --------------------------------------------------
// IDENTIFICAÇÃO NO FIWARE
// --------------------------------------------------
const char* device_id = "device562472"; // igual ao device.json
const char* api_key = "TEF";
// --------------------------------------------------
// PINOS
// --------------------------------------------------
#define LED_PIN 2
#define LDR_PIN 34
WiFiClient espClient;
PubSubClient client(espClient);
// Estado atual
String luminosityLevel = "none";
// --------------------------------------------------
// Callback para receber comandos FIWARE
// --------------------------------------------------
void callback(char* topic, byte* payload, unsigned int length) {
String msg;
for (int i = 0; i < length; i++) msg += (char)payload[i];
Serial.print("Comando recebido: ");
Serial.println(msg);
if (msg.startsWith("on")) {
digitalWrite(LED_PIN, HIGH);
client.publish("/TEF/device562472/cmdexe", "on|OK");
}
if (msg.startsWith("off")) {
digitalWrite(LED_PIN, LOW);
client.publish("/TEF/device562472/cmdexe", "off|OK");
}
}
// --------------------------------------------------
// Wi-Fi
// --------------------------------------------------
void setup_wifi() {
Serial.println();
Serial.print("Conectando em ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi conectado!");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}
// --------------------------------------------------
// Reconectar MQTT
// --------------------------------------------------
void reconnect() {
while (!client.connected()) {
Serial.print("Conectando ao MQTT... ");
if (client.connect(device_id)) {
Serial.println("Conectado!");
// Assinar comandos do FIWARE
String subTopic = String("/") + api_key + "/" + device_id + "/cmd";
client.subscribe(subTopic.c_str());
Serial.print("Inscrito em: ");
Serial.println(subTopic);
} else {
Serial.print("Falhou, rc=");
Serial.print(client.state());
Serial.println(" tentando novamente em 5s");
delay(5000);
}
}
}
// --------------------------------------------------
// Enviar FIWARE (UltraLight 2.0)
// --------------------------------------------------
void sendToFiware(int luminosityPercent, String level) {
char payload[60];
sprintf(payload, "d|%d|s|%s", luminosityPercent, level.c_str());
String topic = String("/") + api_key + "/" + device_id + "/attrs";
client.publish(topic.c_str(), payload);
Serial.print("Enviado → ");
Serial.println(payload);
}
// --------------------------------------------------
// SETUP
// --------------------------------------------------
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
Serial.println("Sistema iniciado — monitorando luminosidade...");
}
// --------------------------------------------------
// LOOP
// --------------------------------------------------
void loop() {
if (!client.connected()) reconnect();
client.loop();
int rawValue = analogRead(LDR_PIN);
int luminosityPercent = map(rawValue, 0, 4095, 0, 100);
Serial.print("Luminosidade (%): ");
Serial.println(luminosityPercent);
String level;
if (luminosityPercent < 50) level = "low";
else if (luminosityPercent <= 70) level = "mid";
else level = "critical";
digitalWrite(LED_PIN, (level == "critical") ? HIGH : LOW);
sendToFiware(luminosityPercent, level);
delay(3000);
}