# CÓDIGO DE IDE DE ARDUINO PARA CONEXIÓN AL BROQUER
Código de programación y conexión al servidor Emqx así también conexión con comunicación inalámbrica wifi para el envío de mensajes con los temas tópicos y el payload que seria los datos previo autenticación mediante el nombre de usuario y contraseña y el socket para la conexión y publicación y suscripción para el envío y recepción de mensajes.
Definir ESP_32 para trabajar con módulo de ESP32
```
#define ESP_32
#ifndef ESP_32
```
Define los pines del hardware en función al CPU seleccionado.
```
#ifdef ESP_32
#define PIN_TRIMPOT 34 //Definición del pin del potenciómetro
#define PIN_LED1 15 //Definición del pin del led1
#define PIN_LED2 2 //Definición del pin del led2
#define PIN_LED3 4 //Definición del pin del led3
#define PIN_LED4 5 //Definición del pin del led4
#include "WiFi.h" //Incluye librería para el manejo del wifi
```
Se incluye las librerías necesarias Mqtt de publicación y suscripción y de sensores
```
#include "PubSubClient.h" //Incluye libreria para el manejo del cliente mqtt
#include <WiFiClientSecure.h>
WiFiClientSecure espClient;
//WiFiClient espClient; //Declaración de objeto de la clase WIFIClient
#include <DHT.h>
#define DHTTYPE DHT22
DHT dht (23, DHTTYPE);
```
```
#define DEVICE_LABEL "v1/devices/cliente1/" //topico base
#define TOPICO_PUB_POT DEVICE_LABEL "pot" // topico a publicar desde el esp32 hacia el broker
#define TOPICO_SUB_LED1 DEVICE_LABEL "led1" // topico a suscribirse para recibir dato en el esp32
#define TOPICO_SUB_LED2 DEVICE_LABEL "led2" // topico a suscribirse para recibir dato en el esp32
#define TOPICO_SUB_TEXT DEVICE_LABEL "text" // topico a suscribirse para recibir dato en el esp32
```
Funcion "callback", que permite gestionar las cadenas proveniente
de un servidor mqtt cuando nos subscribimos a un determinado topico.
```
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Path -> ");//Imprime cadena
Serial.print(topic);//Imprime puntero topic, que apunta a una cadena
Serial.print("\n");//Imprime cadena espacio
Serial.print("Payload -> ");//Imprime cadena
payload[length] = 0;//Coloca un cero al final del byte array para convertirlo en cadena
Serial.println((char *)payload);//Imprime puntero payload, que apunta a una cadena
String miTopic = String(topic);//Crea objeto de la clase String con el contenido de topic
String miPayload = String((char *)payload);//Crea objeto de la clase String con el contenido de payload
/*
Permite identificar mediante comparacion si se trata de algun topico subscrito.
*/
if (miTopic.equals(TOPICO_SUB_LED1)) {
//Se encontro el topico subscrito led1
//Compara si el payload es igual a la cadena "1".
if (miPayload.equals("1")) {
digitalWrite(PIN_LED1, HIGH);//Activa la salida del led1
} else {
digitalWrite(PIN_LED1, LOW);//Desactiva la salida del led1
}
} else if (miTopic.equals(TOPICO_SUB_LED2)) {
//Se encontro el topico subscrito led2
//Compara si el payload es igual a la cadena "true".
if (miPayload.equals("true")) {
digitalWrite(PIN_LED2, HIGH);//Activa la salida del led2
} else {
digitalWrite(PIN_LED2, LOW);//Desactiva la salida del led2
}
} else if (miTopic.equals(TOPICO_SUB_TEXT)) {
//Se encontro el topico subscrito text
lcd.setCursor(0, 1);//Posiciona el lcd en la coordenada 0,1
lcd.print(" ");//Imprime cadena para limpiar la fila
lcd.setCursor(0, 1);//Posiciona el lcd en la coordenada 0,1
lcd.print("Txt:" + miPayload);//Imprime cadena y el contenido de miPayload
}
}
```
*Funcion "reconnect", que permite evaluar si el obeto "client" mqtt se encuentra
conectado al servidor, de no estar conectado entonces intenta conectarse al
servidor a traves de las credenciales del usuario registrado en dicha nube,
una vez que se conecta al servidor, se subscribe a los topicos requeridos.*
```
void reconnect() {
/*
Bucle donde se evalua si el "cliente" mqtt esta conectado al servidor,
mientras no se conecte no terminara el bucle.
*/
while (!client.connected()) {
Serial.println("Intentando conexion MQTT");//Imprime cadena
/*
Se declara una cadena para utilizar como id de la conexion, la cual
debe ser unica en cada intento de conexion, para ello se recurre
al metodo random para generar un numero aleatorio.
*/
String clientId = "iot_1_";//Crea objeto de la clase String
clientId = clientId + String(random(0xffff), HEX);//Genera una cadena con valor random
/*
Se intenta conectar al servidor (broker) mqtt mediante las credenciales
de la plataforma, si consigue conectarse devuelve TRUE.
*/
if (client.connect(clientId.c_str(), mqtt_user, mqtt_pass)) {
Serial.println("Conexion a MQTT exitosa!!");//Imprime cadena
client.subscribe(TOPICO_SUB_LED1);//Suscripcion a topico
client.subscribe(TOPICO_SUB_LED2);//Suscripcion a topico
client.subscribe(TOPICO_SUB_TEXT);//Suscripcion a topico
} else {
Serial.print("Fallo la conexion ");//Imprime cadena
Serial.println(client.state());//Imprime error de la conexion
Serial.print(" Se intentara denuevo en 5 segundos");//Imprime cadena
delay(2000);//Espera 2 segundos para seguir intentando conectarse
}
}
}
```
*Metodo para configurar el red local WIFI
*
v```
oid setup_wifi() {
Serial.println();//Imprime nueva linea
Serial.print("Conectando a: ");//Imprime cadena
Serial.println(ssid);//Imprime cadena con el contenido de ssid
WiFi.begin(ssid, password);//Configura el WIFI del modulo
/*
Mientras el WIFI se intenta conectar a la red local se hara una
espera de 500mseg y luego se imprime un simbolo hasta que
se conecte a la red local.
*/
while (WiFi.status() != WL_CONNECTED) {
delay(500);//Espera de 500mseg
Serial.print(".");//Imprime cadena
}
Serial.println("");//Imprime cadena
Serial.println("Conectando a la red Wifi! ");//Imprime cadena
Serial.print("Direccion IP: ");//Imprime cadena
Serial.println(WiFi.localIP());//Imprime la ip asignada por el router local
}
```
*Funcion "setup", que se ejecuta una sola vez al principio del programa.
*
void setup() {
pinMode(PIN_LED1, OUTPUT);//configura el pin como salida
pinMode(PIN_LED2, OUTPUT);//configura el pin como salida
Serial.begin(115200);//configura el puerto serial
setup_lcd();//configura la lcd
setup_wifi();//configura el wifi
/*
Pasamos las credenciales para el servidor mqtt (broker)
*/
client.setServer(mqtt_server, mqtt_port);
/*
Pasamos el puntero a la funcion de llamada "callback" encargada de
gestionar la recepcion de subscripciones que enviara el servidor mqtt.
*/
client.setCallback(callback);
}
/*
Declaracion de variable tipo long. Empleado para
guardar y comparar los milisegundos transcurridos.
*/
long trimpot_ms = 0;
/*
Funcion "loop", que se ejecuta siempre luego de "setup".
*/
void loop() {
/*************************************************************************************/
/*
* Este bloque consulta si han transcurrido 5seg, de ser verdad entonces
* lee el trimpot y evalua si existe cambio en su valor.
*/
/*************************************************************************************/
if (millis() - trimpot_ms > 5000) {
trimpot_ms = millis();//Actualiza el valor de "trimpot_ms"
#ifdef ESP_32
/*
Escala el resultado en 12 bits al rango de 0 a 100
*/
int adc_val = map(analogRead(PIN_TRIMPOT), 0, 4095, 0, 100);
#elif defined ESP_8266
/*
Escala el resultado en 10 bits al rango de 0 a 100
*/
int adc_val = map(analogRead(PIN_TRIMPOT), 0, 1023, 0, 100);
#endif
String val = String(adc_val);//Convierte en cadena el resultado
client.publish(TOPICO_PUB_POT, val.c_str()); //Publicando al broker mqtt
lcd.setCursor(0, 0);//Posiciona el lcd en la coordenada 0,0
lcd.print(" ");//Imprime cadena
lcd.setCursor(0, 0);//Posiciona el lcd en la coordenada 0,0
lcd.print("Pot:" + val);//Imprime el resultado en la pantalla
Serial.println("Mensaje enviado -> " + val);//Imprime el resultado
}
/*************************************************************************************/
/*
* Esta parte se monitorea la conexion al broker mqtt y se procesar
* las tareas del cliente.
*/
/*************************************************************************************/
if (client.connected() == false) {
//Consulta si el cliente mqtt se encuentra desconectado del broker
reconnect();//Invoca la funcion "reconnect"
}
client.loop();//Procesa todas las tareas del objeto "cliente"
/*************************************************************************************/
}