Node-RED Laboratorios: Firmata, Serial e Ethernet
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
.
Dashboard
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
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}]
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":"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"}]
Projeto: NodeRED interagindo com Arduíno e ESP8266 através HTTP GET/POST
Construir uma aplicação com NodeRED para, através de uma dashboard, monitorar sensores e controlar dispositivos conectados em um Arduíno e em um ESP8266.
- Arduíno
- O NodeRED solicitar atualização da medida do sensor de temperatura e comandar dois leds através de botões na dashboard.
- NodeRED (cliente) envia requisição HTTP com método GET ao Arduíno (servidor) rodando aplicação WebServer.
- ESP8266
- O ESP8266 deve monitorar dois sensores e atualizar periodicamente a dashboard no NodeRED com os valores medidos.
- O NodeRED (servidor) recebe requisição HTTP com método POST enviada pelo ESP8266 que realiza a leitura dos sensores.
Utilizar como base os seguintes exemplos:
- Arduíno: Exemplo da biblioteca Ethernet/WebServer;
- ESP8266: Exemplo ESP8266 HTTP GET and POST.
Referências
Referências
Evandro.cantu (discussão) 18h10min de 25 de novembro de 2021 (-03)