User: alciro    User
 

Microcontrolador ESP32

Share |
 ESP32 ejemplo de comunicación ModBus
 ESP32 Ejemplo de comunicación ModBus en modo AP Access Point
 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-2024  www.alciro.org  All rights reserved.         
Share |