#include <WiFi.h>
#include <PubSubClient.h>

WiFiClient esp32Client;
PubSubClient mqttClient(esp32Client);

const char* ssid     = "Wokwi-GUEST";
const char* password = "";
char *mqttServer = "broker.emqx.io";
const char* clientID = "esp32_maestro";  

int LedPin= 2;
int port = 1883;
int fotopin = 33;
int fotoval = 0;
char datos[40];
String resultS = "";

void wifiInit() {
    Serial.print("Conectándose a: ");
    Serial.println(ssid);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
      Serial.print(".");
      delay(500);  
    }
    Serial.println("");
    Serial.println("Conectado a WiFi.");
    Serial.print("Dirección IP: ");
    Serial.println(WiFi.localIP());
  }

void callback(char* topic, byte* payload, unsigned int length) 
{ 
    char msg = 0;
    Serial.print("Mensaje recibido: [");
    Serial.print(topic);
    Serial.print("]: ");

    for(int i = 0 ; i < length; i++){ msg = (char)payload[i]; }
    Serial.println(msg);
    
    if('1' == msg){ digitalWrite(LedPin, HIGH); }
    else if('0' == msg){ digitalWrite(LedPin, LOW); }
}

void reconnect() {
  while (!mqttClient.connected()) {
    Serial.println("Intentando conectarse a MQTT...");
    if (mqttClient.connect(clientID)) {
      Serial.println("Conectado");
      mqttClient.subscribe("Entrada/01");
      Serial.println("suscrito al tema");
    } else {
      Serial.print("Fallo, rc=");
      Serial.print(mqttClient.state());
      Serial.println(" intentar de nuevo en 1 segundos");
      delay(1000);
    }
  }
}

void setup()
{
  pinMode(LedPin,OUTPUT);
  Serial.begin(115200);
  delay(10);
  wifiInit();
  mqttClient.setServer(mqttServer, port);
  mqttClient.setCallback(callback);
}

void loop()
{
   if (!mqttClient.connected()) {
    reconnect();
  }
  mqttClient.loop();
  fotoval = analogRead(fotopin);
  Serial.print("Foto: ");
  Serial.println(fotoval);

  sprintf(datos, "%d ", fotoval);
  mqttClient.publish("SALIDA/01",datos);
  delay(500);
}