#include <WiFi.h>//Libreria para la conexión WiFi
#include <PubSubClient.h>//Libreria para la conexión MQTT
/***************************************************************
Definiciones
***************************************************************/
#define WIFI_SSID "Julio" //Nombre de la red WiFi
#define WIFI_PASSWORD "julio9436" //Contraseña de la red WiFi
#define MQTT_SERVER "192.168.100.35"//IP de servidor MQTT
#define MQTT_PUERTO 1883 //Puerto estandar MQTT
#define PIN_POTENCIOMETRO 36 //Pin de conexión del Potenciometro
#define RETARDO_CONEXION_WIFI 500 //Tiempo de espera para intendo de conexión
#define RETARDO_CONEXION_MQTT 5000//Tiempo de intento de reconexion
#define PERIODO_PUBLICACION 5000//Intervalo de publicación
/***************************************************************
Definir Constantes
***************************************************************/
const char* publishTopic = "ESP01/Potenciometro_01"; //Topico para publicar
//--- Cadena de caracteres en formato estandar de lenguaje C
/***************************************************************
Instanciar Objetos
***************************************************************/
WiFiClient espClient;//Instancia para manenjar la conexión WiFi
PubSubClient client(espClient);//Intancia para la comunicacion MQTT, utilizando el clinte WiFi
/***************************************************************
Declarar Variables
***************************************************************/
unsigned int potenciometro_lectura;//Almacenar lectura del potenciometro
String potentiometro_lectura_str;//Almacenar lectura en formato String
long tiempo_anterior = 0;//Tiempo en que se publico el ultimo mensaje
long tiempo_actual = 0;//Tiempo actual trancurrido en milisegundos
/***************************************************************
Funcion de configuración Setup
***************************************************************/
void setup() {
Serial.begin(115200);//Configura puerto serie
/***************************************************************
Configuración WiFi
***************************************************************/
// Conexion a la red WiFi se queda en un bucle hasta que la
// conexión sea exitosa, mostrando el progreso en el monitor serial
Serial.println("Conectando a la red WiFi");
Serial.println(WIFI_SSID);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(RETARDO_CONEXION_WIFI);
}
Serial.println("");
Serial.println("WiFi conectada..!");
Serial.print("Asiganción IP: ");
Serial.println(WiFi.localIP());
/***************************************************************
Conección Servidor MQTT
***************************************************************/
client.setServer(MQTT_SERVER, MQTT_PUERTO);//Configura el servidor y puerto MQTT
}
/***************************************************************
Funciones Cliente MQTT
***************************************************************/
void reconnect() {
while (!client.connected()) { //En caso de desconexión
Serial.print("Intentando conexión Broker MQTT...");
if (client.connect("ClienteESP01")) {//Intenta conexión
Serial.println("Conectado!");
} else {
Serial.print("fallida, rc=");//No hay conexion al Broker
Serial.print(client.state());//Muestra estado del cliente
Serial.println(" Tratar nuevament en 5 segundos");
delay(RETARDO_CONEXION_MQTT);//Espera para intentar reconexion
}
}
}
/***************************************************************
Ciclo Principal
***************************************************************/
void loop() {
/***************************************************************
Reconexion y Loop MQTT
***************************************************************/
if (!client.connected()) {//Verifica conexion al Broker MQTT
reconnect();//Intenta reconexión al Broker MQTT
}
client.loop();//Loop del cliente MQTT
/***************************************************************
Publicar Lectura Potenciometro
***************************************************************/
tiempo_actual = millis();//Tiempo actual en milisegundos
if ((tiempo_actual - tiempo_anterior) > PERIODO_PUBLICACION) {
tiempo_anterior = tiempo_actual;//Almacena tiempo de publicacion
potenciometro_lectura = analogRead(PIN_POTENCIOMETRO);//Lee potenciometro
potentiometro_lectura_str = String(potenciometro_lectura);//Lectura en cadena de caracteres
Serial.print("Potenciometro_01 = ");//Mostrar lectura en el Monitor Serie
Serial.println(potenciometro_lectura);
client.publish(publishTopic, potentiometro_lectura_str.c_str());//Publica la lectura del potenciometro
//---El metodo c_str() convierte un objeto de la clase String a una cadena de caracteres terminada
//---en null (\0) que es formato en que las cadenas de caracteres se representan en el lenguaje C
}
}