라즈베리파이와 아두이노 온/습도 실시간 모니터링

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

Posted by 최일규 on 2017. 12. 15

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

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

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

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

구글링 하면 레퍼런스는 워낙 많고 다양하지만, 저는 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

 

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