Node-RED: Arduino a DS18B20

Zápisník experimentátora

Hierarchy: Node.js

Node-RED vie pracovať so sériovým portom. V tomto článku si na sériový port pripojíme Arduino a senzor teploty DS18B20. Arduino bude výsledky merania odosielať cez sériový port a Node-RED ich bude parsovať do podoby, ktorá umožňuje ľahšie spracovanie. Tok v Node-RED bude prispôsobený tak, aby vedel spracovať údaje z viacerých senzorov teploty DS18B20.

Zoznam súčiastok

Budete potrebovať tieto súčiastky.

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

Arduino

Pomocou Arduina čítame aktuálnu teplotu zo senzora DS18B20. Príklad možného zapojenia na breadboarde je na nasledovnom obrázku. Je tam Arduino Pro Mini a dva senzory DS18B20, pripojené v parazitickom režime. Ak by vám parazitický režim nefungoval, pretože ste si senzory kúpili od čínskych predajcov, zapojte ho normálne.

Schéma zapojenia je na nasledujúcom obrázku. Parazitický režim napájania sa odlišuje iba v zapojení pinu Vdd. V parazitickom režime napájania je Vdd pripojené na GND.

Zdrojový text programu je jednoduchý. Pre každý senzor sa vypíše jeden riadok. V riadku je vypísaná jedinečná adresa senzora a aktuálna teplota. Jedinečnú adresu vypisujeme na sériový port preto, aby sme mali k dispozícii jedinečný identifikátor senzora. Následne môžeme k tomuto identifikátoru v Node-RED priraďovať pomenovanie a transformovať výsledky do podoby, ktorá je viac vhodná pre ľudí. V takejto podobe sme súčasne získali univerzálny program, ktorý je schopný spracovať ľubovoľné množstvo senzorov.

#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 vyzerá takto. Ja som v príklade použil dva senzory. Každé dve sekundy sa vypíšu dva nové riadky s výsledkami. Ak namiesto Serial monitora pripojíme na sériový port Node-RED, budeme môcť výsledky z Arduina ďalej spracovať.

Node-RED

Aby sme mohli v Node-RED používať sériový port, musíte mať nainštalované doplňujúce uzly z balíčka node-red-node-serialport. Inštaláciu nájdete popísanú v článku Node-RED: Inštalácia. Vytvoríme si jednoduchý tok, ktorý bude mať tri uzly.

  • input/serial - Tento uzol číta jednotlivé riadky, ktoré zasiela Arduino. Uzol je pripojený na sériový port.
  • function/function - Tento uzol vykonáva transformáciu vstupných údajov. Konvertuje riadok textu, ktorý nám poslalo Arduino na objekt, ktorý má dva parametre.
  • output/debug - Tento uzol slúži na vypisovanie ladiacich údajov na debug konzolu.

Node-RED sériový port - vstup

Uzol, ktorý je pripojený na sériový port sa musí skonfigurovať. Na obrázku vidíte uzol, ktorý je pripojený na port COM6 rýchlosťou 9600 baudov. Táto rýchlosť musí byť rovnaká, ako je nastavené v programe pre Arduino.

Nastavenie sériového portu má veľa parametrov. Je potrebné správne nastaviť parameter Split input on the character \n. To zabezpečuje čítanie zaslaného textu z Arduina po riadkoch.

Konverzia údajov

Na konverziu údajov použijeme nasledovnú funkciu. Je uzatvorená v try-catch bloku, pretože potrebujeme ošetriť aj stav, že na sériový port sa pripojí iné Arduino, ktoré neobsahuje náš program. Vtedy môže byť na sériový port posielaný ľubovoĺný výstup, ktorý sa nezhoduje s našim predpokladom. V takom prípade vznikne výnimka, ktorá neohrozí beh nášho 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 vyzerá výsledný výstup na konzolu. Vidíte, že po konverzii údajov máme k dispozícii objekt s dvomi parametrami. Debug konzolu používame iba na demonštračné účely. V reálnom príklade by teraz mohlo nasledovať odoslanie údajov do databázy, alebo odoslanie na HTTP alebo MQTT server.

  • id - Identifikačné číslo senzora DS18B20.
  • value - Aktuálna teplota.

Zdrojový kód

Zdrojový kód sa nachádza na serveri GitHub.


06.04.2019


Menu