User: alciro    User
 

Microcontrolador ESP32

Share |
 ESP32 ejemplo de comunicación ModBus
 ESP32 Ejemplo de comunicación ModBus en modo AP Access Point
 Ejemplo de comunicación ModBus RTU con el ESP32 como slave RS485
 ModBus guía de referencia

4. ESP32 ejemplo comunicacion mqtt en node-red

Ejemplo de programa básico para utilizar una placa ESP32 como unidad remota de entradas y salidas digitales y analógicas, utilizando comunicación broker mqtt con nodered.

El objetivo del programa es probar el funcionamiento de la placa ESP32, para comunicarse con un broker MQTT y crear un panel de control basado en Node-Red.

Creamos el tema rafa/esp32/pin2/out, al cual nos suscribimos en el broker mqtt. El ESP32 utiliza la información recibida para controlar el led integrado en la placa PCB.
/*
*  Ejemplo de comunicación mqtt TCP/IP con el ESP32
*  
*  Descripción: Programa básico para utilizar una placa ESP32 como unidad remota de entradas
*  y salidas digitales y analógicas, utilizando comunicación broker mqtt con nodered. 
*  
*  Librería MQTT: https://github.com/knolleary/pubsubclient
*
*  Autor: Rafa Aranda
*  Fecha: 0-04-2024
*  Versión: 1.0
*/

// Librerías
#include <WiFi.h>
#define DEBUG_SW 1
#include <PubSubClient.h>

// Asignación de Pins a Salidas digitales
#define LED_PIN  2

// Puerto del servidor MQTT
#define MQTT_PUERTO  1884

// Funciones prototipo
//void getInputs(void);
//void setOutputs(void);
void setup_wifi(void);
void llega_mensaje(char* topic, byte* payload, unsigned int length);
void conectar(void);

//  Variables globales 
//#define MSG_BUFFER_SIZE  (50)
//char msg[MSG_BUFFER_SIZE]; // Mensaje

// Parámetros de red
const char* ssid = "linksys"; // Para la escuela
const char* password = "12345678";
const char* mqtt_server = "www.alciro.org"; // Direccion del servidor mqtt
const char* mqttUser = "";
const char* mqttPassword = "";

/* Subcripciones a temas (topics)
* Se ha de seguir una ordenación coherente como:
* usuario/dispositivo/conexión/acción -> rafa/esp32/pin1/salida, rafa/esp32/registro1/velocidad
* casa/habitación/dispositivo/magnitud -> casaRafa/comedor/sensor/temperatura, casaRafa/comedor/actuador/luz
* Caracteres comodín
* Multi-level: # para suscribirse a todos los hijos bajo esa cola
* Single Level: + para suscribirse solo a ese nivel
*/ 
#define sub1 "rafa/esp32/pin2/out"
#define sub2 "rafa/esp32/pin3/in"

// Objetos
WiFiClient espClient;
PubSubClient client(espClient);


// Configuración inicial
void setup(){
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, MQTT_PUERTO);
  client.setCallback(llega_mensaje);
}

// Programa principal
void loop(){
  if (!client.connected()){ // Conexión MQTT
    conectar();
  }
  //getInputs(); // Leer entradas digitales
  //getAnalog(); // Leer entradas analógicas
  client.loop(); // Sondear las comunicaciones MQTT
  
  // PROGAMA DE AUTOMATIZACIÓN DE......
  //----------------------------------------------------------------------------------------------------
  /* Aquí mi programa de automatización utilizando los datos de las variables asociadas al mqtt,
  parámetros y consignas para hacer mi proyecto..... */
  
  //setOutputs();   // Activar las salidas
}

/* setup_wifi
*  Conexión a la red WiFi
*/
void setup_wifi(void){
  delay(10);
  // Conectando con la red  WiFi
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // Inicia el generador de números pseudoaleatorios, lo que hace que comience en un punto arbitrario
  randomSeed(micros());

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

/* llega_mensaje
*  Función Callback para analizar los mensajes mqtt
*/
void llega_mensaje(char* topic, byte* payload, unsigned int length){
  String mensaje;

  // Lanzamos los mensajes recibido por el terminal
  Serial.print("Mensaje del topic {");
  Serial.print(topic);
  Serial.print("} ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
    mensaje += (char)payload[i];
  }
  Serial.println();
  
  // Acciones a realizar de los mensajes recibidos
  if (strstr(topic, sub1)){ // Si es el topic al que estamos subcritos
      if (mensaje == "false"){
        digitalWrite(LED_PIN, LOW);   // Encender el LED. Se entrega un LOW, está conectado a +
        Serial.println(" pin on");
      }else{
        digitalWrite(LED_PIN, HIGH);  // Apagar el LED. Se entrega un HIGH, está conectado a +
        Serial.println(" pin off");
      }
  }else if(topic, sub2){  // Si es el topic al que estamos subcritos
    /* Aquí mi programa de atención al topic subcrito */

  }else{
    Serial.println("topic desconocido");
  }
}

/* conectar
*  Conexión con el broker MQTT 
*/
void conectar(void){
  // Esperar hasta conectar con el servidor MQTT
  while (!client.connected()) {
    Serial.print("Intentando conexión MQTT... ");
    // Creamos un client ID random
    String clientId = "ESP32Client-";
    clientId += String(random(0xffff), HEX);
    // Intenta conectar
    if (client.connect(clientId.c_str() , mqttUser, mqttPassword)) {
      Serial.println("conectado");
      // Una vez conectado, publica un anuncio..
      client.publish("outTopic", "hello world");
      // Y nos subcribimos a los topics desdeados
      client.subscribe(sub1);
      //client.subscribe(sub2);
      /* aquí otros topics */

    } else {
      Serial.print("ERROR, estado = ");
      Serial.print(client.state());
      Serial.println(" se intentará de nuevo en 5 segundos");
      // Esperamos 5 segundos
      delay(5000);
    }
  }
}

 

Loading

copyright © 2007-2026  www.alciro.org  All rights reserved.         
Share |