Wind Direction and Fine Dust Measurement Data Logger

by Rememberu in Circuits > Arduino

134 Views, 1 Favorites, 0 Comments

Wind Direction and Fine Dust Measurement Data Logger

KakaoTalk_Photo_2023-04-12-15-53-09.jpeg

안녕하세요. 저희가 만든 미세먼지 측정기를 소개하고자 합니다. 우리 지역은 미세먼지가 매우 나쁜 지역입니다. 그래서 미세먼지 차단숲을 조성하고 있습니다. 미세먼지 차단숲의 효과를 검증하고자 장치를 제작하였습니다.

Hello. We would like to introduce the fine dust measuring instrument we made. Our city is the region with very bad fine dust. So our city office are making a fine dust blocking forest. We created a device to verify the effectiveness of fine dust blocking forests.

측정장치 구상하기(Design a Device)

KakaoTalk_Photo_2023-04-12-15-48-28.jpeg
스크린샷 2023-09-12 13.43.34.png

미세먼지 차단 숲의 효과를 위해 측정할 요소들을 정하였다.

  1. 미세먼지(PM10, PM2.5) --------> Grove-Dust Sensor(아두이노용)
  2. 기온 ----------------------------------> BMP180, DHT22
  3. 습도 ----------------------------------> DHT22
  4. 기압 ----------------------------------> BMP180
  5. 바람의 방향 -------------------------> GY-271 가속도 센서
  6. 바람의 속도 -------------------------> 저전력 모터
  7. 시간 기록 ----------------------------> RTC 확장보드

기반이 되는 보드는 아두이노 우노로 정하였습니다.

물품 준비하기(Prepare Supplies)

UB 바람개비LED풍력발전기만들기손잡이형A형
20230912_133137.jpg
20230912_133122.jpg
20230309_153253.jpg
20230912_133116.jpg
20230912_133128.jpg
20230912_133203.jpg
20230912_133224.jpg
IMG_0809.JPG

바람의 속도를 측정하기 위한 장비의 가격이 비싸 '풍력발전기 kit'를 해킹하여 프로펠러, 저전력 모터를 이용하여 풍속계를 만들었다.

바람의 발전량을 아날로그 A0핀으로 값을 받아, 실재 풍속계와 비교하여 계산식을 만들었고, A0*3.6/180과 같았다.

풍향계의 움직임과 안정적인 전원, 데이터 케이블 사용을 위해 아두이노 슬립링 6가닥 외경 22mm 모델을 사용하였다.(2가닥은 풍속계의 GND, 출력값/ 4가닥은 가속도센서의 VCC, GND, SDA, SCL)

압력계는 BMP180, 미세먼지 측정기는 아두이노에서 자주 쓰이는 seeed studio 사의 Grove - Dust Sensor를 사용하였습니다.

SD카드 데이터로거는 RTC모듈을 탑재하고 있는 elecrow사의 RTC Data Logger V1.1 실드를 사용하였습니다.

코딩하기(Make Code(feat. Arduino))

#include <Wire.h>

#include <TimeLib.h>

#include <DS1307RTC.h>

#include <SPI.h>

#include <SD.h>

#include <Adafruit_Sensor.h>

#include <Adafruit_BMP085.h>

#include <QMC5883LCompass.h>

QMC5883LCompass compass;


#define BMP_SDA 4

#define BMP_SCL 5

Adafruit_BMP085 bmp;


const int chipSelect = 10;


int pin = 8;

unsigned long duration;

unsigned long starttime;

unsigned long sampletime_ms = 30000;//sampe 30s ;

unsigned long lowpulseoccupancy = 0;

float ratio = 0;

float concentration = 0;

float ugm3 = 0;


void setup() {

Serial.begin(9600);

while (!Serial) ;

delay(200);

Serial.println("DS1307RTC Read Test");

Serial.println("-------------------");


Serial.print("Initializing SD card...");


// see if the card is present and can be initialized:

if (!SD.begin(chipSelect)) {

Serial.println("Card failed, or not present");

// don't do anything more:

while (1);

}

Serial.println("card initialized.");


pinMode(pin,INPUT);

starttime = millis(); //get the current time;


pinMode(A0,INPUT);


compass.init();


Wire.begin();

if (!bmp.begin()) {

Serial.println("BMP085 sensor not found");

while (1) {}

}

}


