아두이노와 Processing

ESP32 또는 우노보드에서 SPS30 I2C 인터페이스 미세먼지 농도 측정

coding art 2021. 3. 16. 16:07
728x90

2개의 pull-up 저항 10kΩ을 사용하여 다음과 깉이 배선하자. 측정 보드는 아두이노 우노 또는 esp32 보드 어느 것이든 무관하다.

빵판을 이용한 실제 배선 사례이다.

아두이노 우노보드 또는 esp32 보드에서 sps30 센서를 I2C 방식으로 인터페이스 하여 사용하려면 우선 먼저 SPS30 지원 라이브러리를 설치해야 한다. 스케치->라이브러리 포함하기->라이브러리 관리에서 SPS30 으로 검색하도록 하여 설치하도록 하자

 

 

라이브러리 설치 후 파일->예제->drndirion-sps->sps30 예제를 불러 빌드 후 실행시키자.

라이브러리 설치 후 파일->예제->drndirion-sps->sps30 예제를 불러 빌드 후 실행시키자. 업로딩이 거의 완료된 상태에서 잘못된 라이브러리 C://~” 와 같이 에러 메세지를 주고 있으나 실제 측정에는 아무 문제가 없음에 유의하자.

다음은 SPS30 미세먼지 센서에 의한 PM1.0 PM2.5, PM10 측정 결과이다.

PM의 측정 단위는 이다. 측정 단위는 질량농도 PM 과 입자수 농도 NM이 있다. PM2.50.3 미크론에서 2.5미크론 사이의 미세먼지를 뜻한다.

sps30 예제 코드는 전체 미세먼지 농도들을 측정하여 출력하지만 사용자 필요에 의해서 필요한 범위만의 미세먼지 농도만을 출력하도록 하자. 대표적으로 PM1.0, PM2.5, PM10 이 좋을 것이다.

미세먼지 농도 측정 결과를 Thingspeak에서 관찰하기 위해서는 sps30 예제에서 필요한 측정 부분만 남기고 다이어트 한 후 Thinspeak 코드를 살짝 곁드리면 된다. 다음의 사례를 참조하기 바란다.

 

//Thingspeak_simple_sps30

#include "ThingSpeak.h"

#include <WiFi.h>

#include <sps30.h>

 

char ssid[] = "droidan1234"; // your network SSID (name)

char pass[] = "dddddddddd"; // your network password

 

unsigned long myChannelNumber = 899023;

const char * myWriteAPIKey = "Y7RAJNWH7QRXV2UD";

unsigned long sampling_time =30000;

WiFiClient client;

 

void setup() {

int16_t ret;

uint8_t auto_clean_days = 4;

uint32_t auto_clean;

 

Serial.begin(9600);

delay(2000);

WiFi.mode(WIFI_STA);

ThingSpeak.begin(client); // Initialize ThingSpeak

 

sensirion_i2c_init();

 

while (sps30_probe() != 0) {

Serial.print("SPS sensor probing failed\n");

delay(500);

}

 

ret = sps30_set_fan_auto_cleaning_interval_days(auto_clean_days);

if (ret) {

Serial.print("error setting the auto-clean interval: ");

Serial.println(ret);

}

 

ret = sps30_start_measurement();

if (ret < 0) {

Serial.print("error starting measurement\n");

}

 

#ifndef PLOTTER_FORMAT

Serial.print(" PM measurements started\n");

#endif /* PLOTTER_FORMAT */

 

#ifdef SPS30_LIMITED_I2C_BUFFER_SIZE

Serial.print("Your Arduino hardware has a limitation that only\n");

Serial.print(" allows reading the mass concentrations. For more\n");

Serial.print(" information, please check\n");

Serial.print(" https://github.com/Sensirion/arduino-sps#esp8266-partial-legacy-support\n");

Serial.print("\n");

delay(2000);

#endif

 

delay(1000);

}

 

void loop() {

 

// Connect or reconnect to WiFi

if(WiFi.status() != WL_CONNECTED) {

Serial.print("Attempting to connect to SSID: ");

while(WiFi.status() != WL_CONNECTED){

WiFi.begin(ssid,pass);

Serial.print(".");

delay(5000);

}

Serial.println("\nConnected.");

}

 

struct sps30_measurement m;

char serial[SPS30_MAX_SERIAL_LEN];

uint16_t data_ready;

int16_t ret;

 

do {

ret = sps30_read_data_ready(&data_ready);

if (ret < 0) {

Serial.print("error reading data-ready flag: ");

Serial.println(ret);

} else if (!data_ready)

Serial.print("data not ready, no new measurement available\n");

else

break;

delay(100); /* retry in 100ms */

} while (1);

 

ret = sps30_read_measurement(&m);

if (ret < 0) {

Serial.print("error reading measurement\n");

} else {

 

//Serial.print("PM 1.0: ");

Serial.print(m.mc_1p0);

Serial.print(" ");

//Serial.print("PM 2.5: ");

Serial.print(m.mc_2p5);

Serial.print(" ");

//Serial.print("PM 10.0: ");

Serial.print(m.mc_10p0);

Serial.print(" ");

Serial.println();

}

ThingSpeak.setField(1, m.mc_1p0);

ThingSpeak.setField(2, m.mc_2p5);

ThingSpeak.setField(3, m.mc_10p0);

int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);

delay(sampling_time);

}