Node-RED: Arduino a DS18B20

Zápisník experimentátora

Hierarchy: Node.js

Node-RED umí pracovat se sériovým portem. V tomto článku si na sériový port připojíme Arduino a senzor teploty DS18B20. Arduino bude výsledky měření odesílat přes sériový port a Node-RED je bude parsovat do podoby, která umožňuje snadnější zpracování. Tok v Node-RED bude přizpůsoben tak, aby věděl zpracovat údaje z více senzorů teploty DS18B20.

Seznam součástek

Budete potřebovat tyto součástky.

  • Arduino {linkArduino}
  • Breadboard {linkBreadboard}
  • DS18B20 {linkDS18B20}

Arduino

Pomocí Arduina čteme aktuální teplotu ze senzoru DS18B20. Příklad možného zapojení na breadboardu je na následujícím obrázku. Je tam Arduino Pro Mini a dva senzory DS18B20, připojené v parazitických režimu. Pokud by vám parazitický režim nefungoval, protože jste si senzory koupili od čínských prodejců, zapojte ho normálně.

Schéma zapojení je na následujícím obrázku. Parazitický režim napájení odlišuje pouze v zapojení pinu Vdd. V parazitických režimu napájení je Vdd připojené na GND.

Zdrojový text programu je jednoduchý. Pro každý senzor se vypíše jeden řádek. V řádku je vypsána jedinečná adresa senzoru a aktuální teplota. Jedinečnou adresu vypisujeme na sériový port proto, abychom měli k dispozici jedinečný identifikátor senzoru. Následně můžeme k tomuto identifikátoru v Node-RED přiřazovat pojmenování a transformovat výsledky do podoby, která je více vhodná pro lidi. V takové podobě jsme současně získali univerzální program, který je schopen zpracovat libovolné množství senzorů.

#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);
}

Výstup z programu na sériový port vypadá takto. Já jsem v příkladu použil dva senzory. Každé dvě vteřiny se vypíší dva nové řádky s výsledky. Pokud namísto Serial monitoru připojíme na sériový port Node-RED, budeme moci výsledky z Arduina dále zpracovat.

Node-RED

Abychom mohli v Node-RED používat sériový port, musíte mít nainstalované doplňující uzly z balíčku node-red-node-serialport. Instalaci naleznete popsanou v článku Node-RED: Instalace. Vytvoříme si jednoduchý tok, který bude mít tři uzly.

  • input/serial - Tento uzel čte jednotlivé řádky, které zasílá Arduino. Uzel je připojen na sériový port.
  • function/function - Tento uzel provádí transformaci vstupních údajů. Konvertuje řádek textu, který nám poslalo Arduino na objekt, který má dva parametry.
  • output/debug - Tento uzel slouží k vypisování ladicích údajů na debug konzoli.

Node-RED sériový port - vstup

Uzel, který je připojen na sériový port, se musí zkonfigurovat. Na obrázku vidíte uzel, který je připojen na port COM6 rychlostí 9600 baudů. Tato rychlost musí být stejná, jako je nastaveno v programu pro Arduino.

Nastavení sériového portu má mnoho parametrů. Je třeba správně nastavit parametr Split input on the character \n. To zajišťuje čtení zaslaného textu z Arduina po řádcích.

Konverze údajů

Na konverzi dat použijeme následující funkci. Je uzavřena v try-catch bloku, protože potřebujeme ošetřit i stav, že na sériový port se připojí další Arduino, které neobsahuje náš program. Tehdy může být na sériový port posílán libovolný výstup, který se neshoduje s naším předpokladem. V takovém případě vznikne výjimka, která neohrozí běh našeho programu.

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;

Debug konzola

Takto vypadá výsledný výstup na konzolu. Vidíte, že po konverzi dat máme k dispozici objekt s dvěma parametry. Debug konzolu používáme pouze pro demonstrační účely. V reálném příkladu by nyní mohlo následovat odeslání údajů do databáze, nebo odeslání na HTTP nebo MQTT server.

  • id - Identifikační číslo senzoru DS18B20.
  • value - Aktuální teplota.

Zdrojový kód

Zdrojový kód se nachází na serveru GitHub.


23.05.2019


Menu