Como enviar dados MQTT do ESP32/ESP8266 para Raspberry Pi

Cómo enviar datos MQTT desde ESP32/ESP8266 a Raspberry Pi

Es posible montar un sistema domótico de bricolaje con una placa ESP y Raspberry Pi (RPi). Ambos ofrecen conectividad Wi-Fi y pueden comunicarse fácilmente a través de una red doméstica. Sin embargo, se requiere un protocolo de comunicación para la comunicación inalámbrica de dispositivos que operan en una red más amplia.

Dado que los protocolos de Internet convencionales como HTTP suelen requerir muchos recursos para implementarlos con placas de microcontroladores, los protocolos de IoT como MQTT ofrecen una opción. MQTT es un protocolo de mensajería estándar para Internet de las cosas.

En este proyecto, diseñaremos un monitor meteorológico basado en ESP y lo configuraremos como un editor MQTT. Se configurará un corredor MQTT (es decir, Mosquitto) en el RPi para comunicarse con el dispositivo ESP. Se configurará un suscriptor MQTT en el mismo RPi para leer y registrar lecturas de temperatura y humedad.

El sensor utilizado para leer la temperatura y la humedad en el ESP32/ESP8266 es el DHT11. Si se prefiere, también se puede utilizar DHT22.

Componentes necesarios
1. Frambuesa Pi x1
2. Monitor de visualización x1
3. Cable Micro-USB y adaptador de corriente para Raspberry Pi x1
4. Cable HDMI x1
5. Teclado y ratón x1
6ESP8266 /ESP32x1
7. DHT11/DHT22x1
8. Cable micro USB para ESP8266/ESP32 x1

Configurar RPi como corredor MQTT
Mosquitto, el corredor que utilizamos, es responsable de toda la comunicación en forma de mensajes temáticos entre clientes MQTT. El ESP32/ESP8266 está configurado como un editor MQTT. El suscriptor está configurado en Raspberry Pi.

Asegúrese de que el RPi esté configurado como una computadora de escritorio . Luego instale Mosquitto en él. Para hacer esto, abra la terminal y ejecute este comando:

sudo apt-get instalar mosquito

Luego instale el cliente de línea de comandos Mosquitto ejecutando el siguiente comando en la terminal:

sudo apt-get install mosquito-clients -y

Después de instalar el broker MQTT, necesitaremos realizar cambios en sus archivos de configuración. El archivo de configuración predeterminado se almacena en /etc/mosquitto/mosquitto.conf. Abra el archivo de configuración predeterminado en el editor nano ejecutando el siguiente comando en la terminal:

sudo nano /etc/mosquitto/mosquitto.conf

El archivo de configuración debería verse similar a este...

En el archivo de configuración, deshabilitaremos la configuración predeterminada con esta línea:

incluir_dir /etc/mosquitto/conf.d

para

# incluir_dir /etc/mosquitto/conf.d

A continuación, no permitiremos que usuarios anónimos se conecten al corredor agregando esta línea:

permitir_anonimo falso

Tendremos que definir un archivo para guardar la contraseña agregando esta línea:

archivo_contraseña /etc/mosquitto/pwfile

Luego configuraremos el puerto de escucha en 1883 agregando esta línea:

oyente 1883

Guarde los cambios presionando Ctrl+S y salga presionando Ctrl+X. El archivo de configuración se verá así después de completar estas ediciones...

Ahora configuremos el nombre de usuario y la contraseña para que los clientes MQTT puedan acceder al corredor MQTT. Para crear un nombre de usuario o restablecer la contraseña de un usuario existente, ejecute el siguiente comando en la terminal:

sudo mosquitto_passwd -c /etc/mosquitto/pwfile

Para este proyecto, configuramos el nombre de usuario en "neo" y la contraseña en "eglabs". Asegúrese de elegir una contraseña segura. Tenga en cuenta que cuando ingresa la contraseña, no se ve nada en la ventana.

Puede eliminar un usuario existente ejecutando este comando en la terminal:

sudo mosquitto_passwd -d /etc/mosquitto/pwfile

Después de generar un nombre de usuario y contraseña, reinicie su Raspberry Pi para que estos cambios surtan efecto. Para hacer esto, ejecute este comando en la terminal:

reiniciar sudo

El corredor Mosquitto se puede iniciar ejecutando el siguiente comando en la terminal:

sudo systemctl iniciar mosquito

Asegurémonos de que el corredor Mosquitto esté funcionando ejecutando este comando en la terminal:

sudo systemctl estado mosquito

El corredor Mosquitto se puede detener ejecutando este comando en la terminal:

sudo systemctl detener el mosquito

El broker Mosquitto se puede reiniciar ejecutando este comando en la terminal:

sudo systemctl reiniciar mosquito

