/*=================================================================================
CETEC CAPACITAÇÕES
Capacitação no aplicativo Wokwi.
Coordenador: Professor Luiz Tetsuharu Saito
Professor: Juliano Koichi Tanabe

SETEMBRO DE 2024

Aluno: Carlos Barreira da Silva Farinhas
ETEC Aristóteles Ferrreira - Santos

PROJETO 2 - Montar um circuito ESP 32 conectado a um servo motor.

A programação (na linguagem C/Arduino) deverá acionar o servo motor que deverá 
ser posicionado pelos valores recebidos de um tópico consultado no 
broker test.mosquitto.org.

Um app deverá ser desenvolvido no App Inventor e deverá conectar-se e criar 
um tópico, no test.mosquitto.org, via MQTT e deverá enviar valores de 0 a 180. 
Esses valores do tópico de 0 a 180 deverão ser consultados pelo ESP32 para 
posicionar o servo motor. Como opção, pode-se utilizar
o componente Deslizador (slider)

=================================================================================*/

//bibliotecas
#include <ESP32Servo.h>
#include <WiFi.h>
#include <PubSubClient.h>


//coneções
#define servoPin 18
#define potenciometro 34

//constantes
#define TOPIC "barPr2" //MUDAR O TÓPICO

//Dados do WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "test.mosquitto.org";

//Declarações e classes
WiFiClient espClient;
PubSubClient client(espClient);

//variáveis 
int angulo = 0;
int valorPot = 0;

//objeto servo
Servo servo1;

void setup() {

// relacionando o pino com o objeto servo
  servo1.attach(servoPin);

//inicializando o monitor serial
  Serial.begin(115200);

 // Chamada das funções de configuração do WiFi, do MQTT 
    setup_wifi();
    client.setServer(mqtt_server, 1883);
}


void loop() {

  reconnect();
  
  client.loop();

//leitura do potenciômetro
  valorPot = analogRead(potenciometro);

//mapeamento do potenciômetro 
  angulo = map(valorPot,0,4095,0,180);

//movimenta o servo
  servo1.write(angulo);

//mostra o angulo no monitor
  Serial.println(angulo);
  delay(20);

 //Dados que serão enviados ao servidor MQTT
  String payload = "{";
  payload += "\"angulo  \":";
  payload +=  String(angulo);
  payload += "}";


//Envio de dados ao servidor MQTT e mensagem de sucesso ou não
  if (client.publish(TOPIC, (char*) payload.c_str(), true)) {
    Serial.println("Mensagem publicada com sucesso");
  } else {
    Serial.println("Falha na publicação da mensagem");
  }

}

//Funcão para configurar o WiFi
void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

//Função para reconectar ao servidor em caso de desconexão

void reconnect ( void ) {

  if ( ! client.connected ( ) ) {  
    
    while ( ! client.connected ( ) ) {     
      
      Serial.print ( F ( "Conectando novamente ao servidor" ) );

      if ( client.connect ( "Client_test" ) ) {  
        Serial.println ( F ( "Cliente conectado" ) );
      } else {    
        
        Serial.print ( F ( "Falha ao conectar, tipo de erro: " ) );
        Serial.print ( client.state ( ) );     // Tipo de erro de conexão
        Serial.println ( F ( "  Tentando novamente em 5 segundos" ) );
        delay ( 5000 );
      }
    }
  }
}