Tutorial del Internet de las Cosas y Bluetooth con el ESP32
Juan Antonio Villalpando
Volver al índice del tutorial
____________________________
117C2.- Publica. Subscribe. Pulsadores, LED, pantalla LCD, sensor de temperatura humedad.
- En el ESP32 tenemos dos pulsadores, dos LED, una pantalla LCD y un sensor DHT-11 de temperatura-humedad.
- Publicar desde el ESP. Subscribir en Linear MQTT Dashboard.
1.- Al pulsar los pulsadores del ESP32 se Publicará cada 3 segundos sus estados, por ejemplo (ROJO PULSADO,azul NO).
2.- El sensor DHT-11 Publicará temperatura y presion cada 3 segundos y se mostrará gráficamente. [No es necesario este sensor para probar este ejemplo]
- Publicar desde Linear MQTT Dashboard. Subscribir en el ESP32.
3.- La app Linear MQTT Dashboard Publica el estado de dos Switch. Al cambiarlos, se encenderán dos LED en el ESP32 y se mostrará en pantalla LCD.
IMPORTANTE: Cambia iot.eclipse.org por mqtt.eclipse.org

__________________________________________________________________
1.- Conexiones.

__________________________________________________________________
2.- Programa para el ESP32.
IMPORTANTE: Cambia iot.eclipse.org por mqtt.eclipse.org
ESP32_mqtt_led_lcd.ino |
// Modificado por Juan A. Villalpando.
// kio4.com
//#include <ESP8266WiFi.h> // Para ESP8266
#include <WiFi.h> // Para ESp162
WiFiClient WIFI_CLIENT;
#include <PubSubClient.h>
PubSubClient MQTT_CLIENT;
////////////// Screen LCD I2C ///////////////
#include <LiquidCrystal_I2C.h>
int columnas = 16;
int filas = 2;
LiquidCrystal_I2C lcd(0x27, columnas, filas);
// LiquidCrystal_I2C lcd(0x3F, columnas, filas);
////////////////////////////////////////////////
#include "DHT.h"
#define DHTPIN 14
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
//////////////////////////////////////////////
#define pulsa16 16 // Pulsador AZUL
#define pulsa17 17 // Pulsador ROJO
int valor16;
int valor17;
String p16;
String p17;
String publicar = "0,0";
char publicacion[30];
char publicacion2[30];
#define LED12 12 // LED en terminal 12
#define LED13 13 // LED en terminal 13
unsigned long tiempo_actual=0; // Para crear un retardo.
String primera;
String segunda;
// Nombre y contraseña de tu red WiFi.
const char* ssid = "Nombre_de_tu_red_WiFi";
const char* password = "Clave_WiFi";
void setup() {
Serial.begin(115200);
pinMode(LED12, OUTPUT);
pinMode(LED13, OUTPUT);
delay(10);
lcd.init(); // Screen LCD
lcd.backlight(); // Screen LCD
dht.begin(); // Sensor humedad-temperatura.
Serial.println();
Serial.print("Conectando con ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi conectado.");
Serial.println("IP: ");
Serial.println(WiFi.localIP());
// Configuración de la respuesta.
MQTT_CLIENT.setCallback(callback);
}
void loop() {
// Continuamente comprueba si tiene conexión con MQTT.
// en caso de que no tenga, reconecta.
if (!MQTT_CLIENT.connected()) {
reconnect();
}
MQTT_CLIENT.loop(); // Chequea lo Subscrito.
// El Delay lo realizamos así:
if((millis()-tiempo_actual)>=3000){
tiempo_actual=millis();
// Publica el mensaje. Publish.
consulta();
MQTT_CLIENT.publish("juan/consulta", publicacion);
MQTT_CLIENT.publish("juan/temperatura", publicacion2);
}
}
///////////////////////
// Aquí configuramos lo que debe hacer cuando recibe un valor.
void callback(char* recibido, byte* payload, unsigned int length) {
Serial.print("Mensaje recibido: ");
Serial.print(recibido);
Serial.print(" ");
for (int i=0;i<length;i++) {
char receivedChar = (char)payload[i];
Serial.print(receivedChar);
if (receivedChar == 'a'){digitalWrite(LED12, HIGH); primera = "Encendido";}
if (receivedChar == 'b'){digitalWrite(LED12, LOW); primera = "Apagado";}
if (receivedChar == 'c'){digitalWrite(LED13, HIGH); segunda = "Encendido";}
if (receivedChar == 'd'){digitalWrite(LED13, LOW); segunda = "Apagado";}
lcd.clear(); // Borra pantalla
lcd.setCursor(0,0); // Inicio del cursor
lcd.print("LED1 = "); lcd.print(primera);
lcd.setCursor(0,1); // Siguiente renglón.
lcd.print("LED2 = "); lcd.print(segunda);
}
Serial.println();
}
/////////////////////////////////////////////
// Reconecta con MQTT broker
void reconnect() {
MQTT_CLIENT.setServer("iot.eclipse.org", 1883);
// MQTT_CLIENT.setServer("broker.hivemq.com", 1883);
// MQTT_CLIENT.setServer("mosquitto.org", 1883);
MQTT_CLIENT.setClient(WIFI_CLIENT);
// Intentando conectar con el broker.
while (!MQTT_CLIENT.connected()) {
Serial.println("Intentando conectar.");
MQTT_CLIENT.connect("JuanAntonio");
MQTT_CLIENT.subscribe("juan/led1");
MQTT_CLIENT.subscribe("juan/led2");
// Espera antes de volver a intentarlo.
delay(3000);
}
Serial.println("Conectado a MQTT.");
}
// Consulta el estado de los pulsadores.
void consulta(){
valor16 = digitalRead(pulsa16);
if (valor16 == HIGH) {p16 = "AZUL PULSADO";} else {p16 = "azul NO";}
valor17 = digitalRead(pulsa17);
if (valor17 == HIGH) {p17 = "ROJO PULSADO";} else {p17 = "rojo NO";}
publicar = p16 + "," + p17;
Serial.println(publicar);
/////////////////////
// Lee humedad y temperatura
int humedad = dht.readHumidity();
int temperatura = dht.readTemperature();
humedad = random(70,90); // Aleatorios para hacer pruebas.
temperatura = random(28,32);
//////////////////// Publicaciones /////////
String publicarString = publicar;
publicarString.toCharArray(publicacion, 30);
delay(10);
publicarString = temperatura;
publicarString.toCharArray(publicacion2, 30);
}
|
__________________________________________________________________
3.- Comentarios.
- Aunque está configurado el sensor DHT-11, he puesto que las variables temperatura y presión evolucionen mediante un número aleatorio, de esta manera no es necesario tener el DHT-11 para realizar este ejemplo.
- En vez de poner delay(3000); he puesto:
if((millis()-tiempo_actual)>=3000){
tiempo_actual=millis();
// Publica el mensaje. Publish.
consulta();
MQTT_CLIENT.publish("juan/consulta", publicacion);
MQTT_CLIENT.publish("juan/temperatura", publicacion2); }
ya que si ponemos delay(3000); el programa queda congelado 3 segundos y no detecta ninguna otra acción, en cambio al poner el código anterior, el loop puede consultar continuamente el estado de los pulsadores y temperatura.
__________________________________________________________________
4.- Configuración de la aplicación Linear MQTT Dashboard.
- Para configurar la app, debemos pulsar en los iconos indicados en la siguiente imagen:

IMPORTANTE: Cambia iot.eclipse.org por mqtt.eclipse.org

__________________________________________________________________
5.- Así quedará la aplicación.

_______________________________
|