El corredor Mosquitto se puede habilitar al inicio ejecutando este comando en la terminal:

sudo systemctl habilitar mosquito

El corredor Mosquitto puede ejecutarse en segundo plano ejecutando este comando en la terminal:

mosquito -d

Configurar el monitor meteorológico
Configuraremos la estación meteorológica usando ESP32/ESP8266. Para hacer esto, necesitará conectar DHT11/DHT22 con ESP32/ESP8266

DHT11 interactuó con ESP32 para crear la estación meteorológica.

Configurando ESP32/ESP8266 como editor MQTT
Cargue el siguiente boceto en el ESP32/ESP8266 para ejecutar el ESP como una estación meteorológica. Publicará los valores de temperatura y humedad al corredor MQTT.

#incluir “DHT.h”
#incluir “PubSubClient.h”
#incluir “WiFi.h”

#definir DHTPIN4
#definir DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

// Wifi
const char*ssid = “SSID”;
const char* wifi_contraseña = “CONTRASEÑA”;

//MQTT
const char* mqtt_server = “192.168.*.*”;
const char* humedad_topic = “humedad”;
const char* temperatura_topic = “temperatura”;
const char* mqtt_username = “neo”; //nombre de usuario MQTT
const char* mqtt_password = “eglabs”; // contraseña MQTT
const char* clientID = “Weather_Reporter”; //ID de cliente MQTT

// Inicializa los objetos Cliente WiFi y MQTT
Cliente WiFiCliente WiFi;

// 1883 es ​​el puerto de escucha del Broker
Cliente PubSubClient(mqtt_server, 1883, wifiClient);

// Función personalizada para conectarse al broker MQTT vía WiFi
anular connect_MQTT {
Serial.print(“Conectando a”);
Serie.println(ssid);

//Conéctate a Wi-Fi
WiFi.begin(ssid, wifi_contraseña);

//Espera hasta que se confirme la conexión
mientras (WiFi.estado! = WL_CONNECTED) {
retraso(500);
Impresión.de serie(“.”);
}

// Depuración: genera la dirección IP del ESP8266
Serial.println(“WiFi conectado”);
Serial.print(“Dirección IP: “);
Serial.println(WiFi.localIP);

//Conéctate al corredor MQTT
if (cliente.connect(ID de cliente, nombre de usuario mqtt, contraseña_mqtt)) {
Serial.println(“¡Conectado al Broker MQTT!”);
}
otro {
Serial.println(“Error al conectarse al Broker MQTT…”);
}
}

configuración vacía {
Serie.begin(9600);
dht.comenzar;
}

