Node-RED Laboratorios: Firmata, Serial e Ethernet

De Wiki Cursos IFPR Foz
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegaçãoIr para pesquisar

Node-RED: Laboratórios com comunicação Firmata, Serial e Ethernet

Node-RED e Arduino com protocolo Firmata

Referência: [1]. Para interação com Arduíno utilizando o protocolo Firmata, o módulo correspondente deve ser instalado no Node-RED:

node-red-node-arduino

O Node-RED se comunica com o Arduíno através da serial USB utilizando o protocolo Firmata. Para tal a biblioteca Firmata deve ser instalada no Arduíno e deve ser carregado o sketch StandardFirmata.

Capacidades
O Arduíno suporta os seguintes modos de operação:
  • Entradas e saídas digitais: Valores 0 ou 1
  • Entradas analógicas: Valores 0 a 1023
  • Saídas PWM (analógicas): Valores 0 a 255
  • Saídas servo: 0 a 180

No Node-RED os nós arduino in e arduino out permitem interação com um Arduíno conectado a serial e rodando o sketch StandardFirmata.

arduino in
Permite selecionar entradas digitais ou analógicas. Os valores são lidos em msg.payload e o número do pino como msg.topic.
Quando uma entrada do Arduíno é modificada o Node-RED é imediatamente notificado.
  • Este processo funciona bem para as entradas digitais.
  • Para as entradas analógicas podem ser obtidos muitos valores, os quais devem ser manuseados. Por exemplo, pode-se usar um atraso para ajustar um tempo de amostragem e descartar valores intermediários. Outra opção é utilizar um nó rbe (Report by Exception node) e configurar para reportar mudanças somente a partir de um dado montante de variação.
arduino out
Permite selecionar saídas digitais, analógicas (PWM) ou tipo servo. Espera valores numéricos inteiros em msg.payload para transferir ao Arduíno.
Programação em blocos no Node-RED

Node-RED e Arduino com comunicação serial

Para interação serial com Arduíno o módulo correspondente deve ser instalado no Node-RED:

node-red-node-serialport-wildcard

Como exemplo foi utilizado um Arduino UNO ao qual foram acoplados um led para controle e um sensor de temperatura DHT22. A comunicação entre o Arduíno e o Node-RED é realizada via comunicação serial, com o Arduíno enviando periodicamente os dados de temperatura e umidade e esperando comandos para o led.

Código fonte Arduino

O código Arduino abaixo descreve o cenário da aplicação.

Código para DHT22 adaptado do exemplo [2].
/*         
 Comunicação com Arduino via serial com NodeRED 
 Transmite: Medida de temperatura e umidade (DHT22)
 Rebebe: Comandos para acionamento de led
*/

#include "DHT.h"
#define DHTPIN 2     // Digital pin connected to the DHT sensor
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);

const int ledPin = 13; // the pin that the LED is attached to
int incomingByte;      // a variable to read incoming serial data into

unsigned long lastMsg;

void setup() {
  Serial.begin(57600);
  pinMode(ledPin, OUTPUT);
  dht.begin();

}

void loop() {
  //Verifica se há dados chegando na porta serial para controle do led
  if (Serial.available() > 0) {
    incomingByte = Serial.read();
    if (incomingByte == 'H') {
      digitalWrite(ledPin, HIGH);
    }
    if (incomingByte == 'L') {
      digitalWrite(ledPin, LOW);
    }
  }
  //A cada 2s realiza leitura do sensor DHT22 e imprime dados na serial
  unsigned long now = millis();
  if (now - lastMsg > 2000) {
    lastMsg = now;
    //Lê sensor DHT22
    float h = dht.readHumidity();
    float t = dht.readTemperature();
    if (isnan(h) || isnan(t)) { //isnan (is not a number) retorna 1 se não for um número
      Serial.println(F("Failed to read from DHT sensor!"));
      return;
      }
    //Dados de umidade e temperatura são impressos separados por ","
    Serial.print(h);
    Serial.print(F(","));
    Serial.print(t);
    } 
}

Programação em Blocos no Node-RED

