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
- M-Duino PLC (con Ethernet)
- Fuente de alimentación
- Sensor de temperatura Dallas DS18B20
- PC o servidor con Linux (para el broker Mosquitto)
- Cable Ethernet que conecte el M-Duino y el PC a la misma red
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

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