라즈베리파이와 아두이노 시리얼 통신 그리고 웹소켓으로 실시간 대시보드 구현

온습도 센서를 실시간 웹으로 모니터링이 가능하도록 구현해 보았습니다.

아키텍처는 다음과 같습니다.

온습도센서 -> 아두이노 -> 시리얼포트 -> 라즈베리파이 -> 웹소켓 -> 웹 대시보드

구글링 하면 레퍼런스는 워낙 많고 다양하지만, 저는 DHT11 온습도 센서의 라이브러리를 아두이노 스케치 프로그램에 추가하신 후

파일 - 예제에서 DHT11 샘플코드를 로딩해서 활용했습니다.

#include <DHT11.h>

int pin=4;

DHT11 dht11(pin);

void setup()

{

Serial.begin(9600);

while (!Serial) {

; // wait for serial port to connect. Needed for Leonardo only

}

}

void loop()

{

int err;

float temp, humi;

if((err=dht11.read(humi, temp))==0)

{

Serial.print("temperature:");

Serial.print(temp, 1);

Serial.print(",humidity:");

Serial.print(humi, 1);

Serial.println();

}

else

{

Serial.println();

Serial.print("Error No :");

Serial.print(err);

Serial.println();

}

delay(3000); //delay for reread

}

아래 화면은 아두이노에서 맥북으로 온,습도가 3초단위로 전송되는 화면입니다.

수신부는 Node.js로 구현되었구요.

중요한 부분은 serialport 라이브러리를 사용하여, 한줄씩 읽기위해 다음과 같이 Readline객체를 이용합니다.

var SerialPort = require('serialport');

var port = new SerialPort('/dev/ttyACM0', {

baudRate: 9600

});

var Readline = SerialPort.parsers.Readline;

var parser = new Readline();

port.pipe(parser);

port.on('open', function() {

console.log('Serial port OPEN');

parser.on('data', function(data) {

console.log('data=' +data);

var splitReadline = data.split(',');

var temp = splitReadline[0].split(':')[1];

var hum = splitReadline[1].split(':')[1];

io.sockets.emit('chat message', {

temp: temp,

hum: hum,

clientCount: clientCount

});

io.sockets.emit('chart_data', {

x: (new Date()).getTime(),

y: parseFloat(temp)

});

});

});

라즈베리파이에서는 다양한 언어인 Python, C, Node.js, Java, C# 등으로

개발할 수 있지만, 저는 익숙한 언어인 Node.js를 선택했습니다.

Node.js는 Express라는 경량 웹 프레임워크와 웹소켓을 쉽게 다룰수 있어 최적으로 생각되었기 때문인데요

참고자료)

https://github.com/netcrazy/socket-io-server

https://brainy-bits.com/blogs/tutorials/dht11-tutorial

다음 목표는 원격에서 조명을 제어하는 과제로 연구해 봐야겠네요.