void loop() {

File dataFile = SD.open("log4.txt", FILE_WRITE);


tmElements_t tm;

if (RTC.read(tm)) {

print2digits(tm.Hour);

print2digits(tm.Minute);

print2digits(tm.Second);

Serial.print(",");

}


float x = analogRead(A0)*3.6/180;


compass.read();

byte a = compass.getAzimuth();

char myArray[3];

compass.getDirection(myArray, a);


duration = pulseIn(pin, LOW);

lowpulseoccupancy = lowpulseoccupancy+duration;


if ((millis()-starttime) > sampletime_ms)//if the sampel time == 30s

{

ratio = lowpulseoccupancy/(sampletime_ms*10.0); // Integer percentage 0=>100

concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62; // using spec sheet curve

ugm3 = concentration*100/13000;

lowpulseoccupancy = 0;

starttime = millis();

}


if (dataFile) {

dataFile.print(tm.Hour);

dataFile.print(':');

dataFile.print(tm.Minute);

dataFile.print(':');

dataFile.print(tm.Second);

dataFile.print(',');

dataFile.print(tm.Day);

dataFile.print('/');

dataFile.print(tm.Month);

dataFile.print(',');

dataFile.print(bmp.readTemperature());

dataFile.print(',');

dataFile.print(bmp.readPressure());

dataFile.print(',');

dataFile.print(myArray[0]);dataFile.print(myArray[1]);dataFile.print(myArray[2]);

dataFile.print(',');

dataFile.print(x); //dataFile.print("m/s");

dataFile.print(',');

dataFile.println(ugm3); //dataFile.println("pm1");

dataFile.close();


Serial.print(tm.Hour);

Serial.print(':');

Serial.print(tm.Minute);

Serial.print(':');

Serial.print(tm.Second);

Serial.print(',');

Serial.print(tm.Day);

Serial.print('/');

Serial.print(tm.Month);

Serial.print(',');

Serial.print(bmp.readTemperature());

Serial.print(',');

Serial.print(bmp.readPressure());

Serial.print(',');

Serial.print(myArray[0]);Serial.print(myArray[1]);Serial.print(myArray[2]);

Serial.print(',');

Serial.print(x); Serial.print("m/s");

Serial.print(',');

Serial.print(concentration);

Serial.print(',');

Serial.print(ugm3); Serial.println("pm1");

}

else {

Serial.println("Error opening data file!");

}


delay(10000); // 10초 기다림

}


void print2digits(int number) {

if (number >= 0 && number < 10) {

Serial.write('0');

}

Serial.print(number);

}


조립하기(Assemble)

IMG_0809.JPG
스크린샷 2023-09-12 13.43.34.png

GND, A4, A5 핀은 빵판을 이용하여 병렬연결하여 사용하였다.

3V3: BMP180의 Vin

5V: 가속도센서의 VCC

GND: BMP180의 GND, 미세먼지센서의 GND, 가속도센서의 GND

GND: 풍속계(+)_빨간색

Vin: 미세먼지센서의 VCC


A0: 풍속계(-)_검정색

A4(I2C/SDA): 가속도센서의 SDA_초록색, BMP180의 SDA

A5(I2C/SCL): 가속도센서의 SCL_노란색, BMP180의 SCL


D8: 미세먼지센서의 데이터핀


*배치도에 있는 DHT22는 전력문제로 일단 제외함.


테스트(Test)

20230510_154110.jpg
20230705_164633.jpg
IMG_0313.JPG

실내 테스트 5회(1차: 6월, 2차: 6월 9일, 4차: 6월 22일, 5차: 7월 12일, 6차: 7월 13일)

실외 테스트 1회(3차: 6월 15일)

기기별 오차값 보정, 평균값 적용

설치 및 결과(설치 및 결과)

&lrm;GLOBE_미세먼지탐구.&lrm;001.jpeg
20230720_161710.jpg
20230720_163107.jpg
20230720_155820.jpg
20230705_173300.jpg
20230705_170227.jpg
&lrm;230907_미세먼지토크쇼.&lrm;026.jpeg

평택시 세교산업단지 주위에 설치되어 있는 미세먼지 차단숲의 효과를 검증하기 위해서 측정기기 4기를 설치하였습니다.

7월 21일 7~9시 사이에 측정기기간에 눈에 띠는 변화를 확인하여 미세먼지 차단숲의 효과를 확인할 수 있습니다.

*배터리팩: AA*6개를 사용하였으나, 기복이 있음. 18650*3개를 이용하여 재측정.