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

WiFiClient esp32Client;
PubSubClient mqttClient(esp32Client);

const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "broker.emqx.io";
const char* clientID = "esp32_receptor";
int port = 1883;

const int pinBuzzer = 2; // GPIO2 (o el pin que prefieras)

int var = 0;
String resultS = "";
int fotoval = 0;
int muestras[20];
int numMuestras = 0;
int sumaMuestras = 0;
int nivelDeseado = 0; // Ejemplo de nivel deseado
bool alarmaActivada = false;

void setup_wifi() {
  delay(20);
  Serial.print("Conectando a ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while(WiFi.status() != WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("Wifi conectado");
  Serial.print("Dirección IP: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Mensaje recibido [");
  Serial.print(topic);
  Serial.print("] ");
  char payload_string[length + 1];
  
  int resultI;

  memcpy(payload_string, payload, length);
  payload_string[length] = '\0';
  resultI = atoi(payload_string);
  
  var = resultI;

  resultS = "";
  
  for (int i=0;i<length;i++) {
    resultS= resultS + (char)payload[i];
  }
  Serial.print("Valor fotoresistencia: ");
  Serial.println(resultS);

  muestras[numMuestras] = resultS.toInt();
  numMuestras++;
  if (numMuestras >= 5) {
    // Calcular el promedio de las muestras
    sumaMuestras = 0;
    for (int i = 0; i < 20; i++) {
      sumaMuestras += muestras[i];
    }
    int promedio = sumaMuestras / 20;

    Serial.print("Promedio: ");
    Serial.println(promedio);

    // Verificar si el promedio supera el nivel deseado
    if (promedio >= nivelDeseado && !alarmaActivada) {
      // Activar la alarma (encender el buzzer)
      digitalWrite(pinBuzzer, HIGH);
      alarmaActivada = true;
      Serial.println("Alarma activada!");
    }
  }
}

void reconnect(){
  while(!mqttClient.connected()){
    Serial.print("intentando conexion a MQTT ...");
    if(mqttClient.connect(clientID)){
      Serial.println("conectado..");
      mqttClient.subscribe("SALIDA/01");
      Serial.println("suscrito al tema");
    }
    else{
      Serial.print("Fallo, rc=");
      Serial.print(mqttClient.state());
      Serial.print("intentara en 5 segundos");
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  setup_wifi();
  mqttClient.setServer(mqttServer,port);
  mqttClient.setCallback(callback);
  pinMode(pinBuzzer, OUTPUT); // Configura el pin del buzzer como salida
}

void loop() {
  if (!mqttClient.connected()){
    reconnect();
  }
  mqttClient.loop();
  delay(1000);
}