bucle vacío {
conectar_MQTT;
Serie.setTimeout(2000);

float h = dht.readHumidity;
float t = dht.readTemperature;

Serial.print(“Humedad: “);
Serie.print(h);
Serial.println(”%”);
Serial.print(“Temperatura: “);
Impresión.serie
Serie.println(”*C”);

// MQTT sólo puede transmitir cadenas
String hs=”Hum: “+String((float)h)+” % “;
String ts=”Temp: “+String((float)t)+”C “;

// PUBLICAR en Broker MQTT (tema = Temperatura)
if (cliente.publish(temperatura_topic, Cadena
Serial.println(“¡Temperatura enviada!”);
}
otro {
Serial.println(“Error al enviar la temperatura. Reconectando al Broker MQTT e intentando nuevamente”);
client.connect(ID de cliente, mqtt_nombre de usuario, mqtt_contraseña);

retraso(10); // Este retraso garantiza que client.publish no entre en conflicto con la llamada client.connect
client.publish(tema_temperatura, Cadena
}

// PUBLICAR en MQTT Broker (tema = Humedad)
if (cliente.publish(humidity_topic, String(h).c_str )) {
Serial.println(“¡Humedad enviada!”);
}
otro {
Serial.println(“Error al enviar humedad. Reconectando al Broker MQTT e intentando nuevamente”);
client.connect(ID de cliente, mqtt_nombre de usuario, mqtt_contraseña);
retraso(10); // Este retraso garantiza que client.publish no entre en conflicto con la llamada client.connect

client.publish(humidity_topic, String(h).c_str);
}
cliente.desconectar; // desconectarse del broker MQTT
retraso(1000*60); //imprime nuevos valores después de 1 minuto
}

Cómo funciona el editor MQTT basado en ESP
ESP32 está configurado como un editor MQTT. Para trabajar con DHT11/DHT22, primero se debe importar DHT.h. La biblioteca PubSubClient.h también se importa para configurar ESP32 como cliente MQTT. La biblioteca fue escrita por Nick O'Leary. Se puede instalar en el IDE de Arduino navegando a Herramientas->Administrar bibliotecas y buscando PubSubClient.

Observación:

  • La biblioteca debe instalarse antes de importarla al boceto. Se debe importar WiFi.h para conectar el ESP32/ESP8266 a la red WiFi.
  • El pin de salida de DHT11 se conecta al pin D04.
  • Se crea una instancia del objeto DHT con DHTTYPE para DHT11 y DHTPIN para 4.
  • El SSID y la contraseña de WiFi se almacenan en las variables SSID y wifi_password. Asegúrese de reemplazar “SSID” y “CONTRASEÑA” con el SSID y la clave de red WiFi de su propia red WiFi.
  • Las variables se declaran para almacenar la IP del servidor MQTT, los nombres de los temas, el nombre de usuario y la contraseña de MQTT y el ID del cliente.
  • La dirección IP del corredor MQTT es la misma que la dirección IP de Raspberry Pi en la red.

La dirección IP de Raspberry Pi se puede obtener ejecutando el siguiente comando en la terminal:

nombre de host -I

La primera cadena que se obtiene al ejecutar el comando anterior es la dirección IPv4, que debe usarse en el boceto. Reemplace la IP del servidor MQTT (“192.168.*.*”) con la dirección IP de su propia Raspberry Pi.

Se crea una instancia de un objeto WiFiClient y se utiliza para crear una instancia del objeto de cliente MQTT. La función connect_MQTT está definida para conectarse a la red WiFi y al broker MQTT.

En la función de configuración, la velocidad en baudios para grabar información en el monitor serie del IDE de Arduino se establece en 9600 y el DHT se inicializa llamando al método DHT.begin.

En la función de bucle, los valores de temperatura y humedad del DH11 se recuperan llamando a los métodos dht.readHumidity y dht.readTemperature. Los valores recuperados se empaquetan como cadenas y se pasan como mensajes a los temas MQTT de 'humedad' y 'temperatura' respectivamente llamando al método client.publish.

Por último, el cliente se desconecta llamando al método client.disconnect. Se proporciona un retraso de un minuto.

Configurar el suscriptor MQTT en RPi
Instale la biblioteca paho-mqtt para configurar el cliente MQTT en Raspberry Pi. Ejecute el siguiente comando en la terminal para instalar esta biblioteca:

sudo pip instalar paho-mqtt

Abra Thonny IDE y copie el siguiente código en el editor:

importar paho.mqtt.client como mqtt

MQTT_ADDRESS = '192.168.*.*'
MQTT_USER = 'neo'
MQTT_PASSWORD = 'eglabs'
MQTT_TOPIC_TEMP = 'Temperatura'
MQTT_TOPIC_HUMD = 'Humedad'

def on_connect(cliente, datos de usuario, banderas, rc):
print('Conectado con el código de resultado ' + str(rc))
cliente.suscribir(MQTT_TOPIC_TEMP)
cliente.suscribir(MQTT_TOPIC_HUMD)

def on_message(cliente, datos de usuario, mensaje):
print(msg.topic + ' ' + str(msg.payload))

definición principal:
mqtt_client = mqtt.Cliente
mqtt_client.nombredeusuario_pw_set(MQTT_USER, MQTT_PASSWORD)
mqtt_client.on_connect=on_connect
mqtt_client.on_message=on_message

mqtt_client.connect(MQTT_ADDRESS, 1883)
mqtt_client.loop_forever

si __nombre__ == '__principal__':
print('Puente MQTT para InfluxDB')
principal

Guarde el script como RPI-Sub.py y ejecútelo.

Cómo funciona el suscriptor MQTT
El suscriptor MQTT en RPi se ejecuta con la ayuda de un script de Python. El script importa la biblioteca paho.mqtt.client. Las variables se declaran para almacenar la dirección IP del agente MQTT (que es la misma que la dirección IP de RPi), el nombre de usuario de MQTT, la contraseña de MQTT y los temas de MQTT.

El cliente se suscribe a dos temas, "temperatura" y "humedad", cuando se conecta con el corredor. Para hacer esto, la función on_connect se define y se llama en el bucle principal. Los mensajes publicados desde el editor MQTT basado en ESP se imprimen en la consola llamando a la función on_message definida por el usuario.

En el bucle principal, el cliente MQTT se inicia llamando al método mqtt.Client. El nombre de usuario y la contraseña de MQTT se configuran llamando al método mqtt_client.username_pw_set. El cliente se conecta al intermediario llamando al método mqtt_client.connect y entra en un bucle infinito llamando al método mqtt_client.loop_forever.

Al conectarse al broker MQTT, se llama a la función on_connect definida por el usuario, suscribiéndose a los temas respectivos. Al recibir mensajes del editor basado en ESP, se llama a la función on_message definida por el usuario, que imprime los mensajes en la consola.

Resultados

Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.