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
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.
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.
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.
Referências
Referências
Root (discussão) 16h05min de 23 de novembro de 2021 (-03)