Os dados de umidade e temperatura recebidos pela entrada serial são separados na forma de vetor pelo nó split, convertidos para números pelo nó to number e separados em duas saídas pelo nó switch.

Os comandos para acionamento do led enviam pela serial os caracteres H ou L.

Código JSON

Este código pode ser utilizado para importar (import) no NodeRED.

[{"id":"fee37637.72233","type":"tab","label":"Arduino Serial","disabled":false,"info":""},{"id":"b97eb549.0db798","type":"serial in","z":"fee37637.72233","name":"Arduino","serial":"86e325ae.59b348","x":110,"y":180,"wires":[["2e5a2d9e.4453da"]]},{"id":"2e5a2d9e.4453da","type":"split","z":"fee37637.72233","name":"","splt":",","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":230,"y":180,"wires":[["2aa8df93.3ec588"]]},{"id":"2aa8df93.3ec588","type":"change","z":"fee37637.72233","name":"to number","rules":[{"t":"set","p":"payload","pt":"msg","to":"$number(msg.payload)\t","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":360,"y":180,"wires":[["db260146.9d974"]]},{"id":"db260146.9d974","type":"switch","z":"fee37637.72233","name":"","property":"parts.index","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"str"},{"t":"eq","v":"1","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":490,"y":180,"wires":[["c5f75e6a.a0479"],["63c6807d.fec12"]]},{"id":"c5f75e6a.a0479","type":"debug","z":"fee37637.72233","name":"Umidade","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","x":660,"y":140,"wires":[]},{"id":"63c6807d.fec12","type":"debug","z":"fee37637.72233","name":"Temperatura","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","x":670,"y":220,"wires":[]},{"id":"64cc4feb.1aeaf8","type":"inject","z":"fee37637.72233","name":"Arduino led:OFF","topic":"","payload":"L","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":140,"y":320,"wires":[["cfab411b.d58238"]]},{"id":"9ead2dbb.fc5f88","type":"inject","z":"fee37637.72233","name":"Arduino led:ON","topic":"","payload":"H","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":140,"y":380,"wires":[["cfab411b.d58238"]]},{"id":"cfab411b.d58238","type":"serial out","z":"fee37637.72233","name":"Arduino led","serial":"86e325ae.59b348","x":400,"y":360,"wires":[]},{"id":"86e325ae.59b348","type":"serial-port","z":"","serialport":"/dev/ttyACM0","serialbaud":"57600","databits":"8","parity":"none","stopbits":"1","waitfor":"","dtr":"none","rts":"none","cts":"none","dsr":"none","newline":"500","bin":"false","out":"interbyte","addchar":"","responsetimeout":"10000"}]

Node-RED e Arduino com comunicação Ethernet

O Node-RED pode interagir com um Arduíno com shield Ethernet utilizando funções que permitem trabalhar com protocolos da pilha TCP/IP, como o HTTP.

Como exemplo foi utilizado um Arduino UNO, rodando o exemplo WebServer da biblioteca Ethernet. Para ilustração foi utilizado um sensor de temperatura (LM35) conectado a uma entrada analógica do Arduíno.

A comunicação entre o Node-RED e o Arduíno é realizada através de uma requisição HTTP enviada periodicamente. Os dados recebidos de temperatura são mostrados na janela de Debug.

No fluxo de programa utilizado no Node-RED , além da requisição HTTP, é utilizado um nó do tipo html para extrair dados do código HTML recebido, no caso a temperatura medida no sensor. Como a mensagem com o valor da temperatura é um string, a mesma foi convertida para número com o nó change.

Código JSON

Este código pode ser utilizado para importar (import) no NodeRED.

[{"id":"e32a26c8.647428","type":"tab","label":"HTTP Request","disabled":false,"info":""},{"id":"65d95c5b.73b244","type":"inject","z":"e32a26c8.647428","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"5","crontab":"","once":false,"onceDelay":"5","topic":"","payload":"","payloadType":"str","x":90,"y":40,"wires":[["7caf9c00.2decc4"]]},{"id":"9a56605e.6d442","type":"debug","z":"e32a26c8.647428","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":550,"y":360,"wires":[]},{"id":"7caf9c00.2decc4","type":"http request","z":"e32a26c8.647428","name":"","method":"GET","ret":"txt","paytoqs":"ignore","url":"192.168.1.50","tls":"","persist":false,"proxy":"","authType":"","x":170,"y":120,"wires":[["f2d75c50.60cbb"]]},{"id":"f2d75c50.60cbb","type":"html","z":"e32a26c8.647428","name":"","property":"payload","outproperty":"payload","tag":"html","ret":"html","as":"multi","x":290,"y":180,"wires":[["51500381.9020bc"]]},{"id":"51500381.9020bc","type":"change","z":"e32a26c8.647428","name":"to number","rules":[{"t":"set","p":"payload","pt":"msg","to":"$number(msg.payload)","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":280,"wires":[["9a56605e.6d442","34aa0b43.eee4f4"]]},{"id":"34aa0b43.eee4f4","type":"ui_gauge","z":"e32a26c8.647428","name":"","group":"fd7f12fc.84992","order":0,"width":0,"height":0,"gtype":"gage","title":"Temperatura","label":"units","format":"{{value}}","min":0,"max":"100","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","className":"","x":470,"y":420,"wires":[]},{"id":"fd7f12fc.84992","type":"ui_group","name":"WebServer","tab":"44879675.6029a8","order":1,"disp":true,"width":"6","collapse":false,"className":""},{"id":"44879675.6029a8","type":"ui_tab","name":"Home","icon":"dashboard","disabled":false,"hidden":false}]

Dashboard para o Node-RED

O Node-RED também permite construir painéis de controle, ou dashboards, para monitorar e controlar aplicações de Internet das Coisas.

Para isto, deve ser instalado o módulo:

node-red-dashboard 

No exemplo foi utilizado o nó gauge (medidor) para mostrar a temperatura em um medidor com ponteiro.

Para acessar a dashboard, utilizar a URL:

localhost:1880/ui

Dashboard em aplicativo móvel

Além disto, o Node-RED também permite exportar a dashboard para um aplicativo rodando em um dispositivo móvel.

Para isto, deve ser instalado no Node-RED o módulo:

node-red-contrib-remote

No dispositivo móvel deve se instalado o aplicativo:

Remote-RED

Para exportar a dashboard ao dispositivo móvel deve-se utilizar o nó

remote access

para gerar o QR-code que deverá ser lido pelo aplicativo móvel.

Node-RED e comunicação servidor Web em ESP8266

O Node-RED pode interagir com um ESP8266 também utilizando funções que permitem trabalhar com protocolos da pilha TCP/IP, como o HTTP.

Neste exemplo foi utilizado um ESP8266, rodando o exemplo de WebServer que testamos anteriormente.

Neste exemplo, foi montado no Node-RED um fluxo e dashboard para interagir com o WebSerever rodando no ESP8266 sem nenhuma modificação.

Neste fluxo foram utilizadas várias requisições HTTP ao WebServer. Quando um dos botões for pressionado, primeiramente uma requisição HTTP é enviada para verificar o estado dos leds (aceso ou apagado). Se o led estiver apagado (por exemplo), uma nova requisição HTTP é enviada para acender o led. Por fim, uma outra requisição HTTP é enviada para atualizar o estado dos leds no Dashboard.

Para pesquisar no código HTML foi utilizado o nó html para pesquisar pela tag p, que encapsula informações mostradas na página, como o estado dos leds. Na sequência são utilizados nós switch para extrair o trecho de código que interessa acerca do estado dos leds.

Código JSON

Este código pode ser utilizado para importar (import) no NodeRED.

[{"id":"e96ac271.1067a","type":"tab","label":"ESP WebServer","disabled":false,"info":""},{"id":"aab8cf2d.6fcea","type":"http request","z":"e96ac271.1067a","name":"Led Off","method":"GET","ret":"txt","paytoqs":"ignore","url":"192.168.1.18/5/off","tls":"","persist":false,"proxy":"","authType":"","x":560,"y":200,"wires":[["1e89343d.a21dfc"]]},{"id":"851d1b06.c75948","type":"ui_button","z":"e96ac271.1067a","name":"","group":"fd7f12fc.84992","order":3,"width":0,"height":0,"passthru":false,"label":"button Led1","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":90,"y":40,"wires":[["fb212db3.7f709"]]},{"id":"ba6ed7e5.f62808","type":"switch","z":"e96ac271.1067a","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"GPIO 5 - State on","vt":"str"},{"t":"eq","v":"GPIO 5 - State off","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":410,"y":220,"wires":[["aab8cf2d.6fcea"],["34eec61b.83eb4a"]]},{"id":"34eec61b.83eb4a","type":"http request","z":"e96ac271.1067a","name":"Led On","method":"GET","ret":"txt","paytoqs":"ignore","url":"192.168.1.18/5/on","tls":"","persist":false,"proxy":"","authType":"","x":560,"y":240,"wires":[["1e89343d.a21dfc"]]},{"id":"fb212db3.7f709","type":"http request","z":"e96ac271.1067a","name":"","method":"GET","ret":"txt","paytoqs":"ignore","url":"192.168.1.18","tls":"","persist":false,"proxy":"","authType":"","x":170,"y":100,"wires":[["752f276b.235f68"]]},{"id":"3b422db0.6f43b2","type":"switch","z":"e96ac271.1067a","name":"","property":"parts.index","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":270,"y":220,"wires":[["ba6ed7e5.f62808"]]},{"id":"752f276b.235f68","type":"html","z":"e96ac271.1067a","name":"","property":"payload","outproperty":"payload","tag":"p","ret":"html","as":"multi","x":210,"y":160,"wires":[["3b422db0.6f43b2"]]},{"id":"ae727bc3.0f9498","type":"ui_button","z":"e96ac271.1067a","name":"","group":"fd7f12fc.84992","order":3,"width":0,"height":0,"passthru":false,"label":"button Led2","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":90,"y":320,"wires":[["e987cd28.ce07b"]]},{"id":"e987cd28.ce07b","type":"http request","z":"e96ac271.1067a","name":"","method":"GET","ret":"txt","paytoqs":"ignore","url":"192.168.1.18","tls":"","persist":false,"proxy":"","authType":"","x":170,"y":380,"wires":[["7a88bf73.f9ec1"]]},{"id":"2ab529a4.1d0806","type":"switch","z":"e96ac271.1067a","name":"","property":"parts.index","propertyType":"msg","rules":[{"t":"eq","v":"2","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":270,"y":500,"wires":[["bd92b9db.a07b58"]]},{"id":"7a88bf73.f9ec1","type":"html","z":"e96ac271.1067a","name":"","property":"payload","outproperty":"payload","tag":"p","ret":"html","as":"multi","x":210,"y":440,"wires":[["2ab529a4.1d0806"]]},{"id":"bd92b9db.a07b58","type":"switch","z":"e96ac271.1067a","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"GPIO 4 - State on","vt":"str"},{"t":"eq","v":"GPIO 4 - State off","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":410,"y":500,"wires":[["20260dcf.58ab72"],["2f37a565.d7879a"]]},{"id":"20260dcf.58ab72","type":"http request","z":"e96ac271.1067a","name":"Led Off","method":"GET","ret":"txt","paytoqs":"ignore","url":"192.168.1.18/4/off","tls":"","persist":false,"proxy":"","authType":"","x":560,"y":480,"wires":[["1e89343d.a21dfc"]]},{"id":"2f37a565.d7879a","type":"http request","z":"e96ac271.1067a","name":"Led On","method":"GET","ret":"txt","paytoqs":"ignore","url":"192.168.1.18/4/on","tls":"","persist":false,"proxy":"","authType":"","x":560,"y":520,"wires":[["1e89343d.a21dfc"]]},{"id":"1b83799b.4ca0c6","type":"inject","z":"e96ac271.1067a","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":"5","topic":"","payload":"","payloadType":"str","x":590,"y":360,"wires":[["1e89343d.a21dfc"]]},{"id":"1e89343d.a21dfc","type":"http request","z":"e96ac271.1067a","name":"","method":"GET","ret":"txt","paytoqs":"ignore","url":"192.168.1.18","tls":"","persist":false,"proxy":"","authType":"","x":790,"y":360,"wires":[["37d85f02.0de88"]]},{"id":"8c65e113.52f68","type":"debug","z":"e96ac271.1067a","name":"Led 2","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1090,"y":500,"wires":[]},{"id":"2210322.991dace","type":"debug","z":"e96ac271.1067a","name":"Led 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1090,"y":420,"wires":[]},{"id":"b157f07e.7552e","type":"switch","z":"e96ac271.1067a","name":"","property":"parts.index","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"str"},{"t":"eq","v":"2","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":890,"y":480,"wires":[["2210322.991dace","ddde2cdd.732df"],["8c65e113.52f68","6aa4c80c.efa0e8"]]},{"id":"ddde2cdd.732df","type":"ui_text","z":"e96ac271.1067a","group":"fd7f12fc.84992","order":1,"width":0,"height":0,"name":"","label":"Led 1","format":"{{msg.payload}}","layout":"row-center","className":"","x":1090,"y":460,"wires":[]},{"id":"6aa4c80c.efa0e8","type":"ui_text","z":"e96ac271.1067a","group":"fd7f12fc.84992","order":1,"width":0,"height":0,"name":"","label":"Led 2","format":"{{msg.payload}}","layout":"row-center","className":"","x":1090,"y":540,"wires":[]},{"id":"37d85f02.0de88","type":"html","z":"e96ac271.1067a","name":"","property":"payload","outproperty":"payload","tag":"p","ret":"html","as":"multi","x":830,"y":420,"wires":[["b157f07e.7552e"]]},{"id":"fd7f12fc.84992","type":"ui_group","name":"WebServer","tab":"44879675.6029a8","order":1,"disp":true,"width":"6","collapse":false,"className":""},{"id":"44879675.6029a8","type":"ui_tab","name":"Home","icon":"dashboard","disabled":false,"hidden":false}]

Node-RED e Firebase

O Node-RED pode interagir com a plataforma de computação em nuvem Firebase mantida pela Google. Para tal o módulo correspondente deve ser instalado no Node-RED:

node-red-contrib-firebase

Dados manuseados pelo Node-RED podem ser salvos no Firebase Realtime database, o qual implementa um banco de dados NoSQL que fornece as aplicações clientes atualizações em tempo real (“realtimeupdates) quando os dados mudam na base de dados. As operações básicas no banco de dados são:

  • set() - Salva dado em uma referência específica, substituindo o valor anterior.
  • push() - Adiciona dado em uma lista de valores.
  • once() - Lê dado de uma referência e acompanha qualquer mudança no mesmo.

O nó firebase modify permite modificar ou adicionar dados no banco de dados do Firebase.

Node-RED e OpenWheather

O Node-RED pode interagir com a plataforma em nuvem OpenWeather, a qual mantem dados meteorológicos históricos e atuais de diversas localidades do globo terrestre. Para tal o módulo correspondente deve ser instalado no Node-RED:

node-red-node-openweathermap

Assim, uma aplicação pode correlacionar dados medidos localmente por sensores meteorológicos com dados obtidos através desta plataforma.

Projeto: NodeRED interagindo com Arduíno ou ESP8266

Construir uma aplicação com NodeRED para, através de uma dashboard, monitorar sensores e controlar dispositivos conectados em um Arduíno e/ou um ESP8266.

O NodeRED solicitar atualização da medida de sensor de temperatura (ou outro) e comandar dois dispositivos conectados ao microcontrolador (como leds) através de botões na dashboard.

A troca de dados entre o NodeRED e os microcontroladores pode ser realizada pelo protocolo HTTP ou MQTT.

Utilizar recursos para armazenar os dados medidos na plataforma Firebase e também correlacionar com dados obtidos de outras fontes, como o OpenWeather.

Referências

Referências



Evandro.cantu (discussão) 18h10min de 25 de novembro de 2021 (-03)