Publicación de datos de temperatura DS18B20 desde M-Duino PLC vía MQTT

Cómo leer el sensor Dallas DS18B20 con M-Duino PLC y publicar los datos en un broker MQTT por Ethernet
15 de junio de 2026 por
Publicación de datos de temperatura DS18B20 desde M-Duino PLC vía MQTT
Boot & Work Corp. S.L, Bernat Brunet Pedra

Esta es la parte 1 de una serie que muestra cómo construir un pipeline de datos desde un M-Duino PLC de Industrial Shields hasta una hoja de cálculo de Google usando MQTT y Node-RED. En esta primera parte, el M-Duino lee la temperatura de un sensor Dallas DS18B20 y publica los valores en un broker MQTT Mosquitto por Ethernet. Las partes 2 y 3 cubren el almacenamiento de los datos en Google Sheets y su visualización en un dashboard de Node-RED.

Qué necesitas

Instalación del broker MQTT Mosquitto

Instala Mosquitto en la máquina Linux que actuará como broker:

$ sudo apt-get install mosquitto mosquitto-clients

Inicia el broker y verifica que esté en funcionamiento:

$ sudo service mosquitto start
$ sudo service mosquitto status

Mosquitto es un broker MQTT ligero y de código abierto que funciona en cualquier dispositivo Linux, incluida una Raspberry Pi.

Conexión del sensor DS18B20

Conecta el DS18B20 al Pin 2 del M-Duino PLC. Consulta el post sobre el sensor de temperatura Dallas para el diagrama de cableado completo:

Cableado del DS18B20 con M-Duino PLC

Sketch del M-Duino: lectura y publicación de temperatura

El sketch lee la temperatura del sensor DS18B20 en el Pin 2 cada 400 ms y publica el valor como objeto JSON en el topic MQTT "I". Utiliza las librerías OneWire, DallasTemperature, PubSubClient y ArduinoJson (v5).

Antes de subir el sketch, configura la dirección IP del M-Duino y la IP del broker para que coincidan con tu red. Después de subirlo, establece la IP del puerto Ethernet de tu PC en 10.10.12.2 (o ajusta el código para que coincida con tu red).

#include <OneWire.h>
#include <DallasTemperature.h>
const int oneWirePin = 2;
OneWire oneWireBus(oneWirePin);
DallasTemperature sensor(&oneWireBus);

#ifdef MDUINO_PLUS
#include <Ethernet2.h>
#else
#include <Ethernet.h>
#endif

#include <ArduinoJson.h>   // API v5
#include <PubSubClient.h>

#define MQTT_ID "demo"
#define NUM_ZONES 1
#define NUM_DIGITAL_INPUTS_PER_ZONE 7
#define DIGITAL_INPUTS_OFFSET 0

const int digitalInputs[NUM_ZONES][NUM_DIGITAL_INPUTS_PER_ZONE] = {
  {I0_0, I0_1, I0_2, I0_3, I0_4, I0_5}
};

byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xAE };
IPAddress ip(10, 10, 12, 2);
IPAddress broker(10, 10, 12, 1);
unsigned port = 1883;

EthernetClient client;
PubSubClient mqtt(client);
int digitalInputsValues[NUM_ZONES][NUM_DIGITAL_INPUTS_PER_ZONE];

void setup() {
  Serial.begin(9600);
  sensor.begin();
  Ethernet.begin(mac, ip);
  mqtt.setServer(broker, port);
  for (int i = 0; i < NUM_ZONES; ++i)
    for (int j = 0; j < NUM_DIGITAL_INPUTS_PER_ZONE; ++j)
      digitalInputsValues[i][j] = digitalRead(digitalInputs[i][j]);
}

void loop() {
  if (!mqtt.connected()) {
    Serial.println("Not connected to mqtt");
    reconnect();
  } else {
    Serial.println("Connected to mqtt");
    mqtt.loop();
  }
  updateInputs();
}

void updateInputs() {
  for (int i = 0; i < NUM_ZONES; ++i)
    for (int j = 0; j < NUM_DIGITAL_INPUTS_PER_ZONE; ++j)
      updateDigitalInput(i, j);
}

void updateDigitalInput(int zone, int index) {
  if (digitalInputs[zone][index] == oneWirePin) {
    sensor.requestTemperatures();
    float value = sensor.getTempCByIndex(0);
    Serial.println(value);
    publishInput(zone, index + DIGITAL_INPUTS_OFFSET, value);
    delay(400);
  }
}

void reconnect() {
  if (mqtt.connect(MQTT_ID)) {
    mqtt.subscribe("I");
    Serial.println("Subscribed to I");
  } else {
    Serial.println("Closing mqtt");
    client.stop();
  }
}

void publishInput(int zone, int index, float value) {
  DynamicJsonBuffer json(JSON_OBJECT_SIZE(3));  // ArduinoJson v5
  JsonObject &root = json.createObject();
  if (root.success()) {
    root["zone"]  = zone;
    root["index"] = index;
    root["value"] = value;
    publish("I", root);
  }
}

void publish(const char *topic, JsonObject &root) {
  unsigned len = root.measureLength();
  if (len > 0) {
    char *payload = new char[len + 1];
    if (payload) {
      root.printTo(payload, len + 1);
      publish(topic, payload);
      delete[] payload;
    }
  }
}

void publish(const char *topic, const char *payload) {
  if (mqtt.connected()) mqtt.publish(topic, payload);
}

Nota: este sketch usa la API de ArduinoJson v5. Si tienes instalada la versión 6 o posterior, la API de JsonBuffer y JsonObject ha cambiado. Fija ArduinoJson en la versión 5.x en el Gestor de Librerías si es necesario.

Verificar la conexión MQTT

Con el M-Duino conectado al broker por Ethernet, abre un terminal en la máquina del broker y susíbete al topic "I":

$ mosquitto_sub -h 10.10.12.1 -t I

Las lecturas de temperatura publicadas por el M-Duino aparecerán en formato JSON cada 400 ms. Una vez que esto funcione, estás listo para la parte 2 de la serie, que almacena los datos en una hoja de cálculo de Google usando Node-RED.

Parte 2: almacenar datos en Google Sheets con Node-RED y MQTT

Buscar en nuestro blog

Publicación de datos de temperatura DS18B20 desde M-Duino PLC vía MQTT
Boot & Work Corp. S.L, Bernat Brunet Pedra 15 de junio de 2026
Compartir esta publicación
Etiquetas

¿Estás buscando tu Controlador Lógico Programable ideal?

Echa un vistazo a esta comparativa de producto de varios controladores industriales basados en Arduino.

Comparamos entradas, salidas, comunicaciones y otras especificaciones con las de los equipos de otras marcas destacadas.

Comparativa de PLCs