Zápisník experimentátora
Hierarchy: Node.js
Node-RED can work with serial port. In this article, we will connect the Arduino and the DS18B20 temperature sensor to the serial port. Arduino will send the measurement results through the serial port, and Node-RED will parse them to make it easier to process. The Node-RED flow will be adapted to process data from multiple DS18B20 temperature sensors.
You will need these parts.
Using Arduino, we read the current temperature from the DS18B20 sensor. An example of a possible breadboard connection is shown in the following figure. There's Arduino Pro Mini and two DS18B20 sensors connected in parasitic mode. If the parasitic mode doesn't work because you bought the sensors from Chinese vendors, plug it in normally.
The wiring diagram is shown in the following figure. The parasitic power mode only differs in the Vdd
pin connection. In parasitic power mode, Vdd is connected to GND.
The source code of the program is simple. One line is printed for each sensor. A unique sensor address and the current temperature are listed in the row. We print a unique address on the serial port to have a unique sensor identifier available. Subsequently, we can assign a name to this Node-RED identifier and transform the results into a more human-friendly form. At the same time, we have acquired a universal program that can handle any number of sensors.
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
/*
The setup function. We only start the sensors here
*/
void setup(void)
{
// start serial port
Serial.begin(9600);
// Start up the library
sensors.begin();
sensors.setResolution(12);
}
/*
Main function, get and show the temperature
*/
void loop(void)
{
int numberOfDevices = sensors.getDeviceCount();
if (numberOfDevices > 0) {
sensors.requestTemperatures();
for (int i = 0; i < numberOfDevices; i++) {
DeviceAddress tempDeviceAddress;
sensors.getAddress(tempDeviceAddress, i);
for (uint8_t i = 0; i < 8; i++) {
if (tempDeviceAddress[i] < 16) Serial.print("0");
Serial.print(tempDeviceAddress[i], HEX);
}
Serial.print(";");
float t = sensors.getTempCByIndex(0);
Serial.println(t);
}
}
delay(2000);
}
The output from the program to the serial port looks like this. I used two sensors in the example. Two new result lines are listed every two seconds. If we connect Node-RED to the serial port instead of a Serial monitor, we will be able to further process the results from the Arduino.
To use a serial port in Node-RED, you must have additional nodes installed from the node-red-node-serialport package. For installation, see Node-RED: Installation. We will create a simple flow that will have three nodes.
The node that is connected to the serial port must be configured. The figure shows the node that is connected to COM6 at 9600 baud. This speed must be the same as set in the Arduino program.
Serial port settings have many parameters. It is necessary to set the parameter Split input on the character \n
. This ensures reading of the sent text from Arduino by lines.
We will use the following function to convert data. It is closed in a try-catch
block because we need to handle the fact that another Arduino that does not contain our program will connect to the serial port. At that time, any output can be sent to the serial port, which does not match our assumption. In that case, there is an exception that does not compromise the running of our program.
try {
let p = msg.payload;
p = p.replace('\r\n', '');
p = p.split(';');
msg.payload = {
id: p[0],
value: parseFloat(p[1])
};
} catch(e) {
node.error(e);
}
return msg;
This is how the resulting output looks to the console. You see that after data conversion we have an object with two parameters available. We only use the Debug Console for demonstration purposes. In a real example, you could now send data to a database, or send it to an HTTP or MQTT server.
The source code is located on GitHub.
23.05.2019