#include <EspMQTTClient.h>
#include "HX711.h"

HX711 scale;

//Definicoes e constantes
char SSIDName[] = "Wokwi-GUEST"; //nome da rede WiFi
char SSIDPass[] = ""; //senha da rede WiFI

char BrokerURL[] = "broker.hivemq.com"; //URL do broker MQTT
char BrokerUserName[] = ""; //nome do usuario para autenticar no broker MQTT
char BrokerPassword[] = ""; //senha para autenticar no broker MQTT
char MQTTClientName[] = ""; //nome do cliente MQTT
int BrokerPort = 1883; //porta do broker MQTT

String TopicoPrefixo = "projetoiot"; //prefixo do topico
String Topico_01 = TopicoPrefixo+"/QntRacao"; //nome do topico 01
String Topico_02 = TopicoPrefixo+"/PoteRacao"; //nome do topico 02

EspMQTTClient clienteMQTT(SSIDName, SSIDPass, BrokerURL, BrokerUserName, BrokerPassword, MQTTClientName, BrokerPort); //inicializa o cliente MQTT

//Este prototipo de funcao deve estar sempre presente
void onConnectionEstablished() {
}

int val = 0;
float poteracao = 250; //Peso do pote com ração
int pinoPIR = 15; // O pino do sensor de movimento PIR é definido como GPIO15

void setup() {
  Serial.begin(9600); // Configura a taxa de transmissão para 9600

  scale.begin(18, 19);

  clienteMQTT.enableDebuggingMessages();

  pinMode(pinoPIR, INPUT); // Configura o sensor como modo de entrada

  scale.set_scale(2.f);
}

void loop() {

  Serial.println("Loop iniciado!");
  Serial.println(" ");

  clienteMQTT.loop();
  
  if (clienteMQTT.isWifiConnected() == 1) {
    Serial.println("Conectado ao WiFi!");
  } else {
    Serial.println("Nao conectado ao WiFi!");
  }

  if (clienteMQTT.isMqttConnected() == 1) {
    Serial.println("Conectado ao broker MQTT!");
  } else {
    Serial.println("Nao conectado ao broker MQTT!");
  }
 
  val = random(2); //val = digitalRead(pinoPIR); // Lê o valor do sensor
  if (val == 1) { // Há movimento próximo, saída de nível alto

    if (poteracao >= 30){
      float qntcomeu = (random(31, 50)); // Simulando a quantidade que o animal comeu
      if(poteracao < qntcomeu){ // Se o gato raspou o pote
        Serial.println(" "); 
        Serial.print("O animal comeu ");
        Serial.print(poteracao);
        Serial.println("g e o pote ficou vazio!"); // Imprimindo o valor do peso no monitor serial
        clienteMQTT.publish(Topico_01, String(poteracao) + "g");
        poteracao = 0;
        Serial.println("Hora de reabastecer!");
        clienteMQTT.publish(Topico_02, String(poteracao) + "g");
        poteracao = poteracao + 200;
        Serial.println("O pote foi reabastecido com mais 200g de ração!");
        Serial.println(" ");
      }else{
        poteracao = poteracao - qntcomeu;
        Serial.println(" "); 
        Serial.print("O animal comeu: ");
        Serial.print(qntcomeu);
        Serial.println("g"); // Imprimindo o valor do peso no monitor serial
        clienteMQTT.publish(Topico_01, String(qntcomeu) + "g");
        Serial.println(" ");
      }
    }else{
      Serial.println(" "); 
      Serial.println("Hora de reabastecer!");
      clienteMQTT.publish(Topico_02, String(poteracao) + "g");
      poteracao = poteracao + 200;
      Serial.println("O pote foi reabastecido com mais 200g de ração!");
      Serial.println(" ");
    }

  } else { // Se não houver movimento próximo, saída de nível baixo
    Serial.println("Sem movimento por aqui!");
    Serial.println(" ");
  }

  Serial.println("O loop será reiniciado em 3 segundos!");
  Serial.println(" ");

  delay(3000);

}