아두이노프로세싱 프로그래밍

미세먼지 측정 엘렉트로닉스 회로 배선과 아두이노 코딩

coding art 2018. 5. 2. 18:49
728x90

이 한권의 책으로 아두이노 엘렉트로닉스 코딩에서 시작하여 와이파이 코딩을 넘어 흥미로운 앱인벤터 코딩으로 넘어가보자. 특별한 컴퓨터 과학의 지식이 없어도 누구든지 코딩의 세계로 초대 받을 수 있습니다. 교보문고에서 판매 중입니다.


__________________________________________________________________________________________________________________________________

본문시작



2016년 미국 NASA 의 환경팀이 미세먼지 측정을 위한 전용 비행기를 몰고 와 측정한 결과 우리나라 미세 먼지의 50% 이상이 중국발이며 반면에 국내에서 생성된 부분이 무려 40% 안팎 북한쪽에서 유입되는 오염이 10% 로 보고 되었다. 핵문제 말고도 오히려 미세먼지로 인해 환경 때문에 심각성을 느껴야 할 때다.
 

아두이노 미세먼지 측정기 제작 준비물







위 재료에 더하여 빵판과 센서 배선을 연결하여 커넥터 핀으로 만들 점퍼선 6개가 추가로 필요하다. 상품에서 제공하는 6색 컬러 피복선 끝이 직접 빵판이나 아두이노 핀에 꽂을 수 없는 구조이므로 정상적인 점퍼선을 잘라서 납땜을 하고 절연테이프로 처리를 해야 한다. 이 작업에 성패가 달려있다고 해도 과안이 아니다. Sharp 사의 이 미세먼지 센서의 인터넷 저가 가격은 8000원선임을 참고하자.


Wiring Diagram
아래의 배선도를 참고하면서 미세먼지 측정기를 제작해 보자. 비록 미세먼지 센서로부터 나오는 커넥터 배선이 6줄에 불과하지만 아두이노 초보자 입장에서 와이어 하네스를 어떻게 처리할 것인지 보통 문제는 아니다. 앞서도 강조했지만 6줄 배선 끝을 정상적인 점퍼선을 잘라 납땜 작업을 실시하여 절연테이프 처리를 한 후 길이가 좀 길다고 여겨지면 둥글게 말든지 해서 적당한 배선 거리를 유지해야 한다.





아두이노 코딩은 대단히 간단하지만 와이어하네스 팩키징이 다소 힘들기는 하지만 그것이 바로 아두이노 재미의 일부로 볼 수 있다. 아두이노에서는 언제든지 약간의 점퍼선 작업이 수반됨을 명심하자.


아래 배선 사진은 미세먼지 센서 후방 빵판상에 설치한 150 저항과 220 uF 콘덴서와 점퍼선 배선이다. 단 센서 뒷면이 검은색이라 아두이노 GND 로 가는 검은색 점퍼선이 실제로 있지만 보이지 않는 상태이다. 아울러 흰색 배선은 센서로부터 직접 아두이노 디지털 핀 2번에 점퍼선으로 연결하였다. 블로그 첫 번째 배선 사진을 참조하기 바란다.



미세먼지 센서 측정을 위한 아래의 아두이노 코딩을 참조하자. 코드 내용 중에 // 처리한 부분이 많이 있는데 그 내용은 각자 코드를 뜯어보면서 공부해 보도록 하자.
중요한 점은 초음파 센서에서 처럼 디지털 핀 2번을 통해 펄스 신호를 보내면 미세먼지 센서 내부에서 레이저성 다이오드 빛을 통과하는 미세먼지에 발사하고 스캐터링된 즉 흩어진 레이저 광을 포토다이오드가 수신하여 출력하는 구조이다.

국내외 인터넷 사이트를 검색하면 샤프사의 미세먼지 센서 GP2Y1010AU0F에 관한 스펙 및 배선도에 관한 정보를 충분히 얻을 수 있다.

코드를 컴파일 업로딩하고 시리얼 모니터를 켜서 다음과 같은 결과를 확인하자.





시리얼 모니터 확인이 끝났으면 모니터를 완전히 끄고 시리얼 플로터를 켜 보도록 하자.

미세먼지나 연기 소스가 없는 깨끗한 상태에서 미세먼지 값 50∼60 이하상태이며 미세먼지 센서 입구 가까이에 연기소스가 있을 경우 600∼700 정도로 출력이 급격히 상승한다.





일반적으로 실내가 클린한 안정 상태에서도 시리얼 플로터 데이터를 보면 공기와 먼지의 터뷸런스 성격때문인지 데이터가 요동을 친다.

이점에 관해서는 센서 자체가 민감하거나 노이즈를 잘타는 특성을 감안 소프트웨어 로우패스필터를 별도로 코딩하여 시험해 보기로 한다.


PM_sensor_01
 

/*
 Standalone Sketch to use with a Arduino UNO and a
 Sharp Optical Dust Sensor GP2Y1010AU0F
*/
 
int measurePin = 0; //Connect dust sensor to Arduino A0 pin
int ledPower = 2;   //Connect 3 led driver pins of dust sensor to Arduino D2
 
int samplingTime = 280;
int deltaTime = 40;
int sleepTime = 9680;

float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;
float average_dustDensity = 0;


void setup(){
  Serial.begin(9600);
  pinMode(ledPower,OUTPUT);// 미세먼지 센서 내부 LED
}
 
void loop() {
  average_dustDensity = particleSensing();
//  Serial.print("average_dustDensity = ");
//  Serial.print("P");
  Serial.println((int)average_dustDensity);
//  Serial.write((int)average_dustDensity);
 }

float particleSensing() {

  digitalWrite(ledPower,LOW); // power on the LED
  delayMicroseconds(samplingTime);
   voMeasured = analogRead(measurePin);
  delayMicroseconds(deltaTime);
  digitalWrite(ledPower,HIGH); // turn the LED off
  delayMicroseconds(sleepTime);
  
  // 0 - 5V mapped to 0 - 1023 integer values
  calcVoltage = voMeasured * (5.0 / 1024.0);
  if( calcVoltage > 0.6 ) {
  // linear eqn from http://www.howmuchsnow.com/arduino/airquality/
  dustDensity =1000.0*( 0.172 * calcVoltage - 0.1);
 
//  Serial.print("Digital Value(0-1023): ");
//  Serial.print(voMeasured);
 
//  Serial.print(" - V: ");
//  Serial.print(calcVoltage);
 
//  Serial.print(" - Density: ");
//  Serial.println(dustDensity); // unit: ug/m3
 
  delay(190);
  }
  return dustDensity;
}