라즈베리파이와 아두이노 시리얼 통신 그리고 웹소켓으로 실시간 대시보드 구현
온습도 센서를 실시간 웹으로 모니터링이 가능하도록 구현해 보았습니다.
아키텍처는 다음과 같습니다.
온습도센서 -> 아두이노 -> 시리얼포트 -> 라즈베리파이 -> 웹소켓 -> 웹 대시보드
구글링 하면 레퍼런스는 워낙 많고 다양하지만, 저는 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
다음 목표는 원격에서 조명을 제어하는 과제로 연구해 봐야겠네요.