아두이노 코딩-198: SPS30 센서 미세먼지 농도 측정

in #kr5 years ago (edited)

noname01.png

SENSIRION 사의 SPS30 센서를 사용하여 미세먼지 농도를 측정해보자. SENSIRION 사는 스위스의 센서 회사로서 환경 계측 분야의 정밀한 센서를 보급하고 있다.

noname02.png

하지만 아직까지는 아두이노 우노에서 SPS30 센서를 사용하여 미세먼지 농도를 측정하기 위해서 필요한 라이브러리를 인터넷 상에서 조달할 수 없는 상황이다. GITHUB에서 발견되는 라이브러리 소스파일을 다운로드 받아도 정작 확장자가 H 인 라이브러리 파일을 체크해 보면 비어 있는 상태로 확인된다. 따라서 제조사에서 제공하는 첨부된 ZIP 파일을 다운받아 압축을 해제하고 설치 후 아두이노 스케치 편집기에서 스케치 메뉴의 “라이브러리 포함하기”에서 2개의 폴더 즉 “i2C”와 “arduino-i2C-sps-master”를 등록하도록 한다.

압축된 라이브러리 파일은 필자의 다음 url 주소에서 다운받도록 한다.

http://blog.daum.net/ejleep1/718

SENSIRION 사에 의하면 SPS30센서를 사용하는 2종류의 방법을 제시하고 있다. 첫 번째 i2C 통신이며 다른 하나는 UART 통신이다. 여기서는 i2C 통신에 의한 측정 코드 arduino_sps30_example을 소개하기로 하자.

sps30 센서를 i2C 통신으로 인터페이스 하려면 아래와 같이 풀업 저항을 반드시 설치해야 한다.

noname03.png

다음은 풀업 저항을 빵판에 배치하여 배선한 사진이다. 배선 길이를 조정하여 보다 깔끔한 배선 작업이 요구된다.

noname04.png

미세먼지 측정을 위한 아두이노 코드를 살펴보자. 헤더 영역에 Sensirion 사가 지원하는 여러 종류의 라이브러리가 있음을 알 수 있다. 아울러 I2C,h 라이브러리가 있는데 일반적으로 아두이노에서 Wire.h를 사용하지만 sps30에서는 I2C.h 라리브러리를 설치하여야 한다.

noname05.png

첨부된 아두이노 코드를 컴파일 업로딩하여 미세먼지 농도를 측정해 보자.
아래 그래프는 실내에소 측정한 PM1.0 과 PM2.5 의 측정 결과를 시리얼 플로팅한 결과이다.
noname06.png


본 제품 사용에 관심이 있으신 분은 다음 주소로 연락해 보시길 바랍니다.
(주)티원세미콘(T1SEMICON) 서울특별시 구로구 대륭포스트타워 2차
본사 02-856-2300
매장 02-6083-9256


//arduino_sps30_example
#include <Arduino.h>
#include <sensirion_arch_config.h>
#include <sensirion_common.h>
#include <sensirion_i2c.h>
#include <sps30.h>
#include <sps_git_version.h>
#include <I2C.h>

void setup() {
//Serial.begin(115200);
Serial.begin(9600);
I2c.timeOut(50);
I2c.setSpeed(0);

  while (!Serial) {
  delay(100);
  Serial.println("fail");
}

}

void loop() {
struct sps30_measurement measurement;
s16 ret;

while (sps30_probe() != 0) {
    Serial.write("probe failed\n");
    delay(1000);
}

/* start measurement and wait for 10s to ensure the sensor has a
 * stable flow and possible remaining particles are cleaned out */
if (sps30_start_measurement() != 0) {
    Serial.write("error starting measurement\n");
}
delay(1000);

while (1) {
    delay(1000);
    ret = sps30_read_measurement(&measurement);

    if (ret < 0) {
      Serial.write("read measurement failed\n");
    } else {
        //Serial.write("PM 2.5: ");
        Serial.print(measurement.mc_2p5, DEC);
        Serial.print(" ");
        //Serial.write("PM 1.0: ");
        Serial.println(measurement.mc_1p0, DEC);
       
    }
}

sps30_stop_measurement();

}//끝

Sort:  

짱짱맨 호출에 응답하여 보팅하였습니다.

Coin Marketplace

STEEM 0.29
TRX 0.12
JST 0.032
BTC 63042.11
ETH 3047.49
USDT 1.00
SBD 3.91