아두이노 코딩-56: 미세먼지 측정 값 Processing 그래프 출력 비교

in #kr6 years ago (edited)

noname01.png

이미 스팀잇에서 두종류의 미세먼지 측정 루틴을 소개했다.
최근에 포스팅했던 다소 정교한 아두이노 미세먼지 측정기는 다음 블로그를 참조하기 바란다.

아두이노 코딩-32: 아두이노 PM 측정기로 공기청정기 대신 Red/Blue LED를 ON/OFF하자.
https://steemit.com/kr-arduino/@codingart/32-pm-red-blue-led-on-off

이 모델에서는 50개의 미세먼지 값을 지속적으로 샘플링 평균하고 아울러 Low Pass Filtering 처리하여 요동(fluctuation)이 심한 데이터를 부드럽게 변화하도록 처리하였다.

반면에 그 이전에 포스팅했던 초기의 아두이노 미세먼지 측정기는 측정한 그대로 처리한 결과 시리얼 플로터로 관찰해 보아도 미세먼지 데이터 본연의 요동(fluctuation) 현상을 그대로 볼 수 있다.

아두이노 코딩-27: 미세먼지 측정 엘렉트로닉스 회로 배선과 아두이노 코딩
https://steemit.com/kr/@codingart/27

이 두 모델은 단지 소프트웨어만 차이가 있으므로 최종적으로 완성된 하나의 아두이노 미세먼지 측정기에서 번갈아 가면서 각 소프트웨어 모델별로 실행이 가능하다.

이번 포스팅에서는 두 모델에서 결과를 Serial.println((int)average_dustDensity) 할 것이 아니라 Serial.write((int)average_dustDensity) 처리하여 바이트 데이터를 PC의 Processing 코드로 보내어 그래프 처리해서 관찰해 보자.

Processing 그래프 처리는 첨부된 코드를 참조하기 바란다.
헤더 영역에서 processing.serial.* 에 의해 시리얼 인터페이스 라이브러리를 설정하고 Serial 클라스 myPort 를 선언하자.

noname02.png

변수 xPos 는 그래프의 x 축이며 yPos 는 y축을 나타내기로 한다.
setup()에서 시리얼 인터페이스를 정확하게 설정한다. 아울러 stroke() 와 line() 명령을 사용하여 미세 먼지 값 50과 30에 해당하는 보조 선을 긋는다. 단지 관찰을 위한 보조선이며 제대로 그래프를 그리려면 Processing 의 텍스트 처리 명령과 라인 명령을 학습하여 응용하자.

setup()에서 시리얼 인터페이스가 제대로 설정되면 이에 대응하여 serialEvent() 루틴을 설정하여 입력 버퍼에 들어오는 데이터를 myPort.read() 명령을 사용하여 읽어 정수형 변수 inByte에 저장하자. 이 serialEvent() 루틴은 코드 다른 부분에서 별도로 호출하지 않아도 되는 특수 루틴으로 데이터가 입력 버퍼에 들어오는 경우 알아서 처리한다. 시리얼 인터페이스 할 경우 흔히 쓰는 루틴이다.

noname03.png

한편 inByte 로 읽은 미세 먼지 값은 HEIGHT 즉 size(500,200) 명령에서 200을 뜻하는 내부 명령어이다. WIDTH 도 마찬가지로 500을 뜻한다. 따라서 만약에 inByte 값이 30 이라면 Processing 그래픽 화면에서 HEIGHT-inByte = 200 – 30 = 170 이 된다.

현재 그래프 x 축 사이즈가 500까지 이므로 500 이 되면 화면을 지우고 x =0에서 다시 시작하도록 한다. 다음 좌표계 그림을 참조하자.

noname04.png

다음의 동영상은 아무런 처리를 하지 않은 요동이 심한 미세먼지 측정 데이터이다.

다음의 동영상은 50개 평균 및 Low Pass Filtering 처리하여 요동이 없는 미세먼지 측정 데이터이다.

//PM_monitoring_01

import processing.serial.*;
Serial myPort;

// Graphic setting
float xPos = 0; // horizontal position of the graph
float yPos = 400; // vertical position of the graph

void setup() {
size(500, 200);
background(#081640);

println("Available serial ports:");
println(Serial.list());

//myPort = new Serial(this, "COM3", 9600);
myPort = new Serial(this, Serial.list()[2], 9600);
stroke(255);
line(0, 150, 500, 150);
stroke(200);
line(0, 170, 500, 170);
}

void serialEvent (Serial myPort) {
// get the byte:
int inByte = myPort.read();
println(inByte);
yPos = height - inByte;

}

void draw() {
// draw the line in a pretty color:
stroke(#A8D9A7);
line(xPos, height, xPos, yPos);
//int dxPos = 2 * xPos;
//line(dxPos, height, dxPos, yPos);
// at the edge of the screen, go back to the beginning:
if (xPos >= width) {
xPos = 0;
// clear the screen by resetting the background:
background(#081640);
stroke(255);
line(0, 150, 500, 150);
stroke(200);
line(0, 170, 500, 170);
} else {
// increment the horizontal position for the next reading:
xPos++;
}
// delay(1000);
}//End of Processing program

Sort:  

잘읽고 갑니다 즐거운 하루되세요🤗

pairplay 가 kr-dev 컨텐츠를 응원합니다! :)

Coin Marketplace

STEEM 0.30
TRX 0.12
JST 0.033
BTC 64513.89
ETH 3155.04
USDT 1.00
SBD 4.00