Como integrar Arduino com uma aplicação web usando websockets com nodejs

{lang: 'pt-BR'}

O projeto mede a distância a partir de um sensor ultrassônico e exibe o resultado deste sinal em uma página web, com dados atualizados em tempo real.

Montando o circuito

Você precisará de:

  • Arduino UNO
  • Protoboard
  • Sensor de distância ultrassônico
  • led
  • resistência (estou usando de 1k ohm)

Ligue os componentes de acordo com o esquema baixo:

model_bb

Código sketch do Arduino

O meu código obtém o dado do sensor de distância ultrassônico e envia pela porta serial (porta USB). Se a distância for menor que 30cm, um led acende.

#define TRIG_PIN 6
#define ECHO_PIN 5
#define LED 2

void setup() {
  Serial.begin(9600);
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  pinMode(LED, OUTPUT);
}

float readDistance(){
 int duration;
 digitalWrite(TRIG_PIN, HIGH);
 delayMicroseconds(1000);
 digitalWrite(TRIG_PIN, LOW);
 int duration = pulseIn(ECHO_PIN, HIGH);
 float distance = (duration / 2) / 29.1; 
 return distance;
}

void loop() {
  float distance = readDistance();

  if (distance < 30){
    digitalWrite(LED, HIGH);
  } else {
    digitalWrite(LED, LOW);
  }
  Serial.println(distance);
  delay(200);
}

Código em node.js

Inicie seu projeto node e instale as seguintes dependências:

  • express
  • serial
  • ws
npm install express --save-dev
npm install serialport --save-dev
npm install ws --save-dev

Crie uma aplicação node app.js iniciando o framework express, a porta serial e o websocket.

Iniciando o express e o websocket:

var express = require('express');
var http = require("http")
var app = express();
app.use(express.static(__dirname + "/"))

var server = http.createServer(app)
server.listen(5000, function(){
    console.log('App running on port 3000!');
})

Iniciando o websocket

var WebSocketServer = require("ws").Server
var wss = new WebSocketServer({server: server})

Iniciando a leitura da porta serial. O endereço da porta serial será um parâmetro do comando inicialização do servidor node:

var serialport = require("serialport");
var SerialPort = serialport.SerialPort;
var port = process.argv[2];
var serialport = new SerialPort(port, {
  baudrate: 9600,
  parser: serialport.parsers.readline("\n")
});

Juntando o sinal que chega pela porta serial com as mensagens de broadcast enviadas via websocket:

serialport.on('data', function(data){
    var value = ""
    for (p in data) value += data[p];
    wss.clients.forEach(function each(ws) {
      ws.send(JSON.stringify(value), function() {  })
    });
});

Código HTML/JavaScript

Configuramos nosso servidor node com express para servir qualquer arquivo estático que esteja no mesmo diretório do projeto. Você pode configurar o express para servir uma rota específica, se preferir. Leia mais em http://expressjs.com/.
Nossa página html utiliza o componente de barra de progresso do Bootstrap.

     
     
     
     

Distância

O seu código javascript deverá iniciar uma conexão com o websocket e alterar a barra de progresso a medida que cada novo valor é recebido:

Para iniciar seu projeto, rode o seguinte comando informando sua porta serial (no meu caso, /dev/cu.usbmodemfa131):

node app.js /dev/cu.usbmodemfa131

Acesse o seu browser no endereço http://localhost:5000/
sc

Você pode ver todo o código deste projeto em https://github.com/werneckpaiva/arduino-websocket. Espero que tenha ajudado.

{lang: 'pt-BR'}